Cuando los bebés abren la boca, no solo vomitan galimatías. En realidad, están hablando en un cifrado altamente avanzado a prueba de adultos ...
The Baby-talk Cipher
Cuando un bebé habla, podría verse algo así. gogooa gagooook aagaaoooy
Cada sección separada por un solo espacio representa un carácter (por lo que el ejemplo anterior representa 3 caracteres).
Para descifrar una sección, debemos contar el número de As y Os que contiene. Sin embargo, solo contamos los que están adyacentes a otra vocal. Por ejemplo, la A en 'gag' no contaría, pero tanto la A como la O en 'gaog' sí lo harían.
Contar el ejemplo anterior se vería así:
Section | Num Os | Num As
gogooa | 2 | 1
gagooook | 4 | 0
aagaaoooy | 3 | 4
Luego usamos estos valores para convertir la entrada en texto sin formato en un cuadrado de Polybius. Esta es una representación de 5x5 del alfabeto inglés, omitiendo 'J' (tenga en cuenta que, en baby-talk, las reglas de conteo de 0 se aplican a la tabla):
0 1 2 3 4
0 A B C D E
1 F G H I K
2 L M N O P
3 Q R S T U
4 V W X Y Z
Usando el número de Os como columna y el número de As como fila, encontramos qué carácter representa cada sección:
Section | Num Os | Num As | Character
gogooa | 2 | 1 | (2,1) -> H
gagooook | 4 | 0 | (4,0) -> E
aagaaoooy | 3 | 4 | (3,4) -> Y
Lo que nos dice que el bebé solo decía "HEY".
Notas :
- Si una sección que representa un personaje tiene más de 4 As u Os, ignore los extras, porque 4 es el valor máximo en la tabla. - Para esta tarea, Y no es una vocal, solo A, E, I, O y U.
El reto
Su tarea es crear un programa completo que tome una entrada, una palabra en baby-speak e imprima en texto sin formato.
- Su programa debe poder tomar entradas en mayúsculas, minúsculas y una combinación de ambas.
- La entrada solo contendrá letras del alfabeto ASCII (AZ y az), con espacios individuales para separar las palabras del bebé.
- El texto de salida puede ser en cualquier caso.
- Debe tomar la entrada
STDIN
e imprimir el texto sin formato enSTDOUT
. Si su idioma no tiene estos, use el equivalente más cercano. - Este es el código de golf , por lo que gana el código más corto en bytes, pero cualquier solución es bienvenida.
Casos de prueba
'GLOOG KAKAAOOO ARGOOO OOOOOGUGUU' -> CODE
'oaka pooopaa gaau augu' -> GOLF
'Aoao U oOOAoa oaoAoo aoAoAOa' -> NAPPY
'GUG gAGaA gOougOou' -> ALE
'OOaGOG GoGOOoGoU gAA bLAA GOUGoOUgAIGAI' -> HELLO
'GUG gAGaA gOougOou' -> 'ALE'
Los bebes beben cerveza? : D.toUpperCase()
llamada de función o similar, no un desafío realmente estimulantegogooa
tiene 2 o? ¿Y cómogagooook
tiene 0 a's?FAG
: PRespuestas:
05AB1E , 46 bytes
Pruébalo en línea!
Explicación en pasos
fuente
Perl, 82 bytes
Incluye +1 para
-a
Dar entrada en STDIN:
baby.pl
:Esto supone una versión perl lo suficientemente reciente donde
-a
implica-n
. Si su perl es demasiado viejo, deberá agregar una-n
opción explícita .También supone que los bebés no pueden decir cadenas ASCII generales que comienzan con dígitos como
1 this will not work
fuente
brainfuck, 656 bytes
Esta fue una muy buena manera de matar un par de horas.
Requiere un intérprete de brainfuck que usa celdas de ajuste de 8 bits, le permite ir a la izquierda desde la celda 0 y devuelve 0 si
,
se usa cuando stdin está vacío. En mi experiencia, estas son las configuraciones más comunes.Este programa no considera a Y una vocal, pero si OP lo quiere, es una solución fácil.
Parece que escribir esto sería una tarea desalentadora, pero si está familiarizado con el lenguaje no hay nada sorprendente o nuevo en el código. Tácticas estándar de brainfuck: lea la entrada pero asegúrese de dejar un par de celdas vacías entre cada byte, use esas celdas vacías para almacenar datos sobre la entrada, use los datos que almacenó para decidir cómo transformarla y escupir algo al final . En este caso, fue obtener la entrada, configurarlo todo en mayúsculas, averiguar qué celdas son vocales, desechar esa información después de usarla para determinar qué celdas están al lado de las vocales, configurar todo lo que no está al lado de una vocal para algunos valor que nunca será relevante para que no se interpongan más tarde, y básicamente ya terminaste. A partir de ahí solo tienes que contar tus
A
syO
s, multiplicarA
s por 5 y agregue el número deO
s, caso especial cualquier cosa por encima de 8 para evitar J y salida Elegí manejar esta palabra a la vez, en lugar de tomar toda la entrada de una vez, por lo que tuve que configurar la parte del código que lee stdin para romper en 0 o 32, pero eso no es un problema demasiado grande (solo envuelva la resta por 32 en un condicional para que no suceda si el valor ya es 0, luego corrija las instrucciones<
o las>
que perdió más adelante).No sé cuán útil será porque lo escribí principalmente para mantener mis pensamientos rectos en lugar de como una explicación real, pero aquí está el código con mis comentarios y su sangría original:
fuente
JavaScript (ES6), 145 bytes
Reemplaza cada palabra (y el siguiente espacio) con su letra correspondiente.
s.split` `.map().join``
es 3 bytes más largo:fuente
Perl, 159 +1 = 160 bytes
+1 byte para la bandera -n. El espacio en blanco no es parte del código y solo se proporciona para facilitar la lectura.
El código divide la entrada por espacios y convierte cada palabra del bebé en minúsculas antes de continuar. La expresión regular encuentra todas las vocales ao o que son seguidas por otra vocal, o están precedidas por una vocal, y las ordena, a al principio, o al final, luego encuentra el índice de la primera 'o'. Si el número restante de coincidencias (también conocido como el número de 'a') es mayor que 4, entonces nos importan aproximadamente 4 a's, y si hay más de 4 o's, nos importan aproximadamente 4 o's. Luego saca la letra apropiada de la matriz y la imprime, luego pasa a la siguiente palabra de bebé.
fuente
Brainfuck, 283 bytes
Formateado:
Esto funciona con o sin una nueva línea final en la entrada.
Pruébalo en línea.
Cada carácter se procesa en el mod 32 (con un flujo de control tal que el código que implementa la operación de mod solo ocurre una vez en el programa). Esto permite la insensibilidad de mayúsculas y minúsculas, así como el colapso del carácter de espacio y EOF en un solo caso. Una nueva línea final se trata igual que
J
, lo que no afecta a la salida.Bosquejo del diseño de la memoria:
0 x C c y a A b B
donde
c
está el carácter de entrada,C
es el mod de caracteres 32,x
es si es una vocal,y
es si el carácter anterior era una vocalA
yB
son los recuentos de caracteres válidos (junto a las vocales)a
yo
caracteres respectivamente,a
yb
son sus respectivos buffers que ser copiado o borrado dependiendo de si hay una vocal adyacente.Cuando se alcanza un espacio o EOF, se hacen algunos malabarismos para reducir los recuentos superiores a 4 y omitir la letra
J
, y luego se imprime el carácter decodificado.fuente
PHP, 163 bytes
Versión más legible:
Pruebas:
fuente
Java 8,
272266251249 bytes-6 bytes gracias a @Joba .
-1 byte de conversión de Java 7 a 8, y
1416 bytes adicionales guardados al cambiar la parte de impresión.Explicación:
Pruébalo aquí
fuente
Pitón 3,
163162157146 bytesUtiliza expresiones regulares para encontrar todas las cadenas de vocales mayores de 2, cuenta As y Os con un máximo de 4, y luego imprime.
fuente
APL, 60
Tenga en cuenta que ⎕IO ← 0 y ⎕ML ← 3
Ejemplo:
Funciona en Dyalog 15.0 , ya que es la versión en la que se introdujo 819⌶ para poner en minúscula una cadena.
fuente
Pyth, 64 bytes
Probablemente se pueda jugar más al golf. Pruébalo aquí!
fuente
R, 261 bytes
Creo que pasé demasiado tiempo para que esto funcione y creo que es una solución innecesariamente complicada, aunque funciona. Toma información de stdin, es importante que la cadena esté entre comillas.
El uso de cuatro
apply
familias anidadas podría reducirse teóricamente a solo dos haciendo uso de ellasmapply
. Pero porque las entradas amapply
no serán de la misma longitud, la más corta se recicla, lo que complica las cosas y no pude encontrar una solución que funcione.Si alguien está interesado, agregaré una explicación sin fundamento más adelante.
Pruebe todos los casos de prueba en R-fiddle
Tenga en cuenta que esta versión toma la entrada como un argumento de función en lugar de stdin porque
scan
no funciona en R-fiddle. Además, se agregó una nueva línea para que sea más fácil de leer.fuente
Python 3, 262 bytes
Menos golfizado (los comentarios son las variables en el código acortado):
Pruébalo en línea!
fuente
blaoaoaog
: las vocales entrelazadas se cuentan más de una vez, dandoz
cuándo debería sert
(aunque funciona soloaaaooo
, aunque no puedo entender por qué ...)aooa
== (2,2) ==n
,aoaoao
== (3,3) ==t
gaoaoaog
imprime Z en lugar de T. Creo que es porque su expresión regular se está acelerando[ao,oa,ao,oa,ao]
, lo que cuenta5,5
, luego lo constriñe4,4
, imprimiendo Z.Kotlin ,
221209 bytesAhora mucho más feo y lento, todo en nombre de 11 bytes
Guárdelo en un archivo (ej.
BabyTalk.kts
) Para ejecutarlo como un script. O bien, el código anterior se puede anteponer confun main(z:Array<String>)=
y compilarse normalmente por un costo de 26 bytes más.Pruébalo en línea!
Sangrado:
fuente
PHP,
124 129 121 120125 bytesToma información de los argumentos de la línea de comandos. Ejecutar
-nr
o probarlo en línea .Descompostura
fuente
J , 109 bytes
Pruébalo en línea!
fuente