Úloha ROT21

Mějme definovanou funkci rot21 takto:

rot21 :: String -> String
rot21 = rot 21

Jedná se o variantu šifry ROT13, od které se liší tím, že místo s anglickou abecedou pracuje s českou abecedou aábcčdďeéěfgh*iíjklmnňoópqrřsštťuúůvwxyýzž, přičemž hvězdička znázorňuje pozici písmena ch.

Počeštěná Caesarova šifra

Napište odpovídající funkci rot :: Int -> String -> String a k ní všechny pomocné funkce, které budou potřeba pro její správné fungování. [10 bodů]

Poznámky

Příklady

> putStrLn $ rot 0 "abc qxž"
abc qxž
> putStrLn $ rot 1 "abc qxž"
ácčrya
> putStrLn $ rot 10 "abc qxž"
fhchvdě
> putStrLn $ rot (-10) "fhchvdě"
abcqxž
> putStrLn $ rot21 "Příliš žluťoučký kůň úpěl ďábelské ódy."
cďwývénýgfágqylychahctýřoósýeyšbrk
> putStrLn $ rot21 "cďwývénýgfágqylychahctýřoósýeyšbrk"
přílišžluťoučkýkůňúpělďábelskéódy
> putStrLn $ rot 8 "!@#$%^&*"

> putStrLn $ rot 123 "*ch*a*"
fý
> putStrLn $ rot (-123) "fý"
cha

Frekvenční analýza počeštěné Caesarovy šifry

Dále napište funkci derot :: (Ord a, Floating a) => String -> [(a, String)], která se pomocí frekvenční analýzy pokusí určit původní znění vstupu před posunutím funkcí rot. [10 bodů]

Výstupem funkce derot bude seznam dvojic (frekvence, vstup). První složka dvojice znázorňuje součet frekvencí jednotlivých písmen, druhá je konkrétní posun. Tyto dvojice budou seřazeny sestupně podle první složky.

Pro rozkódování je nutné použít frekvenční tabulku. Ta se dá zapsat jako seznam desetinných čísel takto:

frequencies :: (Floating a) => [a]
frequencies = [66.98, 21.29, 16.65, 16.01, 10.17, 36.13, 0.19, 78.31, 11.78,
    14.91, 3.94, 3.43, 12.96, 10.07, 45.71, 31.03, 19.83, 37.52, 40.97, 32.62,
    66.76, 0.73, 82.83, 0.32, 34.54, 0.06, 39.77, 11.86, 46.2, 8.17, 55.54,
    0.38, 31.31, 1.45, 5.69, 43.78, 0.72, 0.92, 17.52, 9.42, 21.23, 10.22]

Poznámky

Příklady

> take 5 $ derot "ťdsyisžqžwňžňýlmňťgžugxsráóďsúýňižterýágúlzvěsjěkgydňěéwůžsžwmňdgqsžňhectéžáeě"
[(3310.040000000001,"frekven\269n\237anal\253zafungujedob\345ehlavn\283sdlouh\253mitextyukrat\353
\237chnen\237zaru\269ena\250sp\283\353nost"),(2580.37,"hs\283mx\283o\271okbobn\382abh\367och\367l
\283ep\269\353\283inbxogtenp\367i\382\328ju\283\253uz\367msbu\357k\237o\283okabs\367\271\283obvtr
g\357optu"),(2433.8800000000006,"\233pd\237\250dlblchzlzjxyz\233tl\283tidcnaqdfjz\250lercjntfxkhs
dvswt\237pzs\345chgldlchyzptbdlz\357roe\345lnrs"),(2430.7,"nwk\345cktitqftfse\233fnat\328ark\237u
hxkosfctmy\237suaoe\353pzkdz\271a\345wfz\253q\243tktq\233fwaiktf\225y\367m\253tuyz"),(2382.900000
000001,"q\382ou\233ovmvt\237v\237\250hch\237qdvrd\357onxkao\345\250\237\233vp\225n\250xd\345h\367
\353cofcgdu\382\237cbtsvovtch\237\382dmov\237\271\225\253pbvx\225c")]
> putStrLn . snd . head $ derot "iěázěácďwcňrtesroětnyárápwývěúsmyšúáileěgcg"
vtomtopřípaděsedátěžkodocílithezkéhovýstupu

Vypracování úlohy

Řešení úlohy uložte do souboru rot21.hs a nahrajte do první odevzdávárny. Nejzazší termín pro odevzdání je 14. 3. 2010, 23:59, později již není možné soubor s řešením odevzdat.

← IB016