Je bevindt je in een donkere kamer. Het enige licht komt van de leds van een oude digitale wekker met vier zevensegmentendisplays. Die geven de tijd weer in 24-uursnotatie HH:MM (geen seconden), waarbij het eerste cijfer leeg is als het niet gebruikt wordt. Hoeveel tijd verstrijkt er tussen het moment waarop de kamer het donkerst is en het moment waarop ze het meest verlicht is?

18 uur en 56 minuten (vanaf 1:11 tot 20:08). We rekenen 18 uur en 57 minuten ook goed, maar technisch gezien loopt het interval van het laatste moment van 1:11 tot het eerste moment van 20:08.

Opgave

Een zevensegmentendisplay is een elektronisch apparaat waarmee cijfers (en soms ook letters) kunnen weergegeven worden. Het display bestaat uit zeven staafvormige segmenten die gerangschikt zijn in de vorm van het cijfer 8. Elk segment kan afzonderlijk aan of uit gezet worden. Daarmee kan je redelijk leesbaar alle cijfers vormen, maar ook de letters A, b, C, d, E en F, bijvoorbeeld voor de weergave van hexadecimale getallen1. Soms is er ook een achtste segment waarmee een decimaal punt kan voorgesteld worden, maar dat laten we voor deze opgave buiten beschouwing.

De individuele segmenten worden aangeduid met een letter. Het bovenste segment is A, de segmenten rechts zijn B en C, het onderste segment is D, de linkse segmenten zijn E en F, en het middelste segment is G. Men kan dan schrijven dat voor het weergeven van het cijfer 5, de segmenten A, F, G, C en D moeten oplichten. De volgorde waarin de letters van de segmenten opgelijst worden, maakt daarbij geen verschil.

zevensegmentendisplay
Weergave van de hexadecimale cijfers op een zevensegmentendisplay.
zevensegmentendisplay
Letters voor de individuele segmenten van een zevensegmentendisplay.

Definieer een klasse Display waarmee zevensegmentendisplays kunnen voorgesteld worden. Bij het aanmaken van een display (Display) moet een string (str) doorgegeven worden met de hoofdletters van de segmenten die moeten oplichten op het display. Als de string een karakter bevat waarmee geen segment wordt aangeduid, of als dezelfde letter meerdere keren voorkomt in de string, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige segmenten. Displays (Display) zijn onveranderlijk (immutable).

Als er een display (Display) wordt doorgegeven aan de ingebouwde functie len, dan moet de lichtsterkte van het display teruggegeven worden als een natuurlijk getal (int) dat aangeeft hoeveel segmenten van het display oplichten.

Als er een display (Display) wordt doorgegeven aan de ingebouwde functie repr, dan moet een stringvoorstelling (str) teruggegeven worden die leest als een Python-expressie waarmee een nieuw display (Display) aangemaakt wordt met dezelfde segmenten die oplichten als het display die aan de functie repr werd doorgegeven. Hierbij moeten de letters van de segmenten in alfabetische volgorde weergegeven worden.

Als er een display (Display) wordt doorgegeven aan de ingebouwde functie str, dan moet een stringvoorstelling (str) teruggegeven worden die bestaat uit 5 regels. Als alle segmenten oplichten, dan ziet de voorstelling van het cijfer 8 er als volgt uit:

 -- 
|  |
 -- 
|  |
 -- 

Hierbij bevat elke regel vier karakters (dus eventueel spaties op het einde). De karakters van segmenten die niet oplichten moeten vervangen worden door spaties.

Voor twee displays (Display) $$d$$ en $$e$$ moeten de volgende ingebouwde Python-operatoren telkens een nieuw display (Display) teruggeven:

bewerking resultaat
$$d$$ & $$e$$ een display (Display) waarvan alleen de segmenten opgelicht zijn die zowel in $$d$$ als in $$e$$ opgelicht zijn
$$d$$ - $$e$$ een display (Display) waarvan alleen de segmenten opgelicht zijn die in $$d$$ opgelicht zijn, maar niet in $$e$$
$$d$$ | $$e$$ een display (Display) waarvan alleen de segmenten opgelicht zijn die in $$d$$ of in $$e$$ opgelicht zijn, of in beide
$$d$$ ^ $$e$$ een display (Display) waarvan alleen de segmenten opgelicht zijn die in $$d$$ of in $$e$$ opgelicht zijn, maar niet in beide
~$$d$$ een display (Display) waarvan alleen de segmenten opgelicht zijn die niet opgelicht zijn in $$d$$

Voorbeeld

Opmerking

Je kan onderstaande voorbeeldsessie rechtstreeks gebruiken als docstring. Let er wel op dat sommige regels eindigen op spaties en dat die belangrijk zijn voor het uitvoeren van doctests. Als je een IDE gebruikt die ingesteld is om automatisch witruimte te verwijderen op het einde van regels, dan zal je deze functionaliteit dus moeten uitschakelen.

>>> drie = Display('GBADC')
>>> drie
Display('ABCDG')
>>> print(drie)
 -- 
   |
 -- 
   |
 -- 
>>> len(drie)
5
>>> vier = Display('FBGC')
>>> vier
Display('BCFG')
>>> print(vier)
    
|  |
 -- 
   |
    
>>> len(vier)
4
>>> drie & vier
Display('BCG')
>>> drie - vier
Display('AD')
>>> drie | vier
Display('ABCDFG')
>>> drie ^ vier
Display('ADF')
>>> ~vier
Display('ADE')