Bij het uitlezen van deze digitale zevensegmentendisplays zijn de cijfers op de vijfde rij weggevallen. Kan je bepalen welke cijfers daar moeten staan?
Het zijn dezelfde cijfers als die op de eerste rij. We hebben de segmenten van de cijfers op de bovenste twee rijen ingekleurd, zodat je gemakkelijker kan zien dat de cijfers op een rij aangeven hoeveel segmenten van elk type (kleur) voorkomen in de vorige rij. Dit is ook de enige cyclus die na vier stappen terug in herhaling valt.
Zoals de naam al doet vermoeden, bestaat een zevensegmentendisplay uit zeven segmenten. Als de zeven segmenten allemaal aan staan, dan vormen ze het cijfer 8. We nummeren de segmenten vanaf nul in de gebruikelijke leesvolgorde: van links naar rechts en van boven naar onder.
Door bepaalde segmenten gericht aan of uit te zetten, kunnen we op de volgende manier de tien decimale cijfers van een zevensegmentendisplay uitlezen.
Hierbij worden de segmenten die aan staan in het rood weergegeven. Merk op dat het cijfer 1 weergegeven wordt door enkel de twee segmenten aan de linkerkant aan te zetten, en niet de twee segmenten aan de rechterkant. Dit is een detail dat wel degelijk belangrijk is met het oog op wat volgt.
De weergave van een cijfer op een zevensegmentendisplay wordt voorgesteld als een verzameling (set) met de nummers (int) van de segmenten die aan staan op het display. Zo wordt de weergave van cijfer 3 bijvoorbeeld voorgesteld als de verzameling $$\{0, 2, 3, 5, 6\}$$. Voor de tien decimale cijfers zijn dit de segmenten die aan staan op een zevensegmentendisplay:
cijfer | segmenten |
---|---|
0 | 0, 1, 2, 4, 5, 6 |
1 | 1, 4 |
2 | 0, 2, 3, 4, 6 |
3 | 0, 2, 3, 5, 6 |
4 | 1, 2, 3, 5 |
5 | 0, 1, 3, 5, 6 |
6 | 0, 1, 3, 4, 5, 6 |
7 | 0, 2, 5 |
8 | 0, 1, 2, 3, 4, 5, 6 |
9 | 0, 1, 2, 3, 5, 6 |
Een uitlezing $$u = u_0u_1u_2u_3u_4u_5u_6$$ van zeven cijfers op zeven zevensegmentendisplays wordt voorgesteld als een string (str) met de zeven cijfers. Voor elke uitlezing $$u$$ kunnen we een volgende uitlezing $$v = v_0v_1v_2v_3v_4v_5v_6$$ bepalen, waarbij $$v_i$$ ($$i = 0, \ldots, 6$$) aangeeft hoeveel keer segment $$i$$ aan staat in de weergave van de cijfers van uitlezing $$u$$.
Gevraagd wordt:
Schrijf een functie cijfer2segmenten waaraan een decimaal cijfer $$d$$ (int) moet doorgegeven worden. Als $$d$$ geen geldig decimaal cijfer is, dan moet de functie een AssertionError opwerpen met de boodschap ongeldig cijfer. Anders moet de functie de weergave van cijfer $$d$$ op een zevensegmentendisplay teruggeven.
Schrijf een functie segmenten2cijfer waaraan de weergave $$s$$ van een decimaal cijfer op een zevensegmentendisplay moet doorgegeven worden. Als $$s$$ geen geldige weergave is, dan moet de functie een AssertionError opwerpen met de boodschap ongeldige segmenten. Anders moet de functie het decimaal cijfer (int) dat correspondeert met $$s$$ teruggeven.
Schrijf een functie volgende_uitlezing waaraan een uitlezing $$u$$ moet doorgegeven worden. Als $$u$$ geen geldige uitlezing is, dan moet de functie een AssertionError opwerpen met de boodschap ongeldige uitlezing. Anders moet de functie de uitlezing teruggeven die volgt op uitlezing $$u$$.
Schrijf een functie cyclus waaraan een uitlezing $$u$$ moet doorgegeven worden. Als $$u$$ geen geldige uitlezing is, dan moet de functie een AssertionError opwerpen met de boodschap ongeldige uitlezing. Anders moet de functie een lijst (list) teruggeven die begint met uitlezing $$u$$, gevolgd door alle volgende uitlezingen, totdat er een uitlezing volgt die eerder al in de lijst voorkwam. Die laatste (herhaalde) uitlezing moet zelf niet in de lijst opgenomen worden.
>>> cijfer2segmenten(3)
{0, 2, 3, 5, 6}
>>> cijfer2segmenten('A')
Traceback (most recent call last):
AssertionError: ongeldig cijfer
>>> segmenten2cijfer({0, 5, 2, 6, 3})
3
>>> segmenten2cijfer([2, 3, 5])
Traceback (most recent call last):
AssertionError: ongeldige segmenten
>>> volgende_uitlezing('4635263')
'6447366'
>>> volgende_uitlezing('6447366')
'5546374'
>>> volgende_uitlezing('5546374')
'5546174'
>>> volgende_uitlezing('5546174')
'4635263'
>>> volgende_uitlezing('ABCDEFG')
Traceback (most recent call last):
AssertionError: ongeldige uitlezing
>>> cyclus('4635263')
['4635263', '6447366', '5546374', '5546174']
>>> cyclus('4436426')
['4436426', '4557364', '5546174', '4635263', '6447366', '5546374']
>>> cyclus('ABCDEFG')
Traceback (most recent call last):
AssertionError: ongeldige uitlezing