Awalé
Het originele bonenspel is afkomstig uit Afrika en speel je met z’n tweeën. Elk van de spelers heeft 6 tot 10 bakjes met daarin 2 tot 5 bonen. Er zijn meerdere varianten. Bij al die varianten haal je alle bonen uit een bakje aan jouw zijde en verdeel je de bonen (met de klok mee) over de bakjes ("zaaien"). Bij sommige varianten mag je de inhoud van een bakje van de tegenpartij toe-eigenen als daar precies 2 of 3 bonen in zitten, bij andere varianten zijn er speciale bakjes die wel worden voorzien van bonen, maar waarmee nooit kan worden gezaaid.
Met behulp van Python gaan we met een variant van dit spel aan de slag.
Er zijn veel verschillende varianten van het bonenspel. Naast Awalé worden ook de varianten Ayò, Ayoayo, Awari, Wali, Wari , Warri, Ouri, Uril, Pallanguzhi, Adji, Ncho, en Okwè gespeeld. Wij hebben een variant voor één persoon bedacht. Het spel stopt bij ons nooit! In plaats van zaaien kijken we naar het oogsten, dat noemen we hier graaien. Je hebt de beschikking over $N$ bonen en een voldoende groot aantal bakjes (voor de zekerheid kies je evenveel bakjes als bonen). De volgorde van de bakjes doet er niet toe. Daarom kun je bijvoorbeeld de bakjes sorteren op het aantal bonen in het bakje. Een zet (graai) bestaat uit het verwijderen van een boon uit ieder bakje en het vervolgens deponeren van deze bonen in een leeg bakje. Je herhaalt de zet vele malen. Je constateert na verloop van tijd dat de verdeling van bonen over de bakjes zich gaat herhalen. De vraag is hoe groot deze cykel is.
Voorbeeld
We hebben $18$ bonen en die zijn aan het begin verdeeld als volgt: [3; 4; 4; 7]. We voeren de procedure Zet (zie hieronder) diverse malen uit. De achtereenvolgende uitvoer is:
0 | [3; 4; 4; 7] | |
1 | [2; 3; 3; 4; 6] | |
2 | [1; 2; 2; 3; 5; 5] | |
3 | [1; 1; 2; 4; 4; 6] | |
4 | [1; 3; 3; 5; 6] | |
5 | [2; 2; 4; 5; 5] | |
6 | [1; 1; 3; 4; 4; 5] | |
7 | [2; 3; 3; 4; 6] |
Merk op dat de lege bakjes niet worden genoemd. De vetgedrukte aantallen geven aan dat het daar gaat om een nieuw bakje.
Nu zien we dat we een cykel hebben, want de uitvoer na één zet is identiek aan die na zeven zetten.
Tweede voorbeeld
We hebben nu in 3 bakjes ieder 6 bonen gestopt. Wat gebeurt er nu?
0 | [6; 6; 6] | |
1 | [3; 5; 5; 5] | |
2 | [2; 4; 4; 4; 4] | |
3 | [1; 3; 3; 3; 3; 5] | |
4 | [2; 2; 2; 2; 4; 6] | |
5 | [1; 1; 1; 1; 3; 5; 6] | |
6 | [2; 4; 5; 7] | |
7 | [1; 3; 4; 4; 6] | |
8 | [2; 3; 3; 5; 5] | |
9 | [1; 2; 2; 4; 4; 5] | |
10 | [1; 1; 3; 3; 4; 6] | |
11 | [2; 2; 3; 5; 6] | |
12 | [1; 1; 2; 4; 5; 5] | |
13 | [1; 3; 4; 4; 6] |
Na $7$ en na $13$ zetten hebben we twee identieke verdelingen van de bonen. De cykellengte is $6$.
Het Python-programma
Een zet wordt uitgevoerd door procedure Graai.
Opdracht
Graai heeft als invoer $S$ en uitvoer $T$. $T$ is tevens gesorteerd. Ben je in staat om een programma te schrijven voor de procedure Graai? Kom je er niet uit? Kijk dan op de site!
Daarnaast is het van belang om te tellen hoe groot de cykel is. We verzamelen daarom alle uitvoer in een vergaarbak $V$. Elke keer controleren we of de uitvoer $T$ al in $V$ aanwezig is.
Het programma (behalve Graai) ziet er als volgt uit:
S = [3,4,4,7] V = [S] T = [] while T not in V: T = Graai(S) if T in V: print (“Cykellengte:”, \ len(V) - V.index(T)) else: V.append(T) S = T T = []
Door $S$ te variëren kun je zien hoe de cykellengte variëert.
In een volgend nummer van Pythagoras gaan we dit programma uitbreiden op een dusdanige manier dat we voor een zekere $N$ alle verschillende cykellengten kunnen gaan bepalen. Dan kijken we ook hoe de cykellengte variëert voor opvolgende $N$. Probeer het zelf al uit te dokteren. Mogelijk lukt het je al. In dat geval zijn we natuurlijk benieuwd hoe je het voor elkaar hebt gekregen!
Opdracht
Kun je het programma Zaai ook schrijven? Hierbij haal je uit een bakje alle bonen en deel je de overige gevulde bakjes een boon uit. Vervolgens ga je door met het uitdelen van bonen in lege bakjes. Extra regel: als er $K$ bakjes zijn met bonen, dan kun je alleen zaaien met bakjes waarin minimaal $K - 1$ bonen in zitten. Het kan zijn dat je op verschillende manieren kunt zaaien.