Kódfejtés

Általános tudnivalók

Használható segédanyagok: GHC dokumentáció, Hoogle, a tárgy honlapja és a BE-AD rendszerbe feltöltött beadandók. Ha bármi kérdés, észrevétel felmerül azt a felügyelőnek jelezzétek, NE a mellettetek ülőnek!

A feladat összefoglaló leírása

A feladatban egy kódfeltörő játék részeit kell egymás után megvalósítani. A játékot a számítógép ellen tudjuk játszani, ahol a játékos kap egy 4 számjegyből álló titkos kódot, amelyet tippelgetéssel kell kitalálnia.

A tippelés eredményéről a játékos fekete és fehér kavicsok formájában kap tájékoztatást:

Tehát, például, ha a titkos kód “4271” és a tipp “1234”, akkor a válasz: ,,1 fekete kavics és 2 fehér kavics’’ (ahol a fekete kavics a “2”-esre, míg a két fehér kavics a “4”-re és az “1”-re utal).

A cél, hogy a tippelések során elérjük a 4 fekete kavicsot.

Fekete kavicsok száma (2 pont)

Készítsük el a fekete kavicsok számát meghatározó függvényt: a függvény két listát kap, amelyekről el kell döntenie, hogy mennyi elem egyezik meg érték és pozíció szerint!

blackStones :: (Eq a) => [a] -> [a] -> Int

Test>
1 :: Int
Test>
0 :: Int
Test>
3 :: Int

Fehér kavicsok száma (3 pont)

Készítsük el a fehér kavicsok számát meghatározó függvényt: a függvény két listát kap és ezekről kell eldöntenie, hogy mennyi elemük egyezik meg pontosan pozíciótól függetlenül!

whiteStones :: (Eq a) => [a] -> [a] -> Int

Test>
2 :: Int
Test>
1 :: Int
Test>
0 :: Int
Test>
2 :: Int

A kód típusa (2 pont)

Definiáljuk Code néven egy algebrai adattípust a kódok ábrázolására: célunk, hogy csak pontosan négy számjegyet (0-9) tudjunk benne eltárolni!


Test>
Code '1' '2' '5' '8' :: Code

Kódbeolvasás (1 pont)

Készítsünk egy függvényt, amely a Maybe algebrai adattípus felhasználásával egy normál karakteres sorozatból képes létrehozni ilyen kódokat. Amennyiben nem sikerül a kapott adat értelmezése, akkor ezzel jelezzük, hogy érvénytelen!

readCode :: String -> Maybe Code

Test>
Just (Code '1' '2' '3' '4') :: Maybe Code
Test>
Nothing :: Maybe Code
Test>
Nothing :: Maybe Code

Kód listává alakítása (1 pont)

Adjuk meg azt a függvényt, amely tetszőleges kódot át tud alakítani lista alapú ábrázolásra!

toList :: Code -> [Char]

Test>
"1234" :: [Char]
Test>
"9876" :: [Char]

Tipp kiértékelése (3 pont)

Az előbbiek felhasználásával definiáljunk egy olyan függvényt, amely a titkos kód, valamint egy felhasználótól érkező, szöveges formátumban levő tipp alapján megadja, hogy arra vonatkozóan mennyi fekete és fehér kavicsot jelent! A függvény ellenőrizze, hogy a tipp az helyes formátumú-e, ellenkező eseben az eredmény legyen mindkét fajta kavicsra nulla!

whiteAndBlackStones :: Code -> String -> (Int,Int)

Test>
(2, 1) :: (Int, Int)
Test>
(1, 0) :: (Int, Int)
Test>
(0, 0) :: (Int, Int)

Pontozás