Használható segédanyagok: Haskell könyvtárainak dokumentációja, (lokális!) Hoogle, a tárgy honlapja és a BE-AD rendszerbe feltöltött beadandók. Ha bármilyen kérdés, észrevétel felmerül, azt a felügyelőknek kell jelezni, nem a diáktársaknak!
A feladatok egymásra épülnek ezért érdemes ezeket a megadásuk sorrendjében megoldani, de legalább megérteni az aktuális feladatot megelőző feladatokat! A függvények definíciójában lehet, sőt javasolt is alkalmazni a korábban definiált függvényeket (függetlenül attól, hogy sikerült-e azokat megadni).
Tekintve, hogy a tesztesetek, bár odafigyelés mellett íródnak, nem fedik le minden esetben a függvény teljes működését, határozottan javasolt még külön próbálgatni a megoldásokat beadás előtt, vagy megkérdezni a felügyelőket!
Részpontszámokat csak az elégséges szint elérése után lehet kapni!
A Base64 egy 64 karakterből álló ábécén alapuló kódolási forma, amely segítségével tetszőleges adatot tudunk szöveges formában tárolni.
A feladatban egy egyszerűsített, tetszőleges (Unicode) karakterekből álló szöveget fogunk ábrázolni 64 előre megadott karakter segítségével. Természetesen a végén megadjuk az eredeti formára való visszaalakításért felelős műveletet is.
A kódoláshoz egy szótárat vezetünk be. A szótár egy rendezett párokból, mint kulcs-érték párokból, álló lista.
(A type
kulcsszó segítségével az Entry
típus az (Int, Char)
típus egy másik neve lesz, illetve a Dictionary
típus az Entry
típusból alkotott listákat jelenteni (ez lesz a szótárunk típusa), 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.)
Mint azt már a bevezetőben említettük, a szótár 64 bejegyzést fog tartalmazni, amelyek az alábbiak:
A
-Z
);a
-z
);0
-9
);+
, /
.Adjuk meg azt a függvényt, amely a fentebb megadott karakterek segítségével előállítja a szótárat!
Megjegyzés. A szótárban nullától kezdődő természetes számokkal (vagyis: 0,1,2…) indexeljük ezeket az elemeket. Törekedjünk a lehető legáltalánosabb megoldás megadására!
Adjuk meg azt a magasabbrendű függvényt, amely segítségével egy sorozatot ki tudunk egészíteni megadott hosszúságúra, amikor arra szükség van!
A függvény első paramétere egy olyan függvény, amely segítségével meg tudjuk adni, milyen módon (jobbról, balról, stb.) szeretnék a listát kiegészíteni. A függvény első paramétere a kiegészítés, a második pedig az kiegészítendő sorozat.
A második paraméter az az elem, amellyel a kiegészítést végezzük.
A harmadik paraméter egy szám, amely azt a méretet adja meg, amire ki akarjuk a listát egészíteni. Természetesen előfordulhat az is, hogy az eredeti sorozat hosszabb, mint a megadott szám, ekkor az eredeti szöveget változatlan formában kell visszaadni.
A negyedik pedig a lista, amelyet kiegészíteni szeretnénk.
A fenti függvény segítségével megadjuk a jobbról és balról kiegészítő függvényeket, amelyekre a későbbiekben egyébként szükségünk is lesz.
A könnyebb olvashatóság kedvéért bevezetünk egy szinomimát a típusra, amely ezzel a BitString
-et definiálja mint számokból álló listát.
Adjuk meg azt a függvényt, amely bitek (0
és 1
értékek) sorozatává alakít egy tetszőleges nemnegatív egész számot!
Adjuk meg azt a függvényt, amely bitek sorozatából előállja annak tízes számrendszerbeli megfelelőjét!
Definiáljuk azt a függvényt, amely egy szöveget bájtok sorozatává alakít!
Megjegyzés. A szöveg elemeit előbb a megfelelő karakter kóddá kell alakítani (ord
), majd azokból bájtokat készíteni. Ne feledjük, hogy 8 bit az 1 bájt! Azaz, ha ennél rövidebb bitsorozatot kapunk, akkor azt egyenként ki kell egészíteni megfelelő hosszúságúra!
Adjuk meg azt a függvényt, amely egy listát a kért hosszúságú darabokra szabdal!
Megjegyzés. Ha a megadott méret nem pozitív szám, akkor az error
függvény segítségével adjunk erről hibajelzést!
Definiáljuk azt a függvényt, amelyik megadja az adott tulajdonságot teljesítő elemek közül az elsőt!
Megjegyzés. Ha a listában nincs a feltételnek megfelelő elem, akkor az error
függvény segítségével adjunk erről hibajelzést!
Adjuk meg azt a függvényt, amely megadja a számnak megfelelő karaktert a szótárból!
Megjegyzés. Ne feledjük, hogy a szótárban nem BitString
értékeket társítottunk a karakterekhez, a BitString
-et előbb át kell alakítani tízes számrendszerbeli számmá.
Adjuk meg azt a függvényt, amely egy tetszőleges szöveget átalakít Base64 formátumú ábrázolásra!
Megjegyzés. Az átalakító algoritmus részletes ismertetése lentebb található.
Az algoritmus szemléltetése:
Az algoritmus lépései:
0
értékekkel (ez az eset akkor fordulhat elő, ha az eredeti szöveg elemeinek száma nem osztható 3-mal). Majd ezt követően daraboljuk fel a bitsorozatot 6 hosszúságú bitsorozatokká.dictionary
felhasználásával a bitsorozatokhoz tartozó karakterek meghatározása.Adjuk meg azt a függvényt, amely az előző függvény (translate
) felhasználásával szabványos Base64 formátumú szöveget állít elő!
Az átfordítás eredménye akkor tekinthető szabványosnak, ha az elemszáma 4-gyel osztható. Ha a translate
függvény eredménye nem ilyen, akkor a szöveget ki kell bővíteni jobbról '='
karakterekkel, hogy ez teljesüljön.
Adjuk meg azt a függvényt, amely megadja az adott karakterhez tartozó szótárbeli indexet bináris formában!
Definiáljuk azt a függvényt, amely a Base64 formátumban megadott szöveget visszaalakítja hagyományos Unicode (UTF-8) kódolásra!
Megjegyzés. Ne feledkezzünk meg a visszafejtés előtt arról, hogy a szöveg '='
karaktereket tartalmazhat (a szabványosítás miatt). Ezekre viszont nincs szükség a visszakódolás során.