Voor wie moeite heeft met kloklezen is er de Qlocktwo1 — een design van Biegert & Funk. Deze bijzonder vormgegeven klok geeft de tijd niet weer in cijfers maar in woorden, waarbij de tijdsweergave slechts om de vijf minuten verandert: om 7:30 geeft de klok de tijd weer als HET IS HALF ACHT.
Qlocktwo bestaat uit een reeks letters die gerangschikt zijn in een rechthoekig rooster. Hierbij nummeren we de rijen van het rooster van boven naar onder, en de kolommen van links naar rechts, telkens vanaf nul.
Een tijdstip $$u:m$$ ($$0 \leq u < 24$$ en $$0 \leq m < 60$$, waarbij $$m$$ een veelvoud is van 5) op een 24-uursklok wordt op de Qlocktwo in woorden weergegeven volgens de omschrijvingen in onderstaande tabel.
$$m$$ | omschrijving |
---|---|
0 | HET IS $$t_u$$ UUR |
5 | HET IS VIJF OVER $$t_u$$ |
10 | HET IS TIEN OVER $$t_u$$ |
15 | HET IS KWART OVER $$t_u$$ |
20 | HET IS TIEN VOOR HALF $$t_{u + 1}$$ |
25 | HET IS VIJF VOOR HALF $$t_{u + 1}$$ |
30 | HET IS HALF $$t_{u + 1}$$ |
35 | HET IS VIJF OVER HALF $$t_{u + 1}$$ |
40 | HET IS TIEN OVER HALF $$t_{u + 1}$$ |
45 | HET IS KWART VOOR $$t_{u + 1}$$ |
50 | HET IS TIEN VOOR $$t_{u + 1}$$ |
55 | HET IS VIJF VOOR $$t_{u + 1}$$ |
Hierbij is $$t_u$$ de omschrijving in woorden van uur $$u$$ op een 12-uursklok (waarbij $$t_0$$ en $$t_{12}$$ worden omschreven als TWAALF). Elk woord van de tijdsweergave wordt gevormd door opeenvolgende letters op één rij in het rooster, en loopt dus nooit over twee of meer rijen. Hieronder tonen we een geldig (groen) en ongeldig (rood) voorkomen van het woord NA op de Qlocktwo.
Sommige woorden kunnen meerdere keren in het rooster voorkomen. Zo komt het woord OVER tweemaal voor in de weergave uit onderstaande figuur (midden). Voor de plaatsing van de opeenvolgende woorden van de tijdsweergave op de Qlocktwo kiezen we telkens het eerstvolgende voorkomen van een woord als we het rooster van letters van links naar rechts en van boven naar onder doorlopen. De woorden mogen elkaar nooit overlappen en als twee opeenvolgende woorden van de tijdsweergave op dezelfde rij van het rooster staan, dan moet er bovendien minstens één letter tussen staan (zoals tussen HET, IS en VIJF in onderstaande figuur, links).
De tijdsweergave HET IS VIJF OVER NEGEN gebruikt daardoor het eerste voorkomen van het woord OVER in bovenstaande figuur (blauw), terwijl de tijdsweergave HET IS KWART OVER TWAALF gebruik moet maken van het tweede voorkomen van het woord OVER (oranje).
Definieer een klasse Qlocktwo waarmee klokken kunnen voorgesteld worden die — zoals de Qlocktwo — de tijd in woorden weergeven op een rechthoekig rooster van letters. Bij het instantiëren van een object van de klasse Qlocktwo moet een string (String) doorgegeven worden met de letters uit het rooster van de klok, waarbij letters van het rooster worden doorlopen van links naar rechts, en van boven naar onder. Standaard wordt uitgegaan van een vierkant rooster, maar er kan ook een natuurlijk getal als tweede argument doorgegeven worden dat het aantal kolommen van het rooster aangeeft. Als er geen geldige argumenten doorgegeven worden bij het instantiëren van een object van de klasse Qlocktwo, dan moet een AssertionError opgeworpen worden met de boodschap ongeldig rooster. Voorts moet de klasse Qlocktwo minstens de volgende methoden ondersteunen:
Een methode toString waaraan geen argumenten moeten doorgegeven worden. De methode moet een stringvoorstelling (String) van het rechthoekig rooster van letters van de klok teruggeven. Hierbij moeten de rijen van het rooster elk op een afzonderlijke regel staan, moeten alle letters op een rij na elkaar staan (zonder tussenliggende karakters), en moeten alle letters weergegeven worden als hoofdletter.
Een methode posities waaraan een woord $$w$$ (String) moet doorgegeven worden. De methode moet een array (Array) teruggeven met alle voorkomens van $$w$$ in het rooster van de klok, waarbij de voorkomens opgelijst worden in de volgorde waarbij het rooster van links naar rechts en van boven naar onder wordt doorlopen. De voorkomens van $$w$$ mogen elkaar overlappen. Een voorkomen van $$w$$ wordt zelf omschreven door een array $$[r, k]$$ (Array), waarbij $$r$$ (Number) het rijnummer en $$k$$ (Number) het kolomnummer is waar de eerste letter van $$w$$ voorkomt in het rooster. Bij het zoeken naar voorkomens van het gegeven woord $$w$$ mag de methode geen onderscheid maken tussen hoofdletters en kleine letters. Aan de methode kan optioneel als tweede argument een array $$[r_s, k_s]$$ (Array) doorgegeven worden. In dat geval moet de array die wordt teruggegeven enkel de voorkomens bevatten vanaf de cel op rij $$r_s$$ en kolom $$k_s$$, als het rooster van links naar rechts en van boven naar onder wordt doorlopen. Als het argument $$[r_s, k_s]$$ geen geldige positie aanduidt van een cel in het rooster, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige positie.
Een methode weergave waaraan een string (String) moet doorgegeven worden met de omschrijving $$u:m$$ ($$0 \leq u < 24, 0 \leq m < 60$$) van een tijdstip op een 24-uursklok, waarbij $$m$$ een veelvoud is van 5. Hierbij mogen uren $$u$$ en minuten $$m$$ die bestaan uit één cijfer voorafgegaan worden door een voorloopnul. Als het argument geen tijdstip voorstelt dat voldoet aan de vorige omschrijving, dan moet een AssertionError opgeworpen worden met de boodschap ongeldig tijdstip. Anders moet de methode een string (String) teruggeven met de omschrijving van het tijdstip in woorden, zoals die gebruikt wordt door de Qlocktwo.
Een methode visueel waaraan een argument moet doorgegeven worden met dezelfde betekenis als bij de methode weergave (inclusief het opwerpen van een AssertionError indien het gegeven tijdstip niet geldig is). De methode moet dezelfde stringvoorstelling (String) teruggeven als de methode toString, maar waarbij alle posities in het rooster die geen deel uitmaken van de weergave in woorden van het gegeven tijdstip voorgesteld worden door koppeltekens (-). Als het gegeven tijdstip niet in het rooster kan weergegeven worden, dan moet een AssertionError opgeworpen worden met de boodschap onmogelijke weergave.
> const klok = new Qlocktwo("HETKISAVIJFTIENATZVOOROVERMEKWARTHALFSPMOVERVOORTHGEENSTWEEAMCDRIEVIERVIJFZESZEVENONEGENACHTTIENELFTWAALFPMUUR", 11);
> klok.toString()
HETKISAVIJF
TIENATZVOOR
OVERMEKWART
HALFSPMOVER
VOORTHGEENS
TWEEAMCDRIE
VIERVIJFZES
ZEVENONEGEN
ACHTTIENELF
TWAALFPMUUR
> klok.posities("na")
[[1, 3]]
> klok.posities("OVER")
[[2, 0], [3, 7]]
> klok.posities("OVER", [2, 1])
[[3, 7]]
> klok.weergave("07:30")
"HET IS HALF ACHT"
> klok.weergave("07:30:15")
AssertionError: ongeldig tijdstip
> klok.weergave("30:07")
AssertionError: ongeldig tijdstip
> klok.weergave("11:24")
AssertionError: ongeldig tijdstip
> console.log(klok.visueel("07:30"))
HET-IS-----
-----------
-----------
HALF-------
-----------
-----------
-----------
-----------
ACHT-------
-----------
> klok.visueel("07:30")
"HET-IS-----\n-----------\n-----------\nHALF-------\n-----------\n-----------\n-----------\n-----------\nACHT-------\n-----------"
> new Qlocktwo("ABCDEF")
AssertionError: ongeldig rooster
> new Qlocktwo("ABCDEF", 4)
AssertionError: ongeldig rooster
> const klok2 = new Qlocktwo("ABCDEFGHI");
> klok2.posities("AB", [3, 3])
AssertionError: ongeldige positie
> klok2.visueel("07:30")
AssertionError: onmogelijke weergave