Egy garázsvásáron találsz egy gyönyörű, régi írógépet bagóért! Izgatottan hazarohansz, beteszel egy lapot, és nekiállsz gépelni. A lelkesedésed azonban alábbhagy, amikor megnézed az eredményt: minden szó összekavarodott! Például „stop”-ot ír a „post” helyett, és „least”-et a „stale” helyett. Óvatosan újrapróbálod, de most „spot”-ot és „slate”-et ír. Egy kis kísérletezés után rájössz, hogy minden betű kinyomtatása előtt véletlenszerű késleltetés van, ami összekavarja a sorrendet. Most már érted, miért adták el olyan kevés pénzért!
Rájössz, hogy ez a sajátosság lehetővé teszi anagrammák készítését: az anagramma olyan szó, amit úgy kapsz, hogy egy másik szó betűit átrendezed. Örülve a felfedezésnek, a nap hátralévő részét azzal töltöd, hogy több száz anagrammát készítesz.
A feladatod, hogy adott célszó és jelöltszavak halmaza esetén megkeresd a jelöltek azon részhalmazát, amelyek a célszó anagrammái.
Az anagramma betűk átrendezése új szó létrehozásához: például az "owns" a "snow" anagrammája.
Egy szó nem a saját anagrammája: például a "stop" nem anagrammája a "stop"-nak.
A célszó és a jelöltek egy vagy több ASCII-betűből álló szavak (A-Z és a-z).
A kis- és nagybetűk egyenértékűek: például a "PoTS" a "sTOp" anagrammája, a StoP viszont nem anagrammája a sTOp-nak.
Az anagrammahalmaz a jelölthalmaz azon részhalmaza, amelynek elemei a célszó anagrammái (tetszőleges sorrendben).
Az anagrammahalmaz szavait ugyanolyan kis- és nagybetűvel kell írni, mint ahogy a jelölthalmazban szerepelnek.
Ha a célszó "stone", a jelöltek pedig "stone", "tones", "banana", "tons", "notes", "Seton", akkor az anagrammahalmaz a "tones", "notes", "Seton".
A feladat megoldásához implementálnod kell az anagramsFor függvényt, amely kap egy szót és szavak egy csoportját, és visszaadja azokat, amelyek a megadott szó anagrammái.
Az anagrammákat ugyanabban a sorrendben kell visszaadnod, ahogy a jelölt szavak listájában szerepelnek.
Ha most oldod meg először ezt a feladatot, érdemes ragaszkodnod a megadott szignatúrához:
anagramsFor :: String -> [String] -> [String]
Később érdemes lehet újra elővenni ezt a problémát, és más adattípusokkal meg könyvtárakkal kísérletezni:
Text a text csomagból.Sequence és Set a containers csomagból.MultiSet a multiset csomagbólA teszteket szándékosan úgy tervezték, hogy szinte bármilyen értelmes típusszignatúrát elfogadjanak, ezért bátran keresd meg azt, amelyiket a legjobbnak tartod.
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Haskell nyelvet 107 feladat segítségével, valódi emberi mentorálással, mindez ingyen.