Tus padres os han desafiado a ti y a tu hermano o hermana a un partido de baloncesto dos contra dos. Seguros de que ganarán, os dejan anotar los primeros puntos, pero luego empiezan a hacerse con el control del partido. Como necesitáis un pequeño empujón, empezáis a hablar en Pig Latin, un lenguaje infantil inventado que a los que ya no son niños les cuesta entender. ¡Así tendréis la ventaja necesaria para imponeros a vuestros padres!
Tu tarea consiste en traducir texto del inglés a Pig Latin. La traducción se define con cuatro reglas, que se fijan en el patrón de vocales y consonantes al principio de una palabra. Estas reglas atienden al uso de vocales y consonantes de cada palabra:
a, e, i, o y u
Si una palabra empieza por vocal, o empieza por "xr" o "yt", añade un sonido "ay" al final de la palabra.
Por ejemplo:
"apple" -> "appleay" (empieza por vocal)"xray" -> "xrayay" (empieza por "xr")"yttria" -> "yttriaay" (empieza por "yt")Si una palabra empieza por una o más consonantes, mueve primero esas consonantes al final de la palabra y después añade un sonido "ay" al final de la palabra.
Por ejemplo:
"pig" -> "igp" -> "igpay" (empieza por una sola consonante)"chair" -> "airch" -> "airchay" (empieza por varias consonantes)"thrush" -> "ushthr" -> "ushthray" (empieza por varias consonantes)Si una palabra empieza por cero o más consonantes seguidas de "qu", mueve primero esas consonantes (si las hay) y la parte "qu" al final de la palabra, y después añade un sonido "ay" al final de la palabra.
Por ejemplo:
"quick" -> "ickqu" -> "ickquay" (empieza por "qu", sin consonantes delante)"square" -> "aresqu" -> "aresquay" (empieza por una consonante seguida de "qu")Si una palabra empieza por una o más consonantes seguidas de "y", mueve primero las consonantes que preceden a la "y" al final de la palabra y después añade un sonido "ay" al final de la palabra.
Algunos ejemplos:
"my" -> "ym" -> "ymay" (empieza por una sola consonante seguida de "y")"rhythm" -> "ythmrh" -> "ythmrhay" (empieza por varias consonantes seguidas de "y")Los tests unitarios proporcionan ejemplos de palabras. Intenta agrupar las consonantes con independencia de las combinaciones concretas de consonantes que aparecen en los tests unitarios.
Este ejercicio trabaja con datos textuales. Por motivos históricos, el tipo
String de Haskell es sinónimo de [Char], una lista de caracteres. Para un
manejo más eficiente de los datos textuales, se puede usar el tipo Text.
Como ampliación opcional de este ejercicio, puedes
Leer sobre los tipos de string en Haskell.
Añadir - text a tu lista de dependencias en package.yaml.
Importar Data.Text de la siguiente manera:
import qualified Data.Text as T
import Data.Text (Text)
Ahora puedes escribir, por ejemplo, translate :: Text -> Text y referirte a los combinadores de Data.Text como, por ejemplo, T.isSuffixOf.
Consultar la documentación de Data.Text.
Esta parte es totalmente opcional.
Regístrate en Exercism para aprender y dominar Haskell con 107 ejercicios y mentoría humana real, todo gratis.
Echamos un vistazo a la coincidencia de patrones y a las expresiones regulares, además de a una bonita solución en Prolog, y nos preguntamos: ¿has resuelto el ejercicio o solo has hecho que pasen los tests?