Dobbelspel
Stel je het volgende spel voor: je hebt $4$ dobbelstenen en een pak kaartjes met daarop de getallen $1$ t/m $100$. Het spel gaat als volgt: je trekt een kaartje met een getal (zeg $N$). Je gooit vervolgens met de $4$ dobbelstenen. Zeg je gooit $a, b, c$ en $d$. Nu is het de bedoeling om met alle $4$ de getallen $a, b, c$ en $d$ met gebruikmaking van de operaties optellen, aftrekken, vermenigvuldigen en delen het getal $N$ te bereiken. We spreken over het maken van $N$ als we de bovenstaande werkwijze bedoelen.
25 jaar geleden werden bij de chips van een bekend merk plastic schijfjes toegevoegd. Deze schijfjes waren zeer gewild bij basisschoolkinderen. De naam van deze plastic schijfjes was “Flippo”. Een hele serie was gewijd aan het 24-spel. Er stonden $4$ getallen op het plastic schijfje. De opdracht was om met deze $4$ getallen en de operaties optellen, aftrekken, vermenigvuldigen en delen het getal $24$ te bereiken. Van belang was om daarbij alle vier de getallen te gebruiken.
1 tot 100 spel
Natuurlijk kun je in plaats van $24$ een willekeurig ander getal kiezen. Zo komen we op het volgende spel: je hebt $100$ kaartjes met daarop de getallen $1$ tot en met $100$. Je trekt een willekeurig getal. Dan gooi je met $4$ dobbelstenen. Bijvoorbeeld je trekt het kaartje met het getal $49$. Vervolgens gooi je $1, 2, 6$ en $6$. Kun je met deze $4$ getallen en de $4$ operaties het getal $49$ maken?
Programmeren
We gaan dit programmeren in Python. Als je er over nadenkt wat je moet doen, dan zal het je duizelen. Je moet met alles rekening houden. Voor $N = 81$ en de dobbelstenen die uitkomen op $(3, 3, 3, 3)$ is er één oplossing: $3 \times 3 \times 3 \times 3 = 81$. Maar het kan allemaal veel lastiger worden. Wat moet er gebeuren als je $84$ moet maken en $(3, 4, 6, 6)$ gooit? Een oplossing is $(3 + 4) \times (6 + 6) = 84$.
Je moet op drie manieren variëren om oplossingen te vinden:
- Je moet uitgaande van de getallen $a, b, c$ en $d$ alle mogelijke volgordes bepalen van deze vier getallen.
- Je moet op alle plaatsen alle vier de operaties uitproberen.
- Je moet de haakjes nog plaatsen. Dit kan op 5 manieren:
- $((a \star b)\ \S\ c)\ \#\ d$
- $(a \star (b\ \S\ c))\ \#\ d$
- $(a \star b)\ \S\ (c\ \#\ d)$
- $a \star ((b\ \S\ c)\ \#\ d)$
- $a \star (b\ \S\ (c\ \#\ d))$
Dit wetende kun je in principe recht toe recht aan programmeren. Maar er kan zich nog één probleem voordoen. Als je deelt ga je er aanvankelijk van uit dat het resultaat een geheel getal moet zijn. In de praktijk blijkt dat dit niet het geval hoeft te zijn. Het is bijvoorbeeld mogelijk om met $3, 3, 8$ en $8$ het getal $24$ te maken. Je moet dan echter wel gebruik maken van de deling en bovendien in de tussenresultaten breuken laten staan. Dat betekent dat we in plaats van gehele getallen werken met breuken $t/n$, met $t$ en $n$ twee gehele getallen en bovendien $n > 0$. Bovendien vereenvoudigen we de breuk $t/n$ als $t$ en $n$ een gemeenschappelijke factor hebben. Daarvoor kunnen we gebruik maken van de functie gcd(t, n).
Op de website tref je het programma aan, met uitleg tussen de regels.
Nog een opmerking: het aantal berekeningen dat moet worden uitgevoerd voor een set $Q = (a, b, c, d, N)$ is afhankelijk van in hoeverre $a, b, c$ en $d$ verschillend zijn. Bovendien: als je een match vindt, dan kun je de berekening afbreken. Maar in het ongunstige geval dat er geen match is, dan kun je $a, b, c$ en $d$ op $24$ manieren rangschikken (er zijn $24$ permutaties, in Python is er een functie die deze permutaties opsomt), daarna heb je $3$ operatoren, voor elk van deze operatoren kunnen $4$ bewerkingen worden ingevuld, dat zijn $4^3 = 64$ mogelijkheden, en tenslotte kunnen de haakjes op $5$ manieren worden ingevuld. Bij elkaar zijn er $24 \times 64 \times 5 = 7680$ mogelijkheden. Dit aantal kan nog aanzienlijk worden gereduceerd. Dit laten we als een opdracht. Je kunt bijvoorbeeld kijken naar het artikel in Pythagoras 41-5 (juni 2002).
Stukje kansrekenen
Je wilt nu weten wat de kans is dat als je een willekeurig kaartje trekt en vervolgens met $4$ dobbelstenen gooit, je met $a, b, c$ en $d$ precies $N$ kan maken. Om deze kans te berekenen ga je alle mogelijkheden af: voor $N$ kies je $1$ tot en met $100$. En voor de dobbelstenen kies je $1$ tot en met $6$. Het aantal mogelijkheden dat je moet onderzoeken is $100 \times 6^4 = 129600$. Dan tel je het aantal keren dat het lukt om $N$ te maken. Het quotiënt van het aantal keren dat het gelukt is om $N$ te maken gedeeld door $129600$ is de kans op slagen. Als je dit uitrekent voor $4$ dobbelstenen, dan kom je uit op een kans van $41{,}8\%$.
Vakantie uitdaging
Het programma kun je downloaden van de website van Pythagoras. Dan kun je zelf aan de slag. Als je het programma in deze vorm uitvoert dan moet je ruim 10 minuten wachten. Dan is de uitvoer $41{,}8\%$. Maar in plaats van dobbelstenen met $1$ tot en met $6$ kun je ook kiezen voor andere dobbelstenen. We stellen enkele eisen aan de door jou ontworpen dobbelstenen.
- Alle $6$ getallen zijn positief en geheel.
- Geen twee getallen op één dobbelsteen zijn gelijk.
De dobbelstenen zijn als volgt gedefinieerd in Python:
Dobbelsteen1 = (1, 2, 3, 4, 5, 6) Dobbelsteen2 = (2, 4, 6, 8, 10, 12) Dobbelsteen3 = (3, 6, 9, 12, 15, 18) Dobbelsteen4 = (4, 8, 12, 16, 20, 24)
Kies andere getallen op de $6$ zijden van de $4$ dobbelstenen en kijk of je de kans op slagen kunt vergroten.
Bovenstaande combinatie van dobbelstenen met veelvouden van $1, 2, 3$ en $4$ levert al een kans op van $57{,}5\%$.
De gehele zomervakantie kun je kijken wat je beste resultaat wordt. Uiterlijk op 30 september kun je je beste $4$ dobbelstenen (met slagingskans) insturen naar [email protected]. Er is een leuk prijsje beschikbaar voor degene die de beste
dobbelstenen heeft bedacht.
Opgaven
Ter overweging: Je kunt er over nadenken om het programma te versnellen, waarbij je niet meer alle berekeningen uitvoert. Je kunt dan al veel sneller een indicatie krijgen of een dobbelsteenkeuze een verbetering oplevert. Voor de beste $10$ gevonden oplossingen doorloop je nog het volledige programma. Kun je het programma sneller maken? Dit is wel een hele klus hoor! Je kunt controleren of je code goed werkt door de code te vergelijken met de oorspronkelijke code. Graag zien we je verbeterde code tegemoet! |
Kijk bij [Oplossingen] voor de code met uitleg.
Bekijk oplossing