Alphabet du drapeau maritime ICS

14

L'alphabet du drapeau du Code international de signaux est utilisé par les navires pour la communication, en particulier pour les signaux statiques.

Votre défi consiste à écrire un programme ou une fonction qui prendra une chaîne de STDIN ou comme argument, et affichera le texte correspondant dans l'alphabet indicateur ICS. Si votre langue ne s'affiche pas à l'écran, l'enregistrement dans un fichier est acceptable.

Votre programme ou fonction doit prendre en charge les lettres AZ en majuscules et minuscules, plus Espace et Nouvelle ligne . Le comportement avec d'autres personnages n'est pas défini.

L'affichage doit être suffisamment grand pour pouvoir afficher au moins 8 drapeaux horizontalement et 6 drapeaux verticalement. Le comportement n'est pas défini si le bord droit est atteint avant la réception d'une nouvelle ligne ou si le message est trop long pour s'adapter verticalement à l'affichage.

L'alphabet du drapeau est comme indiqué ci-dessous (les lettres romaines sont fournies à titre indicatif uniquement, elles ne sont pas requises dans la sortie.)

entrez la description de l'image ici

Dimensions

Il n'y a pas de norme universellement acceptée pour les dimensions de ces drapeaux, donc aux fins de ce défi, les règles suivantes s'appliquent:

Les drapeaux doivent mesurer 60 x 60 pixels, avec un espace de 30 pixels entre eux horizontalement et verticalement.

La coupe du machaon sur A et B doit avoir une profondeur de 15 pixels.

Toutes les autres lignes doivent être horizontales, verticales ou à 45 degrés.

Les caractéristiques doivent être localisées en divisant le drapeau en une grille NxN imaginaire de côtés 3,4,5 ou 6 carrés. Reportez-vous à l'image ci-dessus, mais pour plus de précisions:

A, E, H, K, L et U sont basés sur une grille 2x2: la largeur de chaque zone de couleur doit être de 30 pixels. De plus, les points du losange en F doivent être à mi-chemin de chaque côté du drapeau.

J et T sont basés sur une grille 3x3: chaque bande doit être de 20 pixels.

P, N et S sont basés sur une grille 4x4. De plus, les lignes diagonales de Y doivent diviser les bords du drapeau en 4.

C, D, R et X doivent être basés sur une grille 5x5. Les bandes et les bras de croix doivent avoir une largeur de 12 pixels.

G, W, M, V sont basés sur une grille 6x6. Les bandes de G et les bordures de W doivent avoir une largeur de 10 pixels. Les bras de croix sur M et V doivent couvrir les 10 premiers et derniers pixels de chaque bord du drapeau, laissant des zones triangulaires mesurant 40 pixels le long du bord long.

Le cercle de I sera au centre du drapeau et aura un diamètre de 30 pixels.

Une erreur de +/- 1 pixel dans le texte ci-dessus est autorisée. Si votre langue ne prend en charge que les graphiques évolutifs, vous pouvez interpréter «pixels» comme signifiant «unités».

Couleurs

Les couleurs doivent être rouge, blanc, bleu, jaune et noir selon la définition de votre langue ou de sa documentation. Si votre langue ne définit pas de couleurs, vous pouvez utiliser les éléments suivants: Rouge FF0000, Blanc FFFFFF, Bleu 0000FF, Jaune FFFF00, Noir 0000000.

Le fond doit être gris (canaux r, g et b égaux, entre 25% et 75% d'intensité.)

Notation / échappatoires

C'est du codegolf. Le code le plus court en octets gagne.

Les failles standard ne sont pas autorisées.

Aucune fonction intégrée ou bibliothèque pour afficher les drapeaux ne peut être utilisée. La sortie doit être non textuelle (et en particulier, les caractères unicode ne doivent pas être utilisés pour créer la forme du drapeau.)

Exemple

JFK got
my VHS
PC
and XLR
web quiz

devrait produire ce qui suit

entrez la description de l'image ici

Level River St
la source
Je ne suis pas tout à fait sûr de ce que vous entendez par « L'affichage doit être suffisamment grand pour afficher au moins 8 drapeaux horizontalement et 6 drapeaux verticalement », d'autant plus que votre scénario de test affiche une sortie qui ne mesure que 5 drapeaux. Est-ce juste que les réponses doivent gérer les messages jusqu'à ces dimensions et ne sont pas nécessaires pour gérer les plus grandes, ou avez-vous l'intention d'exiger que toutes les lignes soient remplies à au moins 8 caractères et tous les messages à au moins 6 lignes?
Peter Taylor
1
@PeterTaylor Si votre programme ou votre langue est suffisamment intelligent pour redimensionner l'affichage en fonction de la sortie, il n'est pas nécessaire d'ajuster l'affichage à 8x6 si la sortie est plus petite. La sortie doit avoir un arrière-plan gris et être rectangulaire (toutes les lignes sont remplies à au moins la longueur de la ligne la plus longue.)
Level River St

Réponses:

15

CJam, 464 octets

Vous pensiez que CJam n'avait pas de fonctions de manipulation d'image? Eh bien, vous avez bien pensé! Mais je n'allais pas laisser ça m'arrêter.

"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;}/`"[]"-

Ce programme produit l'image de la meilleure façon possible: CJam peut: sous forme de texte qui représente l'image lorsqu'elle est enregistrée en tant que fichier PPM . Soit dit en passant, n'essayez même pas de l'exécuter avec l'interpréteur en ligne; vous allez faire sauter la pile. Exécutez-le avec l' interpréteur Java et dirigez la sortie vers un fichier avec une commande commejava -jar cjam-0.6.4.jar flags.cjam > flags.ppm . Une fois que vous avez fourni votre entrée, envoyez un EOF (peut-être juste après une nouvelle ligne) avec ctrl + D sous Unix ou ctrl + Z sous Windows.

Échantillon

Si c'est vraiment souhaité, je peux essayer de coller quelque part la source d'image ~ 3 Mo d'origine. Mais voici le résultat ouvert dans GIMP et converti en PNG:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

Explication

L'en-tête de l'image, facilement identifiable dans la source, se compose du nombre magique, de la largeur, de la hauteur et de la valeur maximale du canal. La sortie est donc une image 690 * 690 (suffisante pour 8 * 8 drapeaux 60px avec 30px d'espacement entre eux) avec chaque valeur R, G et B allant de 0 à 4.

Les données d'image sont initialisées sous la forme d'un tableau 690 * 690 * 3 rempli de 3, ce qui rend l'ensemble de l'image gris clair. Ensuite, l'entrée est lue, convertie en majuscules et divisée en lignes. Les lignes sont traitées dans une boucle, incrémentant la coordonnée Y du drapeau de 90 à chaque itération, et dans chaque ligne, chaque caractère est traité dans une boucle, incrémentant la coordonnée X du drapeau de 90 à chaque itération. Maintenant, la magie commence.

Chaque caractère est mappé à la fonction pixel d'un drapeau qui, une fois appelé, renvoie la couleur du pixel à la position (X, Y) sur le drapeau. C'est là que la plupart du travail acharné est allé: décrire de manière concise 26 images comme des fonctions mathématiques. Chacune de ces fonctions renvoie une valeur de couleur de 8 à 15. Cette plage tire parti du fait que, une fois converti en base 2, le tableau de bits résultant peut être interprété comme [1, R, G, B]. Le premier élément peut être supprimé et le reste multiplié par 4 pour donner facilement une valeur de pixel dans le format souhaité qui couvre toutes les couleurs de drapeau possibles (ainsi que le vert, le cyan et le magenta). Cela fonctionne également bien qu'il existe des variables à un caractère initialisées à 10-15, et puisque les variables n'ont pas besoin d'espace pour les séparer syntaxiquement,

Une fois la fonction récupérée, il suffit d'itérer sur X et Y de 0 à 60, d'appeler la fonction à chaque étape et de réécrire le résultat dans le tableau de données d'image. Un observateur astucieux pourrait remarquer que les valeurs de couleur renvoyées par chaque fonction de drapeau ne permettent pas le gris, cependant. Il y a donc un peu de logique supplémentaire pour ignorer les espaces. Mais il y a toujours les coupes de machaon sur 'A' et 'B'. Il y a donc aussi un peu de logique supplémentaire. Si la valeur du caractère est inférieure à «C», une valeur est définie de telle sorte que la limite supérieure de la boucle X varie correctement par rapport à Y et les zones de découpe ne sont jamais dessinées.

Dans l'ensemble, je suis assez content de la façon dont cela s'est produit. Cela a demandé beaucoup de travail, mais c'était amusant. Certains drapeaux ne correspondent pas parfaitement à l'image de référence, mais je pense que toutes les formes se trouvent à moins de 1px de la cible (si certaines sont décalées de plus que cela, faites-le moi savoir et je les corrigerai). Et il y a certainement encore du potentiel à optimiser, car il y a une bonne quantité de redondance entre les 26 fonctions de drapeau.


Première tentative sans intérêt, 559 octets

Même si je n'ai jamais tout à fait terminé, je le posterai aussi, car c'est assez intéressant. Au lieu de modéliser chaque drapeau par une fonction de (X, Y) → couleur, les drapeaux sont dessinés comme une composition de formes simples. Mais j'étais inquiet de devoir écrire une quantité substantielle de code de rendu pour chaque forme différente. Après beaucoup de réflexion, je me suis rendu compte que je pouvais tous les rendre, avec quelques chevauchements et surplombs intelligents, avec une seule pseudo-forme: tous les points à une distance spécifiée d'un point spécifié, où la définition de "distance" est variable. La distance de l'échiquier donne un carré, la distance de Manhattan donne un diamant et la distance euclidienne donne un cercle. Cela signifiait que chaque forme avait les mêmes cinq paramètres (couleur, mode de distance, 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;}/`"[]"-
Runer112
la source
1
Excellent, c'est le genre de réponse créative que je cherchais. J'essaierai de l'exécuter plus tard.
Level River St
1
C'est probablement le code CJam le plus long que j'ai jamais vu. Beau travail cependant, +1.
Alex A.
Encore une fois, CJam semble sauver la situation.
ASCIIThenANSI
9
Malheureusement, c'est une infraction fédérale de publier du code CJam de plus de 200 octets. Je vais devoir te mettre en garde à vue.
Deusovi
2

PHP, 811 octets

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]);}}

Le blob compressé contient du code SVG pour chacun des 26 drapeaux. Une simple boucle extrait puis produit l'image SVG correspondant à chaque caractère de l'entrée.

Exemple de sortie pour "Ceci est \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>

( Vous pouvez l'essayer sur ideone , bien qu'il ne rendra pas la page pour vous.)

r3mainer
la source