Su objetivo es escribir un codificador de semáforo de bandera , que convertirá una oración dada en los caracteres de semáforo de bandera correspondientes, de acuerdo con el sistema de semáforo descrito en Wikipedia .
Suponga que la entrada es una oración única proporcionada a través de stdin (o equivalente). Su salida debe ser una serie de caracteres de semáforo, con cada fila representando una palabra de la oración. Solo necesita tratar con el alfabeto (AZ) y debe ignorar todos los demás caracteres que no sean espacios, pero debe poder manejar tanto mayúsculas como minúsculas. Su salida puede contener espacios en blanco adicionales.
Los caracteres del semáforo deben mostrarse como un cuadrado de 3x3, con una posición O
en el medio y la bandera representada por los caracteres | - / \
. Cada carácter de semáforo debe estar separado de los caracteres adyacentes por un espacio, y cada fila debe estar separada por una línea en blanco. No se preocupe por ajustar las palabras que pueden ser demasiado largas para su pantalla; pretenda que sus líneas tienen una longitud infinita.
Entrada de muestra:
abcdefg hijklmn opqrstu vwxyz
Salida de muestra:
\ | /
O -O O O O O- O
/| | | | | | |\
\ | | /
-O O O- O O O- O
/ / / / / / \
\ | / \| \ /
-O -O -O -O- -O O O
\
| / / \
O O- O O- O-
\ \ \
Entrada de muestra:
This is Code Golf.
Salida de muestra:
\| \
O -O O -O
/ / \
\
O -O
/ \
\ \ | /
O -O O O
| | |
\ /
O -O O O-
|\ / |
Como se trata de código de golf , gana la solución más corta.
and each row must be separated by a blank line
=> cada palabra significa, ¿no?Respuestas:
Perl,
282264251247245243241240236233229227220218216214 caracteresCon algunos saltos de línea prettifying:
Me tomó un tiempo hacer que esto funcione (mi primer intento de respuesta de Perl). Se basa en una idea similar a muchas de las otras respuestas. Cada bandera puede estar en una de 8 posiciones, hay dos banderas y las dos banderas nunca pueden estar en la misma posición. Esto significa que puedo codificar la posición de ambos indicadores en un byte, lo que también significa que puedo traducir directamente de un personaje a su codificación utilizando la
y///
función de Perl (¿operador?). Entonces:-Por lo tanto:
He escapado de algunos de los caracteres que están fuera del rango normal utilizado para facilitar la copia y el pegado del programa, pero estoy bastante seguro de que podría escribir un programa para reemplazar los códigos de escape con los caracteres mismos, salvándome Aproximadamente 30 caracteres.
fuente
Pitón,
244238233232Utiliza un truco mío favorito: la codificación de una sola pista. He etiquetado los bits del semáforo (bits)
para obtener la siguiente tabla de los bits que se producen para cada letra:
cada letra aparece exactamente dos veces en la tabla, ya que el señalero tiene dos brazos. Luego, veo esto como un gráfico en las letras az, con bordes entre letras que comparten sbits, con los bordes etiquetados de acuerdo con el sbit compartido. Lo ideal sería encontrar una ruta de Hamilton a través de este gráfico, de modo que los bordes posteriores no tengan la misma etiqueta. No existen tales rutas ... así que notarás que la variable
e
contiene la letrab
dos veces.Con mi camino casi Hamilton
e
, construyo una seried
de etiquetas sbit utilizadas en el recorrido dee
. Luego, para averiguar dónde colocar sus brazos, el encargado de la señal solo necesita encontrar la letra deseada en la siguiente tabla prácticade donde sus brazos van en la posición directamente debajo, y debajo y a la derecha de la carta.
fuente
to_lower()
alower()
. Además, dio un error cuando intenté darle una entrada no alfabética.Scala, 272 caracteres
Sin golf (bueno, menos golfizado):
fuente
Rubí, 287 caracteres.
La entrada debe darse en STDIN.
fuente
Scala
494 sin líneas nuevas520 con líneas nuevas:sin golf:
Explicación:
Observé un patrón de reloj, pero no con 12 horas, sino con 8. Y la hora de inicio es 0, donde son las 6 en punto, y a, b, c son los primeros códigos, con la primera (una) bandera en el sur.
Como las banderas 1 y 2 no se pueden distinguir, podemos ordenar todas las combinaciones con el número más bajo para la primera bandera primero. Desafortunadamente, el buen orden desde el principio se ve alterado, cuando j no sigue a i, pero k, l, m, y luego se vuelve un desastre.
Por lo tanto, reorganizo mis claves para el mapeo:
Si restamos 'a' de cada personaje, obtenemos los números de (0 a 7 + 6 + 5 + ... + 1). Podemos mapear los números de una cuadrícula de caracteres
Un par de dos números puede asignar dos banderas, donde el primer número es el índice de 0 a 6 para la primera bandera, y la segunda bandera no es un número del 1 al 7 para la segunda bandera, sino para la distancia desde el primero a la segunda bandera. (2,2) significaría que la primera bandera es hacia el OESTE, y la segunda es dos pasos en sentido horario desde allí, hacia el NORTE.
fuente
object Main extends Application
bloque, pero eso no parece ser suficiente.readLine
en la última línea"readLine"
, debería funcionar (el código es compatible con 2.8).Haskell
331357339 caracteresGolfizado:
Sin golf:
La codificación es
[hour, minute]
donde los relojes tienen 8 horas y 8 minutos. Los minutos se mueven más rápido que las horas. Si un reloj marca donde la hora y los minutos serían iguales, agregue 1 a la hora y 2 al minuto también (vea el segundo ejemplo de la marca anterior). Esa es la única forma en que aumentan las horas. Las horas NO aumentan cuando el minuto llega a un minuto arbitrario. Solo cuando los minutos equivalen a horas. En el código sin golf,clock
convierte las letras en relojes que representan el semáforo. La mayoría de los relojes se construyen en función de los tics de los anteriores. El resto está codificado. No hay nada realmente más en el código.fuente
Perl,
356, 275 caracteresGran cantidad de caracteres se salvó al reemplazar 'if else' a '? : 'construcción.
fuente
<>
lugar de$ARGV[0]
puede tomar la entrada de stdin y usarlc
para convertir todos los caracteres a minúsculas. Esto tiene el beneficio adicional de guardarle 4 caracteres. Tampoco maneja caracteres que no sean del alfabeto, pero podría decirseYou only need to deal with the alphabet (A-Z) and should ignore all other non-space characters
que no está muy claro qué hacer con ellos ...PowerShell ,
198192191188 bytesPruébalo en línea!
La salida contiene una línea de cola vacía.
Menos golfizado:
fuente
Carbón de leña , 70 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Divida la entrada en minúsculas en los espacios y repita sobre cada palabra.
Recorre cada personaje.
Divida la cadena comprimida
fjmrwyz gnsvxz abcdefg ahiklmn bhopqrs ciotuy djkptv elquwx
en espacios y repita sobre cada grupo de letras.Si el grupo contiene la letra actual, dibuje una línea en la dirección actual.
Gire 45 ° en sentido horario.
Salida del centro
o
y pasar a la posición de la siguiente letra.Ir al inicio de la siguiente palabra.
fuente