Pakken tot en met 4
slim wint alle 100 spellen van willekeurig. Maar de truc hoort bij de
regels: pak 1, 2 of 3. Nieuw is dat je snapt waaróm hij werkt, zodat je hem
kunt aanpassen als de regels veranderen.
Voorspel
def slim(stapel):
pak = (stapel - 1) % 4
if pak == 0:
pak = 1
return pak
print(slim(9))
print(9 - slim(9))
Bij 9 lucifers is slim aan de beurt. Wat print dit? En kan slim dit spel
nog winnen?
Antwoord
1
8
Bij 9 ligt al een viervoud plus 1. slim pakt 1 en laat 8 liggen. Kent de
ander de truc, dan pakt hij 3 en laat hij 5 liggen, en dan verliest slim.
Speelt de ander maar wat, dan heeft slim nog een kans.
Zo werkt het
Waarom een viervoud plus 1? Pakt de ander 1, dan pak jij 3. Pakt hij 2, dan pak jij 2, en pakt hij 3, dan pak jij 1. Samen pak je zo elke ronde precies 4. Laat jij een viervoud plus 1 liggen, dan ligt er na elke ronde weer een viervoud plus 1, tot er nog 1 ligt: de laatste, voor de ander.
De 4 in % 4 komt dus uit de regels. Veranderen de regels, dan verandert dat
getal mee.
Onderzoek
- Draai de code. Hoe vaak wint
slimvan de 100 spellen? - Begin met 9 lucifers:
speel(9). Wintslimnog steeds altijd? Waarom wel of niet? - Begin weer met 10, maar laat
willekeurigbeginnen: zet inspeelde eerstebeurtop"willekeurig". Hoe vaak wintslimnu?
Antwoorden
- Alle 100. Bij 10 lucifers pakt
slimer 1 en laat hij er 9 liggen. Daarna houdt hij dat vol, watwillekeurigook doet. - Nee, rond de 89 van de 100. Bij 9 ligt er al een viervoud plus 1, en
elke zet laat de ander een kans.
willekeurigziet die kans meestal niet, en dan paktslimhet spel weer over. - Rond de 96 van de 100.
willekeuriglaat alleen 9 liggen als hij 1 pakt, en ook daarna maakt hij meestal een fout.
Opdracht: pakken tot en met 4
Verander de regels: je mag nu 1, 2, 3 of 4 lucifers pakken, en het spel begint
met 12. Pas slim aan, zodat hij weer alle 100 spellen wint:
slim wint 100 van de 100
Begin klein, en breid de code stap voor stap uit:
- Draai de code:
slimpakt nu altijd 1, en wint lang niet alles. - Laat
slimmet%uitrekenen hoeveel hij pakt, zoalsslimin het onderzoek, maar dan voor 1 tot en met 4. - Print in
slimhoeveel hij pakt, en draai één keerspeel(11)in plaats van de 100 spellen. Pakt hij ergens 0? Zet er dan eenifbij voor als het 0 is, en haal de print weg.
In de editor staat het spel tot en met 4 al klaar: willekeurig pakt 1 tot
en met 4. Alleen slim doet nog niets slims.
speel heeft een while-loop. Pakt slim ergens 0, dan wordt de stapel niet
kleiner, stopt de loop nooit en loopt het tabblad vast. Kopieer je code eerst
naar een kladblok, en druk bij twijfel op Stap voor stap.
Tip
Bij 1 tot en met 3 pakte je samen met de ander elke ronde 4. Hoeveel pak je samen elke ronde als het tot en met 4 mag?
Antwoord
import random
def slim(stapel):
pak = (stapel - 1) % 5
if pak == 0:
pak = 1
return pak
def willekeurig(stapel):
return random.randint(1, min(4, stapel))
def speel(stapel):
beurt = "slim"
while stapel > 0:
if beurt == "slim":
stapel = stapel - slim(stapel)
beurt = "willekeurig"
else:
stapel = stapel - willekeurig(stapel)
beurt = "slim"
return beurt
gewonnen = 0
for spel in range(100):
if speel(12) == "slim":
gewonnen = gewonnen + 1
print("slim wint", gewonnen, "van de 100") # slim wint 100 van de 100
Samen pak je elke ronde 5, dus laat slim steeds een vijfvoud plus 1 over:
11, 6 en 1.
Door naar slim tegen slim.