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
.
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ů]
ch
, protože se sestává ze dvou znaků. Budete s ním muset nakládat jako se speciálním případem. Případný nejednoznačný převod zaviněný tímto dvojznakem ignorujte. (Příkladem této nejednoznačnosti je rot21 $ rot21 "pú"
→ "ů"
.)putStrLn
z modulu System.IO.UTF8. Ta, na rozdíl od výchozí funkce putStrLn
, zobrazí diakritiku přímo.> 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
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]
on
z modulu Data.Function.> 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
Ř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.