Awalé

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.