Os teus pais desafiaram-te a ti e ao teu irmão para um jogo de basquetebol dois contra dois. Convencidos de que vão ganhar, deixam-te marcar os primeiros pontos, mas depois começam a dominar o jogo. A precisar de um pequeno empurrão, começas a falar em Pig Latin, uma língua inventada de crianças que é difícil de entender para quem já não é criança. Assim vais ter vantagem para venceres os teus pais!
A tua tarefa é traduzir texto de inglês para Pig Latin. A tradução é definida por quatro regras, que analisam o padrão de vogais e consoantes no início de uma palavra. Estas regras analisam a utilização de vogais e consoantes em cada palavra:
a, e, i, o e u
Se uma palavra começa com uma vogal, ou começa com "xr" ou "yt", acrescenta um som "ay" ao fim da palavra.
Por exemplo:
"apple" -> "appleay" (começa com vogal)"xray" -> "xrayay" (começa com "xr")"yttria" -> "yttriaay" (começa com "yt")Se uma palavra começa com uma ou mais consoantes, move primeiro essas consoantes para o fim da palavra e, em seguida, acrescenta um som "ay" ao fim da palavra.
Por exemplo:
"pig" -> "igp" -> "igpay" (começa com uma única consoante)"chair" -> "airch" -> "airchay" (começa com várias consoantes)"thrush" -> "ushthr" -> "ushthray" (começa com várias consoantes)Se uma palavra começa com zero ou mais consoantes seguidas de "qu", move primeiro essas consoantes (se existirem) e a parte "qu" para o fim da palavra e, em seguida, acrescenta um som "ay" ao fim da palavra.
Por exemplo:
"quick" -> "ickqu" -> "ickquay" (começa com "qu", sem consoantes antes)"square" -> "aresqu" -> "aresquay" (começa com uma consoante seguida de "qu")Se uma palavra começa com uma ou mais consoantes seguidas de "y", move primeiro as consoantes que precedem o "y" para o fim da palavra e, em seguida, acrescenta um som "ay" ao fim da palavra.
Alguns exemplos:
"my" -> "ym" -> "ymay" (começa com uma única consoante seguida de "y")"rhythm" -> "ythmrh" -> "ythmrhay" (começa com várias consoantes seguidas de "y")Os testes unitários fornecem exemplos de palavras. Tenta agrupar as consoantes independentemente das combinações específicas de consoantes nos testes unitários.
Este exercício trabalha com dados textuais. Por razões históricas, o tipo String do Haskell é sinónimo de [Char], uma lista de carateres. Para lidar com dados textuais de forma mais eficiente, pode usar-se o tipo Text.
Como extensão opcional a este exercício, podes:
Lê sobre tipos de string em Haskell.
Adiciona - text à tua lista de dependências no package.yaml.
Importa Data.Text da seguinte forma:
import qualified Data.Text as T
import Data.Text (Text)
Agora podes escrever, por exemplo, translate :: Text -> Text e referir-te aos combinadores de Data.Text como, por exemplo, T.isSuffixOf.
Consulta a documentação de Data.Text,
Esta parte é totalmente opcional.
Inscreve-te no Exercism para aprenderes e dominares Haskell com 107 exercícios, e mentoria humana real, tudo grátis.
Damos uma vista de olhos à correspondência de padrões e às expressões regulares, bem como a uma boa solução em Prolog, e perguntamos: resolveste o exercício ou limitaste-te a fazer passar os testes?