Alfabeto de bandera marítima de ICS

14

Los barcos utilizan el alfabeto de bandera del Código Internacional de Señales para la comunicación, particularmente para las señales estáticas.

Su desafío es escribir un programa o función que tome una cadena de STDIN o como argumento, y muestre el texto correspondiente en el alfabeto de la bandera de ICS. Si su idioma no se muestra en la pantalla, guardar en un archivo es aceptable.

Su programa o función admitirá las letras AZ en mayúsculas y minúsculas, más Space y Newline . El comportamiento con otros personajes no está definido.

La pantalla debe ser lo suficientemente grande como para mostrar capaz de mostrar al menos 8 banderas horizontalmente y 6 banderas verticalmente. El comportamiento no está definido si se alcanza el borde derecho antes de recibir una nueva línea, o si el mensaje es demasiado largo para caber en la pantalla verticalmente.

El alfabeto de la bandera es el que se muestra a continuación (las letras romanas son solo de referencia, no son necesarias en la salida).

ingrese la descripción de la imagen aquí

Dimensiones

No existe un estándar universalmente acordado para las dimensiones de estas banderas, por lo que para el propósito de este desafío se aplicará lo siguiente:

Las banderas serán de 60x60 píxeles, con un espacio de 30 píxeles entre ellas tanto horizontal como verticalmente.

La cola de golondrina cortada en A y B tendrá 15 píxeles de profundidad.

Todas las demás líneas deben ser horizontales, verticales o a 45 grados.

Las características se ubicarán dividiendo la bandera en una grilla NxN imaginaria de lados 3,4,5 o 6 cuadrados. Consulte la imagen de arriba, pero para más aclaraciones:

A, E, H, K, L y U se basan en una cuadrícula de 2x2: el ancho de cada zona de color debe ser de 30 píxeles. Además, los puntos del diamante en F estarán a la mitad de cada lado de la bandera.

J y T se basan en una cuadrícula de 3x3: cada banda tendrá 20 píxeles.

P, N y S se basan en una cuadrícula de 4x4. Además, las líneas diagonales de Y deberán dividir los bordes de la bandera en 4.

C, D, R y X se basarán en una cuadrícula de 5x5. Las bandas y brazos de cruces deben tener 12 píxeles de ancho.

G, W, M, V se basan en una cuadrícula de 6x6. Las bandas de G y los bordes de W deben tener 10 píxeles de ancho. Los brazos de cruces en M y V deberán cubrir los primeros y últimos 10 píxeles de cada borde de la bandera, dejando zonas triangulares que midan 40 píxeles a lo largo del borde largo.

El círculo de I estará en el centro de la bandera y tendrá un diámetro de 30 píxeles.

Se permite un error de +/- 1 píxel del texto anterior. Si su idioma solo admite gráficos escalables, puede interpretar que "píxeles" significa "unidades".

Colores

Los colores serán rojo, blanco, azul, amarillo y negro según lo definido por su idioma o su documentación. Si su idioma no define los colores, puede usar lo siguiente: Rojo FF0000, Blanco FFFFFF, Azul 0000FF, Amarillo FFFF00, Negro 0000000.

El fondo debe ser gris (canales r, g y b iguales, entre 25% y 75% de intensidad).

Puntuación / Lagunas

Esto es codegolf. El código más corto en bytes gana.

Las lagunas estándar no están permitidas.

No se pueden utilizar funciones incorporadas o de biblioteca para mostrar banderas. La salida no será texto (y, en particular, los caracteres unicode no se utilizarán para construir la forma de la bandera).

Ejemplo

JFK got
my VHS
PC
and XLR
web quiz

debe producir lo siguiente

ingrese la descripción de la imagen aquí

Level River St
fuente
No estoy completamente seguro de lo que quiere decir con " La pantalla debe ser lo suficientemente grande como para mostrar al menos 8 banderas horizontalmente y 6 banderas verticalmente ", especialmente dado que su caso de prueba muestra una salida de solo 5 banderas de alto. ¿Es solo que las respuestas deben manejar mensajes hasta esas dimensiones y no están obligados a manejar las más grandes, o tiene la intención de exigir que todas las líneas se rellenen con al menos 8 caracteres y todos los mensajes con al menos 6 líneas?
Peter Taylor
1
@PeterTaylor Si su programa o idioma es lo suficientemente inteligente como para cambiar el tamaño de la pantalla de acuerdo con la salida, no es necesario ajustar la pantalla a 8x6 si la salida es más pequeña. La salida debe tener un fondo gris y ser rectangular (todas las líneas rellenadas al menos a la longitud de la línea más larga).
Level River St

Respuestas:

15

CJam, 464 bytes

¿Creías que CJam no tenía funciones de manipulación de imágenes? Bueno, pensaste bien! Pero no iba a dejar que eso me detuviera.

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

Este programa genera la imagen de la mejor manera que CJam puede: como texto que representa la imagen cuando se guarda como un archivo PPM . Por cierto, ni siquiera intentes ejecutarlo con el intérprete en línea; volarás la pila. Ejecútelo con el intérprete de Java y canalice la salida a un archivo con un comando como java -jar cjam-0.6.4.jar flags.cjam > flags.ppm. Una vez que haya proporcionado su entrada, envíe un EOF (puede que tenga que ser inmediatamente después de una nueva línea) con ctrl + D en Unix o ctrl + Z en Windows.

Muestra

Si realmente lo desea, puedo intentar pegar la fuente de imagen original de ~ 3 MB en alguna parte. Pero aquí está el resultado abierto en GIMP y conectado a PNG:

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

Explicación

El encabezado de la imagen, fácilmente identificable en la fuente, consiste en el número mágico, el ancho, la altura y el valor máximo del canal. Por lo tanto, la salida es una imagen de 690 * 690 (suficiente para 8 * 8 banderas de 60px con 30px de espacio entre ellas) con cada valor R, G y B en un rango de 0 a 4.

Los datos de la imagen se inicializan como una matriz 690 * 690 * 3 llena de 3, haciendo que toda la imagen sea de color gris claro. Luego, la entrada se lee, se convierte a mayúsculas y se divide en líneas. Las líneas se procesan en un bucle, incrementando la coordenada Y de la bandera en 90 cada iteración, y en cada línea, cada carácter se procesa en un bucle, incrementando la coordenada X de la bandera en 90 cada iteración. Ahora comienza la magia.

Cada carácter se asigna a la función de píxel de una bandera que, cuando se llama, devuelve el color del píxel en la posición (X, Y) en la bandera. Aquí es donde fue la mayor parte del trabajo duro: describiendo concisamente 26 imágenes como funciones matemáticas. Cada una de estas funciones devuelve un valor de color de 8-15. Este rango aprovecha el hecho de que, cuando se convierte a la base 2, la matriz de bits resultante se puede interpretar como [1, R, G, B]. El primer elemento puede eliminarse y el resto multiplicarse por 4 para proporcionar fácilmente un valor de píxel en el formato deseado que cubra todos los colores de bandera posibles (así como verde, cian y magenta). También funciona muy bien que hay variables de un carácter inicializadas en 10-15, y dado que las variables no necesitan un espacio para separarlas sintácticamente,

Una vez que se recupera la función, solo se trata de iterar sobre X e Y de 0 a 60, llamar a la función en cada paso y escribir el resultado nuevamente en la matriz de datos de imagen. Sin embargo, un observador astuto podría notar que los valores de color devueltos por cada función de indicador no permiten el gris. Entonces, hay un poco de lógica adicional para omitir espacios. Pero aún quedan los cortes de cola de golondrina en 'A' y 'B'. Así que también hay un poco de lógica extra allí. Si el valor del carácter es menor que 'C', se establece un valor tal que el límite superior en el bucle X varía correctamente con respecto a Y y las áreas recortadas nunca se dibujan.

En general, estoy bastante contento con cómo salió esto. Tomó mucho trabajo, pero fue divertido. Algunas banderas no coinciden perfectamente con la imagen de referencia, pero creo que tengo todas las formas para estar dentro de 1px del objetivo (si alguna está apagada por más que eso, avíseme y las arreglaré). Y definitivamente todavía hay potencial para optimizar, ya que hay una buena cantidad de redundancia entre las 26 funciones de bandera.


Primer intento irresistible, 559 bytes

Aunque nunca terminé esto, también lo publicaré, porque es bastante interesante. En lugar de modelar cada bandera mediante una función de (X, Y) → color, las banderas se dibujan como una composición de formas simples. Pero me preocupaba la necesidad de escribir una cantidad sustancial de código de representación para cada forma diferente. Después de mucho reflexionar, me di cuenta de que podía renderizarlos a todos, con cierta superposición y sobredibujo inteligentes, con solo una pseudoforma: todos los puntos dentro de una distancia específica de un punto específico, donde la definición de "distancia" es variable. La distancia del tablero de ajedrez da un cuadrado, la distancia de Manhattan da un diamante y la distancia euclidiana da un círculo. Esto significaba que cada forma tenía los mismos cinco parámetros (color, modo de distancia, 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
fuente
1
Excelente, este es el tipo de respuesta creativa que estaba buscando. Intentará ejecutarlo más tarde.
Level River St
1
Este es posiblemente el código CJam más largo que he visto. Buen trabajo, sin embargo, +1.
Alex A.
De nuevo, CJam parece salvar el día.
ASCIIThenANSI
99
Desafortunadamente, es un delito federal publicar código CJam de más de 200 bytes. Voy a tener que llevarte bajo custodia.
Deusovi
2

PHP, 811 bytes

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

El blob comprimido contiene código SVG para cada uno de los 26 indicadores. Luego, un bucle simple extrae y genera la imagen SVG correspondiente a cada carácter de la entrada.

Salida de muestra para "Esto es \nuna prueba":

<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>

( Puede probarlo en ideone , aunque no le mostrará la página).

r3mainer
fuente