Anagrama

Anagrama

Media

Introducción

¡En una venta de garaje encuentras una preciosa máquina de escribir antigua a precio de ganga! Con mucha ilusión, corres a casa, metes una hoja de papel y te pones a escribir. Sin embargo, tu entusiasmo se desvanece cuando examinas el resultado: ¡todas las palabras salen trastocadas! Por ejemplo, imprime «stop» en lugar de «post» y «least» en lugar de «stale». Lo intentas de nuevo con cuidado, pero ahora imprime «spot» y «slate». Después de experimentar un poco, descubres que hay un retraso aleatorio antes de que se imprima cada letra, lo que altera el orden. ¡Ahora entiendes por qué la vendían tan barata!

Te das cuenta de que esta peculiaridad te permite generar anagramas, que son palabras que se forman al reordenar las letras de otra palabra. Tu hallazgo te alegra tanto que pasas el resto del día generando cientos de anagramas.

Instrucciones

Tu tarea consiste en lo siguiente: dada una palabra objetivo y un conjunto de palabras candidatas, encontrar el subconjunto de las candidatas que sean anagramas de la palabra objetivo.

Un anagrama es una reordenación de las letras que forma una palabra nueva: por ejemplo, "owns" es un anagrama de "snow". Una palabra no es un anagrama de sí misma: por ejemplo, "stop" no es un anagrama de "stop".

La palabra objetivo y las candidatas son palabras formadas por uno o más caracteres alfabéticos ASCII (A-Z y a-z). Los caracteres en minúscula y en mayúscula son equivalentes: por ejemplo, "PoTS" es un anagrama de "sTOp", pero StoP no es un anagrama de sTOp. El conjunto de anagramas es el subconjunto del conjunto de candidatas que son anagramas de la palabra objetivo (en cualquier orden). Las palabras del conjunto de anagramas deben tener las mismas mayúsculas y minúsculas que en el conjunto de candidatas.

Dadas la palabra objetivo "stone" y las candidatas "stone", "tones", "banana", "tons", "notes", "Seton", el conjunto de anagramas es "tones", "notes", "Seton".

Pistas

Para completar este ejercicio tienes que implementar la función anagramsFor, que recibe una palabra y un grupo de palabras, y devuelve las que son anagramas de la palabra dada.

Debes devolver los anagramas en el mismo orden en que aparecen en las palabras candidatas.

Si es la primera vez que resuelves este ejercicio, te recomendamos que te ciñas a la signatura proporcionada:

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

Más adelante, puede ser buena idea volver sobre este problema y jugar con otros tipos de datos y bibliotecas:

  • Text, del paquete text.
  • Sequence y Set, del paquete containers.
  • MultiSet, del paquete multiset

El conjunto de pruebas se diseñó intencionadamente para aceptar casi cualquier signatura de tipo que tenga sentido, así que te animamos a encontrar la que creas que es la mejor.

Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Haskell Exercism

¿Listo para empezar Anagrama?

Regístrate en Exercism para aprender y dominar Haskell con 107 ejercicios y mentoría humana real, todo gratis.