In deze opdracht coderen we strings bestaande uit 1'en en 0'en in langere versies van die strings.
Die langere versies zijn dan bestand tegen fouten (bv. bij versturen over een netwerk), en afhankelijk van
het soort code kan een fout niet alleen gedetecteerd maar ook gecorrigeerd worden. In deze oefening bouwen
we twee klassen, namelijk Code
en PariteitsCode
. Elke code zet een string van $$a$$ karakters
(enkel 1'en en 0'en) om naar een string van $$b$$ karakters (opnieuw enkel 1'en en 0'en), met $$b > a$$. Vervolgens programmeren
we een klasse Bericht
die in staat is om een string van willekeurige lengte te coderen en te decoderen.
In deze code wordt een string met lengte $$a$$ gecodeerd als een aantal keer $$n$$ deze string na elkaar. Progammeer in deze klasse:
get_grootte()
(zonder argumenten) levert een tuple op bestaande uit de waarden $$a$$ (lengte van de originele string) en $$b$$ (lengte
van de gecodeerde versie (dus $$n\times a$$)) __str__()
(zonder argumenten) levert de stringgedaante $$\verb!Code(a,b)!$$ codeer()
met 1 argument van het type string (je mag aannemen dat deze string enkel uit 1'en en 0'en bestaat, en dat de
string uit $$a$$ karakters bestaat). decodeer()
met 1 argument van het type string (je mag aannemen dat deze string enkel uit 1'en en 0'en bestaat). Hierbij gebruik je
onderstaande aanpak:
'?'
code = Code(4, 2) str(code) #'Code(4,8)' te_coderen = ['1001', '1011'] gecodeerd = [code.codeer(i) for i in te_coderen] #['10011001', '10111011'] te_decoderen = ['10011001', '10011011', '10111011', '10011011', '1001001'] gedecodeerd = [code.decodeer(i) for i in te_decoderen] #['1001', '10?1', '1011', '10?1', '????']
Code
. De codering bestaat erin dat per groep van $$a$$ karakters (allen '0' of '1') precies
1 karakter toegevoegd wordt, zodat de gecodeerde versie uit $$b = a+1$$ karakters bestaat. Programmeer in deze klasse:
codeer()
met 1 argument (een string bestaande uit $$a$$ karakters '0' of '1'). Het resultaat
is dezelfde string aangevult met een karakter, zodat het totaal aantal 1'en in de string even is.decodeer()
met 1 argument (een string bestaande uit karakters '0' of '1'). Indien het argument een lengte
heeft verschillend van $$b$$, of indien het argument een oneven aantal '1'-en bevat, is het resultaat een opeenvolging van $$a$$ vraagtekens.
In alle andere gevallen is het resultaat de eerste $$a$$ karakters van het argument.
code = PariteitsCode(4) str(code) #'Code(4,5)' te_coderen = ['1001', '1011'] gecodeerd = [code.codeer(i) for i in te_coderen] #['10010', '10111'] te_decoderen = ['10010', '10011', '10111', '10010', '1001'] gedecodeerd = [code.decodeer(i) for i in te_decoderen] #['1001', '????', '1011', '1001', '????']
Voorgaande klassen zijn in staat om strings van vooropgegeven lengte te coderen en te decoderen. In de klasse Bericht
is het de bedoeling om strings van willekeurige lengte (bestaande uit louter 1'en en 0'en) te coderen en te decoderen.
Programmeer in deze klasse:
__str__()
levert het constructorargument (dus een string) als resultaat codeer()
met 1 argument, namelijk een object, waarvan je mag aannemen dat het tot de klasse
Code
of een afgeleide klasse ervan behoort. De methode levert een gecodeerde versie van de string die bij constructie
van het Bericht
opgegeven werd. Dit resultaat bereik je als volgt:
decodeer()
met 1 argument, namelijk een object, waarvan je mag aannemen dat het tot de klasse
Code
of een afgeleide klasse ervan behoort. De methode levert een gedecodeerde versie van de string die bij constructie
van het Bericht
opgegeven werd. Dit resultaat bereik je als volg:
'?'
bericht = Bericht('100101') code = Code(4, 2) pariteit = PariteitsCode(4) c_code = bericht.codeer(code) #'1001100101000100' p_code = bericht.codeer(pariteit) #'1001001001' bericht_c = Bericht(c_code) bericht_c.decodeer(code) # '10010100' bericht_p = Bericht(p_code) bericht_p.decodeer(pariteit) # '10010100' b1 = Bericht('1001100101000100') b1.decodeer(code) # '10010100' b2 = Bericht('1001001001') b2.decodeer(pariteit) # '10010100'