De Mengenlehreuhr (Duits voor verzamelingenleeruurwerk) of Berlin Uhr (Duits voor Berlijnse klok) was de eerste klok ter wereld die op een publieke plaats de tijd aanduidde door middel van lampen die gekleurd oplichten. Om die reden werd ze bij haar installatie op 17 juni 1975 ook opgenomen in The Guinness Book of Records1. De klok werd ontworpen door Dieter Binninger in opdracht van de senaat van de Duitse hoofdstad Berlijn2 en stond oorspronkelijk in de Kurfürstendamm op de hoek met de Uhlandstraße. Nadat de senaat in 1995 opdracht gaf om de klok daar weg te halen, verhuisde ze naar de voorkant van het Europa-Center in de Budapester Straße. Daar staat ze vandaag nog altijd staat.
De Mengenlehreuhr bestaat uit 24 lampen. Deze lampen zijn verdeeld over één ronde knipperende gele lamp aan de bovenkant die de seconden aanduidt, twee rijen bovenaan die de uren aanduiden en twee rijen onderaan die de minuten aanduiden.
De klok moet gelezen worden van de bovenste rij tot de onderste rij. De vier rode lampen op de bovenste rij staan telkens voor vijf volle uren, en de vier rode lampen op de tweede rij staan telkens voor een vol uur. Samen geven ze het uur aan op een 24-uursklok. De derde rij bestaat uit elf rode en gele lampen, die telkens staan voor vijf minuten (de rode lampen geven respectievelijk aan dat er 15, 30 of 45 minuten verstreken zijn), en de vier gele lampen op de onderste rij staan telkens voor één minuut. De ronde knipperende gele lamp aan de bovenkant geeft de even (indien opgelicht) of oneven (indien gedimd) seconden aan.
Als we de foto van de klok die hierboven staat als voorbeeld nemen, dan zien we dat er twee lampen opgelicht worden op de eerste rij (vijf uur vermenigvuldigd met twee geeft tien uur), en dat alle lampen op de tweede rij gedimd zijn. De klok geeft dus 10 uur aan. Zes lampen zijn opgelicht op de derde rij (vijf minuten vermenigvuldigd met zes geeft dertig minuten), terwijl er op de onderste rij slechts één lamp is opgelicht (plus één minuut). Alle lampen die opgelicht zijn op de klok geven dus samen aan dat het 10:31 is op een 24-uursklok. Hieronder staan nog enkele voorbeelden:
Merk op dat de Mengenlehreuhr in principe elk tijdstip kan aangeven van middernacht (00:00) tot 24:59, wat dus voorbij de grens van 23:59 gaat op een 24-uursklok. Eén minuut na 23:59 worden alle lampen van de Mengenlehreuhr echter terug gedimd, en begint de volgende dag.
Definieer een klasse Mengenlehreuhr die toelaat om klokken van het type Mengenlehreuhr voor te stellen in Python. Deze klasse moet minstens de volgende methoden ondersteunen:
Een initialisatiemethode waaraan twee natuurlijke getallen moeten doorgegeven worden die respectievelijk het aantal uren $$u$$ ($$0 \leq u < 24$$) en het aantal minuten $$m$$ ($$0 \leq m < 60$$) op een 24-uursklok aangeven. Als de argumenten geen integers zijn die binnen de opgegeven grenzen liggen, dan moet er een AssertionError opgeworpen worden met de boodschap ongeldig tijdstip.
Een methode verzetUren met een optionele parameter waaraan een getal $$u \in \mathbb{Z}$$ kan doorgegeven worden (standaardwaarde: 1). De methode moet de tijd die wordt aangeduid door de klok het gegeven aantal uren $$u$$ vooruit (als $$u > 0$$) of achteruit (als $$u < 0$$) zetten. Hierbij moet rekening gehouden worden met het feit dat op een 24-uursklok 23 uur gevolgd wordt door 0 uur, en dus ook dat 0 uur voorafgegaan wordt door 23 uur. De methode moet een referentie teruggeven naar het object waarop de methode werd aangeroepen.
Een methode verzetMinuten met een optionele parameter waaraan een getal $$m \in \mathbb{Z}$$ kan doorgegeven worden (standaardwaarde: 1). De methode moet de tijd die wordt aangeduid door de klok het gegeven aantal minuten $$m$$ vooruit (als $$m > 0$$) of achteruit (als $$m < 0$$) zetten. Hierbij moet eventueel naar een volgend/vorig uur gesprongen worden, en moet rekening gehouden worden met het feit dat op een 24-uursklok 23:59 gevolgd wordt door 00:00, en dus ook dat 00:00 voorafgegaan wordt door 23:59. De methode moet een referentie teruggeven naar het object waarop de methode werd aangeroepen.
Een methode lampen waaraan geen argumenten kunnen doorgegeven worden. De methode moet een tuple teruggeven met vier natuurlijke getallen die aangeven hoeveel lampen aan staan op elke rij van de klok (opgelijst van boven naar onder), zonder rekening te houden met de lamp die de seconden aanduidt.
Een methode __repr__ die een stringvoorstelling van het object teruggeeft. Deze string moet een Python statement bevatten dat aangeeft hoe een object van de klasse Mengenlehreuhr moet aangemaakt worden dat is ingesteld op dezelfde tijd die momenteel wordt aangeduid door het object waarop de methode wordt aangeroepen. Bekijk onderstaand voorbeeld om te zien hoe deze stringvoorstelling er precies moet uitzien.
Een methode __str__ die een stringvoorstelling van het object teruggeeft. Deze string moet een grafische voorstelling van de Berlijnse klok weergeven. Daarbij wordt elke rij van de klok op een afzonderlijke regel weergegeven, waarbij de rij met de lamp die de seconden aangeeft genegeerd wordt. Lampen op rijen met vier lampen worden voorgesteld door vier hekjes (####) en lampen op de rij met elf lampen door één enkel hekje (#). De voorstellingen van de lampen op dezelfde rij worden telkens van elkaar gescheiden door één enkele spatie. Op de regels die corresponderen met rijen met vier lampen wordt vooraan een extra spatie toegevoegd. Er staan nooit spaties op het einde van een regel. Bekijk onderstaand voorbeeld om te zien hoe deze stringvoorstelling er precies moet uitzien.
>>> klok = Mengenlehreuhr(10, 31)
>>> klok.lampen()
(2, 0, 6, 1)
>>> klok
Mengenlehreuhr(10, 31)
>>> print(klok)
#### #### ---- ----
---- ---- ---- ----
# # # # # # - - - - -
#### ---- ---- ----
>>> klok.verzetUren()
Mengenlehreuhr(11, 31)
>>> klok.lampen()
(2, 1, 6, 1)
>>> klok.verzetUren(9)
Mengenlehreuhr(20, 31)
>>> klok.lampen()
(4, 0, 6, 1)
>>> print(klok)
#### #### #### ####
---- ---- ---- ----
# # # # # # - - - - -
#### ---- ---- ----
>>> klok.verzetMinuten()
Mengenlehreuhr(20, 32)
>>> klok.lampen()
(4, 0, 6, 2)
>>> klok.verzetMinuten(42)
Mengenlehreuhr(21, 14)
>>> klok.lampen()
(4, 1, 2, 4)
>>> print(klok)
#### #### #### ####
#### ---- ---- ----
# # - - - - - - - - -
#### #### #### ####
>>> klok.verzetMinuten(165)
Mengenlehreuhr(23, 59)
>>> klok.lampen()
(4, 3, 11, 4)
>>> print(klok)
#### #### #### ####
#### #### #### ----
# # # # # # # # # # #
#### #### #### ####
>>> klok.verzetMinuten()
Mengenlehreuhr(0, 0)
>>> klok.lampen()
(0, 0, 0, 0)
>>> print(klok)
---- ---- ---- ----
---- ---- ---- ----
- - - - - - - - - - -
---- ---- ---- ----
>>> klok.verzetUren(10).verzetMinuten(17)
Mengenlehreuhr(10, 17)
>>> klok.lampen()
(2, 0, 3, 2)
>>> print(klok)
#### #### ---- ----
---- ---- ---- ----
# # # - - - - - - - -
#### #### ---- ----
>>> Mengenlehreuhr(42, 42)
Traceback (most recent call last):
AssertionError: ongeldig tijdstip
Speel gerust een beetje met onderstaande interactieve voorstelling van de Mengenlehreuhr.
De Mengenlehreuhr zou ook wel eens de sleutel kunnen zijn tot het ontcijferen van de onopgeloste sectie van Kryptos3, het standbeeld voor het hoofdkantoor van de CIA.
Nadat hij in 2010 had onthuld dat het gedeelte van de code op posities 64–69 gedecodeerd wordt als BERLIN, gaf de beeldhouwer — Jim Sandborn — in november 2014 nog een aanwijzing aan de New York Times dat de letters op posities 70–74 in de code (dit zijn de letters MZFPK) moeten gedoceerd worden als CLOCK. Dit is dus een rechtstreekse verwijzing naar de Berlijnse klok. Sandborn verklapte bovendien ook dat om de code te kraken
You'd better delve into that paricular clock.
Hij voegde er echter ook nog het volgende aan toe.
There are several really interesting clocks in Berlin.