Szóláncolatok

A feladatban egy szójátékot fogunk megvalósítani, melyben szóláncokat kell alkotni. A szóláncokat egy rögzített halmaz szavaiból képezhetjük. A szóláncolatokat a következő szabályok mentén alkalmazzuk:

Egy szóláncot, melyre a fenti szabályok érvényesek, a következőképpen reprezentáljuk:

type Snake = [String]

(A type kulcsszó segítségével a Snake típus a [String] típus egy másik neve lesz, hasonlóan a String és [Char] viszonyához. A programban ez semmilyen további megszorítást nem indukál, csupán a beszédesebb függvénytípusok kialakításában segít.)

Próbáljuk meg megoldani a feladatot csak a következő segédanyagok felhasználásával: Haskell könyvtárainak dokumentációja, Hoogle, a tárgy honlapja és a BE-AD rendszerbe feltöltött beadandók.

Szavak kezdőbetűi

Adjuk meg azt a függvényt, amely a paraméterül kapott listából megadja milyen kezdőbetűvel kezdődnek szavak!

mayStartWith :: [String] -> String

Test>
[] :: String
Test>
"ac" :: String
Test>
"a" :: String
Test>
"ahoy" :: String

Szavak adott kezdőbetűvel

Adjuk meg azokat a szavakat, amelyek a megadott kezdőbetűvel kezdődnek!

startsWith :: Char -> [String] -> [String]

Test>
["ahoy"] :: [String]
Test>
["okay", "obrigado"] :: [String]
Test>
[] :: [String]

Szavak adott befejező betűvel

Adjuk meg azokat a szavakat, amelyek a megadott betűvel végződnek!

endsWith :: Char -> [String] -> [String]

Test>
["hola"] :: [String]
Test>
["ahoy", "okay"] :: [String]
Test>
[] :: [String]

Szóláncolat befejező betűje

Adjuk meg azt a függvényt, amely meghatározza egy szóláncolat befejező betűjét!

snakeEndsWith :: Snake -> Char

Test>
'o' :: Char
Test>
'y' :: Char

Szóláncolat lehetséges folytatásai, ismétléssel

Adjuk meg azt a függvényt, amely egy létező szóláncolathoz megadja annak lehetséges folyatásait! A függvény üres listát adjon vissza, ha nem tudja azt folytatni.

Itt még nem kell figyelni arra, hogy használtuk-e már az adott szót, amellyel folytatni szeretnénk!

step :: Snake -> [String] -> [Snake]

Test>
[] :: [Snake]
Test>
[["ahoy", "yahoo"]] :: [Snake]
Test>
[["obrigado", "okay"], ["obrigado", "obrigado"]] :: [Snake]

Szóhalmaz redukálása

Távolítsuk el a halmazból azokat a szavakat, amelyeket már felhasználtunk a szóláncolatban!

(<->) :: [String] -> Snake -> [String]

Test>
["hola", "okay", "yahoo", "obrigado", "haskell"] :: [String]
Test>
["hola", "okay", "obrigado", "haskell"] :: [String]

Szóláncolat lehetséges folytatásai, ismétlés nélkül

Adjuk meg azt a függvényt, amely egy létező szóláncolathoz megadja annak lehetséges folyatásait! A függvény üres listát adjon vissza, ha nem tudja azt folytatni.

Ebben az esetben a függvény már ügyeljen arra is, hogy a folytatásnál a szavak ne ismétlődhessenek!

step' :: Snake -> [String] -> [Snake]

Test>
[["obrigado", "okay"]] :: [Snake]
Test>
[] :: [Snake]

A step függvény többszöri, egymás utáni alkalmazása

Adjuk meg azt a függvényt, amely egy szóláncolat halmazból előállítja az összes lehetséges szóláncolatot a step függvény iterálásával, melyek a kiinduló láncolatokból keletkezhetnek! Egészen addig ismételjük az alkalmazást, amíg üres szóláncot nem kapunk.

derive :: [Snake] -> [String] -> [Snake]

Test>
[["ahoy"], ["ahoy", "yahoo"], ["ahoy", "yahoo", "okay"], ["ahoy", "yahoo", "obrigado"], ["ahoy", "yahoo", "obrigado", "okay"]] :: [Snake]
Test>
[["hola"], ["hola", "ahoy"], ["hola", "ahoy", "yahoo"], ["hola", "ahoy", "yahoo", "okay"], ["hola", "ahoy", "yahoo", "obrigado"], ["hola", "ahoy", "yahoo", "obrigado", "okay"]] :: [Snake]
Test>
[["hola", "ahoy"], ["hola", "ahoy", "yahoo"], ["hola", "ahoy", "yahoo", "okay"], ["hola", "ahoy", "yahoo", "obrigado"], ["hola", "ahoy", "yahoo", "obrigado", "okay"]] :: [Snake]

Adott karakterrel kezdődő összes szóláncolat

Adjuk meg az összes lehetséges szóláncolatot, amely az adott betűvel kezdődő szavakből indulva előállítja az összes lehetséges szóláncolatot!

snakesStartingWith :: Char -> [String] -> [Snake]

Test>
[["ahoy"], ["ahoy", "yahoo"], ["ahoy", "yahoo", "okay"], ["ahoy", "yahoo", "obrigado"], ["ahoy", "yahoo", "obrigado", "okay"]] :: [Snake]
Test>
[["hola"], ["haskell"], ["hola", "ahoy"], ["hola", "ahoy", "yahoo"], ["hola", "ahoy", "yahoo", "okay"], ["hola", "ahoy", "yahoo", "obrigado"], ["hola", "ahoy", "yahoo", "obrigado", "okay"]] :: [Snake]

A leghosszabb szóláncolat az adott betűből indulva

Definiáljuk azt a függvényt, amely adott betűvel induló szavakból indított szóláncolatok közül megadja a leghosszabbat (amely lehet akár üres is)!

longestSnakeStartingWith :: Char -> [String] -> Snake

Test>
["ahoy", "yahoo", "obrigado", "okay"] :: Snake
Test>
["hola", "ahoy", "yahoo", "obrigado", "okay"] :: Snake
Test>
[] :: Snake

Az összes lehetséges szóláncolat

Adjuk meg azt a függvényt, amely az összes lehetséges szóláncolatot előállítja egy adott szóhalmaz alapján!

allSnakes :: [String] -> [Snake]

Test>
[["ahoy"], ["ahoy", "yahoo"], ["ahoy", "yahoo", "okay"], ["ahoy", "yahoo", "obrigado"], ["ahoy", "yahoo", "obrigado", "okay"], ["hola"], ["haskell"], ["hola", "ahoy"], ["hola", "ahoy", "yaho" ++ […, ……]], ["hola", "ahoy", "yah" ++ […, ……], "ok" ++ […, ……]], ["hola", "aho" ++ […, ……], "ya" ++ […, ……], "o" ++ […, ……]], ["hol" ++ […, ……], "a" ++ […, ……], "y" ++ […, ……], …, ……], ["o" ++ […, ……]], [[…, ……]], […, ……], …, ……] :: [Snake]

Megjegyzés. Korábban definiáltunk egy függvényt, amely megadja, hogy milyen kezdőbetűvel indíthatjuk a láncolatokat. Bátran használjuk ezt is a megoldásban!

A leghosszabb szóláncolat

Adjuk meg azt a függvényt, amely egy adott szóhalmazból képezhető összes szóláncolat közül kiválasztja a leghosszabbat!

longestSnake :: [String] -> Snake

Test>
["hola", "ahoy", "yahoo", "obrigado", "okay"] :: Snake