Tiene la tarea de escribir un programa que sillabice palabras en una cadena de texto, separándolas con un guión. Eso sería mucho trabajo, por lo que desea omitir algunas partes, principalmente porque no desea tener una tabla de las pronunciaciones necesarias para un algoritmo perfecto. También debes hacerlo lo más breve posible (y, por lo tanto, ilegible e imposible de mantener) como venganza por recibir esta tarea.
Tienes dos opciones:
- Escriba un programa que tome la cadena de STDIN y envíe el resultado a STDOUT.
- Escriba una función que tome la cadena como un solo parámetro y devuelva el resultado.
Especificación
- En este caso, cadena significa cualquier construcción similar a una cadena en el idioma de su elección (matrices de bytes, matrices de caracteres, cadenas ...).
- Las vocales son
a, e, i, o, u
- La cadena dada tiene
1 <= n <= 10
palabras, donde cada una tiene una longitud entre1 - 30
caracteres, inclusive. Su salida debe ser esas palabras con guiones. - Todas las letras son minúsculas y las palabras siempre están separadas por espacios. Por lo tanto, la entrada consta de caracteres
[a-z ]
- Aplicar reglas en orden de importancia.
- Cuando se divide una palabra, comience nuevamente con la mitad derecha de la palabra.
Reglas para la silábificación , en orden de importancia
Dos mismas vocales consecutivas contar como uno (es decir. feet
Sólo hay una vocal, pero beat
y finding
tiene dos). Cada sílaba tiene exactamente una vocal, por lo tanto, hay una sílaba para cada vocal.
- Si toda la palabra tiene solo cuatro letras, devuélvala sin cambios. (omita esto por el resto de la palabra)
- Si la palabra tiene solo una vocal, devuélvala sin cambios.
- Si la palabra tiene dos vocales consecutivas, divídalas entre ellas (es decir,
diaspora
->di-as-po-ra
) - Cuando dos o más consonantes se interponen entre dos vocales (iguales o diferentes), divida después de la primera consonante (es decir
sis-ter
), a menos que la parte consonante lo seack
, en cuyo caso divida la palabra después de ella. (es decir.nickel
->nick-el
) - Cuando a
y
viene entre dos vocales, divide la palabra después (ej.paying
->pay-ing
). - Cuando una consonante se interpone entre dos vocales (iguales o diferentes), divida antes de la consonante (es decir
dra-gon
) . - Devuelva la palabra sin cambios si no se puede hacer una división.
Elegí estas reglas porque se pueden aplicar de forma recursiva sin problemas y no requieren tablas de pronunciación. Por lo tanto, no son precisos y, por ejemplo, la regla 5 a menudo no es correcta. En general, sin embargo, lo es.
Ejemplo
In: hello world
Out: hel-lo world
In: have a nice day
Out: have a nice day
In: pour some nickel and xenon there
Out: pour some nick-el and xe-non the-re
x-e-non
? ¿Referencia para la regla # 4?lua
Respuestas:
Ruby, 144 bytes
Si vamos por lo imposible, ¿qué tal una expresión regular gigante?
alguna salida:
fuente
Lua, 292
Puede que Lua no haya sido el mejor idioma para hacerlo, pero funciona. Fluye más o menos como la pregunta que se hace. Las reglas están principalmente en orden con algunas optimizaciones: se omite el n. ° 2 (no es necesario a menos que haya una palabra vocal con "ck" al principio), y las reglas ck e y se pasan antes que el resto de # 4 y # 6, que se combinan. Dado que algunas vocales en la palabra deben capturarse dos veces (después de un guión y antes de otro), esa búsqueda se realiza dos veces.
Sin golf
Pruébelo aquí: http://ideone.com/g57TzA
fuente
Bash + coreultils, 173 bytes
Creo que tengo todos los últimos cambios de reglas:
Tenga en cuenta que el último carácter de la última línea es un
(espacio).
Creo que esto satisface suficientemente "ilegible e imposible de mantener" ;-)
Toma información de STDIN.
Principalmente sustitución de expresiones regulares. La primera línea de la
sed
expresión coincide con las reglas 1 y 2, luego simplemente salta a la:x
etiqueta al final de la expresión.Los
tr
s al principio y al final de la tubería hacen que las palabras estén separadas por una nueva línea, por lo que es más fácilsed
tratarlas. Esperaba hacerlo y todossed
responden, pero de esta manera es más simple y más fácil.Ejemplo:
fuente