Een Bericht
dat over een netwerk (dat aan fouten onderhevig is) gestuurd wordt,
wordt gekenmerkt door de boodschap die verstuurd wordt en de Code
die gebruikt wordt om de communicatie foutbestendig te maken.
Programmeer het onderstaande in de klasse Bericht
:
Code
.
Je mag veronderstellen de code een geldige code voorstelt.
__str__()
die de boodschap van het Bericht
tussen [
en ]
weergeeft, gevolgd door de gebruiksvriendelijke stringgedaante van de Code
van het Bericht
.
codeer()
(zonder argumenten). Deze methode zet de boodschap van het Bericht
om in een lijst van '1'-en en '0'-en die als resultaat teruggegeven wordt.
Hierbij ga je als volgt tewerk:
ord()
. Deze byte wordt op zijn beurt naar een rij van 8 bits omgezet. De boodschap 'A'
(int-waarde 65), wordt dus omgezet naar de lijst [1,0,0,0,0,0,1,0]
(bemerk dat de meest-significante bit uiterst rechts staat!), de boodschap 'B'
naar de lijst [0,1,0,0,0,0,1,0]
, en de boodschap 'AB'
naar de lijst [1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0]
.
"AB"
voorstelt (en een lengte heeft van 16) dus aanvullen met 6 nullen. Er komt op die manier [1,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0]
.
decodeer()
, met als argument een te decoderen lijst van bits. Ga hierbij als volgt tewerk:
chr()
. Overtollige 0-bits (door aanvullen ontstaan)
laat je hierbij buiten beschouwing.
ruis(bitlijst, n, a)
gegeven, met als argumenten:
import random def ruis(bit, n, a): for i in range(len(bit)//n): index = list(range(n)) random.shuffle(index) for j in range(a): bit[i*n+index[j]] = 1 if bit[i*n+index[j]] == 0 else 0
TIP: In je code zal je een bericht (string) moeten omzetten naar een bitpatroon. Hierbij kunnen volgende tips helpen om je code wat compacter te houden:
format(ord(c), '08b')
zet een karakter c
om naar een binaire string. Let erop dat in deze string de MINST significante bit achteraan staat.s
om te draaien, kan je de slice s[::-1]
gebruiken!''.join(...)
om bitpatronen (strings) aaneen te schakelen als je een for
-lus wil vermijden.Je hoeft je oplossing voor de klassen BinaireVeelterm
en Code
niet mee in te dienen op Dodona (maar dit mag wel).
b_A = Bericht('A', code) print(b_A) # [A](15,2048)[x**4+x**1+1] c_A = b_A.codeer() print(str(c_A)) # [1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0] b_cA = Bericht('?', code) b_cA.decodeer(c_A) print(b_cA) # [A](15,2048)[x**4+x**1+1] b_AB = Bericht('AB', code) print(b_AB) # [AB](15,2048)[x**4+x**1+1] c_AB = b_AB.codeer() print(str(c_AB)) # [1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, # 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0] b_cAB = Bericht('?', code) b_cAB.decodeer(c_AB) print(b_cAB) # [AB](15,2048)[x**4+x**1+1] b_w = Bericht('abc123', code) print(b_w) # [abc123](15,2048)[x**4+x**1+1] c = b_w.codeer() print(str(c)) # [1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, # 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, # 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, # 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, # 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] b_c = Bericht('?', code) b_c.decodeer(c) # [abc123](15,2048)[x**4+x**1+1] print(b_c)