El sistema principal es un dispositivo mnemotécnico para convertir números en palabras para que puedan memorizarse más fácilmente.
Se basa en cómo suenan las palabras fonéticamente, pero para simplificar las cosas para el desafío, solo nos preocuparemos de cómo se deletrean las palabras. Esto significa que habrá algunas conversiones incorrectas, pero está bien.
Para convertir un número en una palabra utilizando nuestro sistema principal simplificado:
- Reemplace cada uno
0consoz. (Algunos podrían sersy otros podrían serz. Lo mismo va abajo).- Reemplace cada uno
1contodoth.- Reemplace cada uno
2conn.- Reemplace cada uno
3conm.- Reemplace cada uno
4conr.- Reemplace cada uno
5conl.- Reemplace cada uno
6conjoshoch.- Reemplace cada uno
7conkocogoq.- Reemplace cada uno
8confov.- Reemplace cada uno
9conpob.- Agregue las letras
aehiouwxyen cualquier lugar en cualquier cantidad para hacer una palabra real en inglés, si es posible .
La única excepción es quehno se puede insertar después de unsoc.El número en realidad puede ser cualquier cadena de los dígitos 0-9 (sin decimales, comas o signos).
La palabra solo puede contener las letras minúsculas az.
Ejemplos
El número 32debe convertirse como ?m?n?, donde ?representa cualquier cadena finita hecha de las letras aehiouwxy(una cadena del monoide libre si lo prefiere). Hay muchas maneras en que esto podría convertirse en una verdadera palabra Inglés: mane, moon, yeoman, etc.
El número 05se puede convertir como ?s?l?o ?z?l?. Algunas posibilidades son easily, hassley hazel. La palabra shawlno está permitida porque hno se puede colocar después s; se leería incorrectamente como 65.
Desafío
Escriba un programa o función que tome una cadena de los dígitos 0-9 y encuentre todas las palabras en las que podría convertirse utilizando el sistema principal simplificado mnemónico.
Su programa tiene acceso a un archivo de texto de lista de palabras que define cuáles son todas las palabras "reales" en inglés. Hay una palabra az minúscula en cada línea de este archivo, y opcionalmente puede suponer que tiene una nueva línea final. Aquí hay una lista de palabras reales que puede usar para probar. Puede suponer que este archivo de lista de palabras se llama f(o algo más largo) y se encuentra en cualquier directorio conveniente.
Para una penalización de 35 bytes (agregue 35 a su puntaje), puede suponer que la lista de palabras ya está cargada en una variable como una lista de cadenas. Esto es principalmente para idiomas que no pueden leer archivos, pero cualquier envío puede aprovecharlo.
Su programa debe generar todas las palabras en la lista de palabras a las que se puede convertir el número de entrada. Deben imprimirse en stdout (o similar), uno por línea (con una nueva línea final opcional), o pueden devolverse como una lista de cadenas si elige escribir una función. La lista de palabras no está necesariamente alfabetizada y la salida tampoco necesita serlo.
Si no hay palabras posibles, la salida (o la lista) estará vacía. La salida también está vacía si se ingresa la cadena vacía.
Tome la entrada a través de stdin, línea de comando o como argumento de cadena a una función. La lista de palabras, o su nombre de archivo, no debe ser parte de la entrada, solo la cadena de dígitos.
Solo está haciendo coincidir palabras individuales en la lista de palabras, no secuencias de palabras. La palabra noonprobablemente sería uno de los resultados 22, pero la secuencia de palabras no oneno lo sería.
Casos de prueba
Supongamos que esta es la lista de palabras:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
zdnmrlshchvb
sthnmrlchgvb
shthnmrlchgvb
bob
pop
bop
bopy
boppy
La entrada 0123456789debe dar todas las palabras largas excepto zdnmrlshchvby shthnmrlchgvb:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
La entrada 99debe dar:
bob
pop
bop
bopy
(Las palabras de salida pueden estar en cualquier orden).
Puntuación
La presentación más corta en bytes gana. Tiebreaker va a la presentación publicada primero.