Alfabeto bandiera marittima ICS


14

L'alfabeto con bandiera del Codice internazionale dei segnali viene utilizzato dalle navi per le comunicazioni, in particolare per i segnali statici.

La tua sfida è scrivere un programma o una funzione che prenderà una stringa da STDIN o come argomento e visualizzerà il testo corrispondente nell'alfabeto della bandiera ICS. Se la tua lingua non viene visualizzata sullo schermo, il salvataggio in un file è accettabile.

Il programma o la funzione deve supportare le lettere AZ in maiuscolo e minuscolo, più Space e Newline . Il comportamento con altri personaggi non è definito.

Il display deve essere sufficientemente grande da essere in grado di visualizzare almeno 8 flag in orizzontale e 6 flag in verticale. Il comportamento non è definito se il bordo destro viene raggiunto prima di ricevere una nuova riga o se il messaggio è troppo lungo per adattarsi al display verticalmente.

L'alfabeto bandiera è come mostrato di seguito (le lettere romane sono solo di riferimento, non sono richieste nell'output.)

inserisci qui la descrizione dell'immagine

Dimensioni

Non esiste uno standard universalmente concordato per le dimensioni di queste bandiere, quindi ai fini di questa sfida si applica quanto segue:

Le bandiere devono essere di 60x60 pixel, con uno spazio di 30 pixel tra loro sia in orizzontale che in verticale.

La coda di rondine tagliata su A e B deve avere una profondità di 15 pixel.

Tutte le altre linee devono essere orizzontali, verticali o a 45 gradi.

Le caratteristiche devono essere posizionate dividendo la bandiera in una griglia NxN immaginaria di lati 3,4,5 o 6 quadrati. Fare riferimento all'immagine sopra, ma per ulteriori chiarimenti:

A, E, H, K, L e U si basano su una griglia 2x2: la larghezza di ciascuna zona di colore deve essere di 30 pixel. Anche i punti del diamante in F devono essere a metà strada lungo ciascun lato della bandiera.

J e T sono basati su una griglia 3x3: ogni banda deve essere di 20 pixel.

P, N e S sono basati su una griglia 4x4. Anche le linee diagonali di Y devono dividere i bordi della bandiera in 4.

C, D, R e X devono basarsi su una griglia 5x5. Le bande e i bracci delle croci devono avere una larghezza di 12 pixel.

G, W, M, V sono basati su una griglia 6x6. Le bande di G e i bordi di W devono avere una larghezza di 10 pixel. I bracci delle croci su M e V devono coprire il primo e l'ultimo 10 pixel di ciascun bordo della bandiera, lasciando zone triangolari che misurano 40 pixel lungo il bordo lungo.

Il cerchio di I sarà al centro della bandiera e avrà un diametro di 30 pixel.

È consentito un errore di +/- 1 pixel dal testo sopra. Se la tua lingua supporta solo grafica scalabile, puoi interpretare "pixel" come "unità".

Colori

I colori devono essere rosso, bianco, blu, giallo e nero come definito dalla tua lingua o dalla sua documentazione. Se la tua lingua non definisce i colori, puoi utilizzare quanto segue: Rosso FF0000, Bianco FFFFFF, Blu 0000FF, Giallo FFFF00, Nero 0000000.

Lo sfondo deve essere grigio (i canali r, g e b sono uguali, tra il 25% e il 75% di intensità.)

Punteggio / scappatoie

Questo è codegolf. Vince il codice più breve in byte.

Le scappatoie standard non sono ammesse.

Non è possibile utilizzare funzioni incorporate o di libreria per la visualizzazione di flag. L'output deve essere non testuale (e in particolare, i caratteri unicode non devono essere usati per costruire la forma della bandiera.)

Esempio

JFK got
my VHS
PC
and XLR
web quiz

dovrebbe produrre quanto segue

inserisci qui la descrizione dell'immagine


Non sono del tutto sicuro di cosa intendi per " Il display deve essere abbastanza grande da visualizzare almeno 8 flag in orizzontale e 6 flag in verticale ", soprattutto perché il tuo caso di test mostra un output alto solo 5 flag. È solo che le risposte devono gestire i messaggi fino a quelle dimensioni e non sono necessarie per gestirne di più grandi, o intendi richiedere che tutte le righe debbano essere riempite con almeno 8 caratteri e tutti i messaggi con almeno 6 righe?
Peter Taylor,

1
@PeterTaylor Se il programma o la lingua sono abbastanza intelligenti da ridimensionare il display in base all'output, non è necessario impostare il display su 8x6 se l'output è più piccolo. L'output deve avere uno sfondo grigio ed essere rettangolare (tutte le linee riempite almeno alla lunghezza della linea più lunga.)
Level River St

Risposte:


15

CJam, 464 byte

Pensavi che CJam non avesse funzioni di manipolazione delle immagini? Bene, hai pensato bene! Ma non avrei lasciato che questo mi fermasse.

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[{XY+Z<[E8][9C]?XY<=}WWWW{XH<9F?}C{YC/[9FCF]=}{YC/3&9E?}{YH<9F?}{X29.5:R-zYR-z+H>FC?}{XA/1&9E?}{XH<FC?}{XR-_*YR-_*+F_*>E8?}{YK/(9F?}{XH<E9?}{XH<YH<^8E?}{XY+Z-A/XY-A/e&9F?}{XF/YF/^1&F9?}{XY<EC?}{XH-F/YH-F/|9F?}E{XHm6/YHm6/e&CE?}{XH-F/YH-F/|F9?}{XK/[CF9]=}{XH<YH<^FC?}{XY+Z-A/XY-A/e&FC?}{XR-zYR-ze>iA/[CF9]=}{XHm6/YHm6/e&F9?}{XY+F/1&CE?}]=:P~!!{60:Z{Z30:HYH-z-N*-{YV+_2$=XU+P2b1>4f*tt}fX}fY}*U90+:U;}/V90+:V;}/`"[]"-

Questo programma genera l'immagine nel modo migliore possibile da CJam: come testo che rappresenta l'immagine quando viene salvato come file PPM . Non provate nemmeno a eseguirlo con l'interprete online, a proposito; farai saltare la pila. Eseguirlo con l' interprete Java e reindirizzare l'output in un file con un comando simile java -jar cjam-0.6.4.jar flags.cjam > flags.ppm. Dopo aver fornito il tuo contributo, invia un EOF (potrebbe essere necessario essere subito dopo una nuova riga) con ctrl + D su Unix o ctrl + Z su Windows.

Campione

Se lo desideri davvero, posso provare a incollare da qualche parte l'origine dell'immagine originale di ~ 3 MB. Ma ecco il risultato aperto in GIMP e convertito in un PNG:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

Spiegazione

L'intestazione dell'immagine, facilmente identificabile nella fonte, è composta dal numero magico, larghezza, altezza e valore massimo del canale. Quindi l'output è un'immagine 690 * 690 (sufficiente per flag 8 * 8 60px con 30px di spaziatura tra loro) con ogni valore R, G e B compreso tra 0 e 4.

I dati dell'immagine sono inizializzati come un array 690 * 690 * 3 riempito con 3, rendendo l'intera immagine grigio chiaro. Quindi l'input viene letto, convertito in maiuscolo e diviso in righe. Le linee vengono elaborate in un ciclo, incrementando la coordinata Y del flag di 90 per ciascuna iterazione e in ciascuna riga, ogni carattere viene elaborato in un ciclo, incrementando la coordinata X del flag di 90 per ogni iterazione. Ora inizia la magia.

Ogni personaggio è mappato sulla funzione pixel di una bandiera che, quando viene chiamata, restituisce il colore del pixel nella posizione (X, Y) sulla bandiera. Qui è dove è andata gran parte del duro lavoro: descrivere concisamente 26 immagini come funzioni matematiche. Ognuna di queste funzioni restituisce un valore di colore compreso tra 8 e 15. Questo intervallo sfrutta il fatto che, quando convertito in base 2, l'array di bit risultante può essere interpretato come [1, R, G, B]. Il primo elemento può essere rimosso e il resto moltiplicato per 4 per dare facilmente un valore in pixel nel formato desiderato che copre tutti i possibili colori della bandiera (nonché verde, ciano e magenta). Funziona anche bene che ci siano variabili di un carattere inizializzate su 10-15, e poiché le variabili non hanno bisogno di uno spazio per separarle sintatticamente,

Una volta recuperata la funzione, è solo una questione di iterare su X e Y da 0 a 60, chiamare la funzione ad ogni passaggio e riscrivere il risultato nell'array di dati immagine. Un osservatore astuto potrebbe notare che i valori di colore restituiti da ciascuna funzione flag non consentono il grigio. Quindi c'è un po 'di logica in più per saltare gli spazi. Ma ci sono ancora i tagli di coda di rondine su "A" e "B". Quindi c'è anche un po 'di logica in più lì. Se il valore del carattere è inferiore a "C", viene impostato un valore in modo tale che il limite superiore sul ciclo X vari correttamente rispetto a Y e le aree di ritaglio non vengano mai disegnate.

Nel complesso, sono abbastanza contento di come è venuto fuori. Ci è voluto molto lavoro, ma è stato divertente. Alcune bandiere non corrispondono perfettamente all'immagine di riferimento, ma penso di avere tutte le forme entro 1px dal bersaglio (se ce ne sono di più, fammelo sapere e le sistemerò). E c'è sicuramente ancora un potenziale da ottimizzare, in quanto esiste una discreta ridondanza tra le 26 funzioni della bandiera.


Primo tentativo interessante, 559 byte

Anche se non l'ho mai finito, lo pubblicherò anche perché è piuttosto interessante. Invece di modellare ciascuna bandiera con una funzione di (X, Y) → colore, le bandiere vengono disegnate come una composizione di forme semplici. Ma ero preoccupato di dover scrivere una notevole quantità di codice di rendering per ogni forma diversa. Dopo molte riflessioni, mi sono reso conto che potevo renderle tutte, con qualche intelligente sovrapposizione e sovrapposizione, con una sola pseudo-forma: tutti i punti entro una determinata distanza di un punto specificato, dove la definizione di "distanza" è variabile. La distanza della scacchiera dà un quadrato, la distanza di Manhattan dà un diamante e la distanza euclidea dà un cerchio. Ciò significava che ogni forma aveva gli stessi cinque parametri (colore, modalità distanza, x, y,

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[[8EX30:Q0Q9X60:ZQQCXQZQ]LLLL[F9TTQQ]Ca[9FTQ42QCTQ54QFTQ66Q9TQ78Q][E9TIQI9T42QI][9FTQZQ][FCXQQQ][E9T40QQET50QQ9TZQQET70QQ9T80QQ][FCTZQQ][E8YQQF][9FTQAQ9TQ9~Q][E9TZQQ][8ETTTQETZZQ][F9XQTK9XZQK9XQZK9XTQK][F4{4{JW^1&6*9+TJ)F*W)F*F}fJ}fW][CEX0ZZ][9FTQQF]Ea[E[TZ]_m*{CT@~24}/][F9TQQF][9FTAQQCT9~QQ][FCTTTQCTZZQ]C9$1>9a/Fa*+[9FTQQKCTQQA]9 6$1>Ca/Fa*+[C7{7\-_1&2*C+X@TT@F*}/]]=_!!{([TQQQ]+\+}*5/{~:R;.5-:H;.5-:G;:M;2b1>4f*:O;Z{ZQWQ-z-N*-{JG-{zM_!+#}:P~WH-PM{+}{e>}?RP<{WV+_2$=JU+Ott}*}fJ}fW}/U90+:U;}/V90+:V;}/`"[]"-

1
Eccellente, questo è il tipo di risposta creativa che stavo cercando. Proverò ad eseguirlo più tardi.
Level River St

1
Questo è probabilmente il codice CJam più lungo che abbia mai visto. Bel lavoro però, +1.
Alex A.

Ancora una volta, CJam sembra salvare la giornata.
ASCIIThenANSI,

9
Sfortunatamente, è un reato federale pubblicare codice CJam più lungo di 200 byte. Devo prenderti in custodia.
Deusovi,

2

PHP, 811 byte

function f($s){echo"<body bgcolor=#ccc>";$z=split("\n",gzinflate(base64_decode("vVfNasMwDL7vKQK7xlT+iaHQ9LDTLnuIQus6ENhgxS19+kmO0yRrkhbqGIxtyV8sWbIkZ/Prjtm52p9suYbMHqqjPdHMVYfzx/elhBzyNbXtZoXQ7dvm+Q9+dieb7csvZFkJToNlEq6Zqeq6fAcw2arDqCKXUPMCEYQicIc1xmNfUkBDzXgQkpMQ3W0PEGF7fz49dT7IuSCQ1APJ5h9IKAIhdGn1jIHH6oUzvCpZzhtGjoDiePzuzAPJEkG1JPk1uw29G5rC7pxAvAFxuHqd+nQxpCP65S4gR6wzAkphE4rPHfbYaAueky59BrmrZ4wU0Ss8SES/pCNugMduiBSYs25oJTeBSYNMbHO6+bUg22PPhA8E5LCWhT3SFBjEwxaWiOMYD1+FtZSZxateEAZ7pvsEL7w1aQxD3HxLcmayfNA9ZeXzcdteJLm0H5ZITzAwolDkXeGwVAvlSzUOSDDkMRqRxDkuLquVecbKMRKFaESLSYOMg4b6qVHQMnkMns5jyZLBAnksRehirQWrwClEqakDNrqKpjqKpZ8K5rVYTFE56ZmCyT68KinJX+n/puFpyHXg4RRLwg1oW6YipqfimfJTt6/c6XIv6Tnc/HxNXIj+a9nORdwN5Qa3qzvGHw==")));while($c=ord(ucfirst($s))){$s=substr($s,1);echo$c<32?'<br>':($c^32?$z[$c-64]:$z[0]);}}

Il BLOB compresso contiene il codice SVG per ciascuna delle 26 flag. Un semplice ciclo quindi estrae ed emette l'immagine SVG corrispondente a ciascun carattere dell'input.

Esempio di output per "Questo è \nun test":

<body bgcolor=#ccc><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#fff /><path d=M30,0h30v60h-30z fill=#f00 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><br><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#00f /><path d=M45,30l15-30h-30v60h30z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v30h-60z fill=#00f /><path d=M0,30h60v30h-60z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg>

( Puoi provarlo su ideone , anche se non renderà la pagina per te.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.