Anagrama

Anagrama

Médio

Introdução

Numa venda de garagem, encontras uma bela máquina de escrever vintage a um preço de saldo! Com entusiasmo, corres para casa, colocas uma folha de papel e começas a escrever à máquina. No entanto, o teu entusiasmo esmorece quando examinas o resultado: todas as palavras saem baralhadas! Por exemplo, imprime "stop" em vez de "post" e "least" em vez de "stale". Com cuidado, tentas outra vez, mas agora imprime "spot" e "slate". Depois de algumas experiências, descobres que há um atraso aleatório antes de cada letra ser impressa. Isso baralha a ordem. Agora percebes porque é que a venderam por tão pouco dinheiro!

Percebes que esta peculiaridade te permite gerar anagramas, que são palavras formadas ao reorganizar as letras de outra palavra. Contente com a tua descoberta, passas o resto do dia a gerar centenas de anagramas.

Instruções

A tua tarefa é, dada uma palavra alvo e um conjunto de palavras candidatas, encontrar o subconjunto de candidatas que são anagramas da palavra alvo.

Um anagrama é um rearranjo de letras que forma uma nova palavra: por exemplo, "owns" é um anagrama de "snow". Uma palavra não é anagrama de si própria: por exemplo, "stop" não é um anagrama de "stop".

A palavra alvo e as candidatas são palavras formadas por um ou mais carateres alfabéticos ASCII (A-Z e a-z). Os carateres minúsculos e maiúsculos são equivalentes: por exemplo, "PoTS" é um anagrama de "sTOp", mas StoP não é um anagrama de sTOp. O conjunto de anagramas é o subconjunto do conjunto de candidatos que são anagramas da palavra alvo (por qualquer ordem). As palavras do conjunto de anagramas devem ter as mesmas maiúsculas e minúsculas que no conjunto de candidatos.

Dada a palavra alvo "stone" e as candidatas "stone", "tones", "banana", "tons", "notes", "Seton", o conjunto de anagramas é "tones", "notes", "Seton".

Sugestões

Para completares este exercício, tens de implementar a função anagramsFor, que recebe uma palavra e um grupo de palavras e devolve as que são anagramas da palavra dada.

Tens de devolver os anagramas pela mesma ordem em que aparecem na lista de palavras candidatas.

Se é a primeira vez que resolves este exercício, recomenda-se que te cinjas à assinatura fornecida:

anagramsFor :: String -> [String] -> [String]

Mais tarde, pode ser boa ideia revisitar este problema e explorar outros tipos de dados e bibliotecas:

  • Text, do pacote text.
  • Sequence e Set, do pacote containers.
  • MultiSet, do pacote multiset

A suite de testes foi deliberadamente concebida para aceitar quase qualquer assinatura de tipo que faça sentido, por isso encorajamos-te a encontrar a que achares melhor.

Editar via GitHub A ligação abre numa nova janela ou separador
Haskell Exercism

Estás pronto para começar Anagrama?

Inscreve-te no Exercism para aprenderes e dominares Haskell com 107 exercícios, e mentoria humana real, tudo grátis.