Helderziende Karl Fulves1 uit New Jersey (VSA) vond het volgende paragnostische trucje uit. Geef een gewone dobbelsteen aan een vriendin en draai je rug naar haar toe. Vraag haar om de dobbelsteen op een tafel te plaatsen. Daarna vraag je haar om de dobbelsteen een kwartslag te draaien:als het bovenste getal even is, dan moet ze de dobbelsteen naar het oosten draaien (bovenkant naar rechts), en als het bovenste getal oneven is, dan moet ze de dobbelsteen naar het noorden draaien (bovenkant van haar weg). Hierdoor komt een ander getal bovenaan te liggen, en kan ze de dobbelsteen opnieuw draaien volgens dezelfde procedure:naar het oosten als de bovenkant even is en naar het noorden als het oneven is.
Nadat ze deze procedure een paar keer heeft toegepast, vraag je haar om verder te doen tot het getal 1 bovenaan komt te liggen, de dobbelsteen dan nog een laatste keer te draaien en zich dan te concentreren op het getal dat bovenaan ligt. Het lijkt logisch dat er voor het laatste getal vier mogelijkheden zijn, maar toch kan je het correct raden. Hoe kan dat?
Na maximaal drie keer draaien herhaalt de dobbelsteen steeds hetzelfde patroon:1 4 5 6 3 2. Nadat je vriendin de dobbelsteen dus minstens drie keer gedraaid heeft, kan je zonder problemen voorspellen dat na de 1 de 4 bovenaan zal komen te liggen. Omdat de volledige cyclus voorspelbaar is, kan je de truc een paar keer na elkaar herhalen om verschillende eindgetallen te bekomen.
Definieer een klasse Dobbelsteen
waarmee dobbelstenen kunnen voorgesteld worden in JavaScript die op een bepaalde manier voor je op tafel liggen. Deze dobbelstenen moeten een kwartslag kunnen gedraaid worden in een bepaalde richting, volgens het model dat omschreven wordt in onderstaande figuur. Hierbij worden dobbelstenen op een schematische manier voorgesteld, zodat alle zijden van de dobbelsteen zichtbaar gemaakt worden. Het centrale schema stelt bijvoorbeeld een dobbelsteen voor waarbij de 6 bovenaan ligt, de 3 achteraan, de 4 vooraan, de 2 links, de 5 rechts en de 1 onderaan. De vier andere schema’s geven aan hoe de dobbelsteen gaat liggen als je vanuit deze positie de dobbelsteen draait naar het noorden (bovenaan), het zuiden (onderaan), het oosten (rechts) of het westen (links).
Bij het instantiëren van objecten van de klasse Dobbelsteen
moeten geen argumenten doorgegeven worden. Na initialisatie is een dobbelsteen immers altijd gepositioneerd zoals de dobbelsteen die centraal in bovenstaande figuur wordt voorgesteld. Voorts moet de klasse Dobbelsteen
minstens de volgende methoden ondersteunen:
bovenkant
die teruggeeft welke getal bovenaan de dobbelsteen ligt.toJson
die een stringvoorstelling van de dobbelsteen in JSON formaat moet teruggeven. Deze stringvoorstelling geeft aan wat het aantal ogen is op de zijden bovenaan, onderaan, links, rechts, vooraan en achteraan de dobbelsteen. Bestudeer onderstaand voorbeeld om te achterhalen hoe deze stringvoorstelling moet opgemaakt worden.draai
waaraan een hoofdletter moet doorgegeven worden die aangeeft in welke richting de dobbelsteen moet gedraaid worden:N
voor noord, Z
voor zuid, O
voor oost en W
voor west. De methode moet er niet alleen voor zorgen dat de dobbelsteen in de aangegeven richting gedraaid wordt, maar moet ook het getal teruggeven dat na het draaien bovenaan de dobbelsteen komt te liggen. Indien een ongeldige richting aan de methode wordt doorgegeven, dan mag de dobbelsteen niet gedraaid worden, maar moet de methode een Error
opwerpen met de boodschap ongeldige richting
.reeks
waaraan een eindwaarde (een natuurlijk getal uit het interval \([1, 6]\)) moet doorgegeven worden. De methode moet een array teruggeven van alle getallen die bovenaan komen te liggen als de dobbelsteen gedraaid wordt volgens de procedure die Karl Fulves heeft bedacht. Hierbij moet de procedure minstens drie keer uitgevoerd worden totdat het getal met de gegeven eindwaarde bovenaan de dobbelsteen komt te liggen, en dan moet de procedure nog één keer uitgevoerd worden. Bij het uitvoeren van de procedure moet de dobbelsteen ook telkens in de aangegeven richting gedraaid worden.> var dobbel = new Dobbelsteen();
> dobbel.bovenkant();
6
> dobbel.toJson();
'{"boven":6,"onder":1,"links":2,"rechts":5,"voor":4,"achter":3}'
> dobbel.draai('O');
2
> dobbel.toJson();
'{"boven":2,"onder":5,"links":1,"rechts":6,"voor":4,"achter":3}'
> dobbel.draai('W');
6
> dobbel.toJson();
'{"boven":6,"onder":1,"links":2,"rechts":5,"voor":4,"achter":3}'
> dobbel.draai('N');
4
> dobbel.toJson();
'{"boven":4,"onder":3,"links":2,"rechts":5,"voor":1,"achter":6}'
> dobbel.draai('Z');
6
> dobbel.toJson();
'{"boven":6,"onder":1,"links":2,"rechts":5,"voor":4,"achter":3}'
> dobbel.draai('X');
Error: ongeldige richting
> dobbel.reeks(1);
[2, 1, 4, 5, 6, 3, 2, 1, 4]
> dobbel.toJson();
'{"boven":4,"onder":3,"links":5,"rechts":2,"voor":6,"achter":1}'
> dobbel.reeks(3)
[5, 6, 3, 2]
> dobbel.toJson();
'{"boven":2,"onder":5,"links":1,"rechts":6,"voor":4,"achter":3}'