Woordle-2

Woordle-2

In Woordle deel 1 (Pythagoras 62-1) hebben we gezien hoe je het spel Woordle kunt programmeren in Python. Het programma had een extra feature, in de rechter onderhoek stond een getal dat aangaf hoeveel woorden in principe in aanmerking komen om geraden te worden. Nu gaan we ons de volgende vraag stellen: Is het altijd mogelijk om binnen 6 beurten het te raden woord te vinden? Als toegift is er een programmaatje toegevoegd, waarmee je de gangbare Woordle-versies kunt hacken. (Er zijn ook varianten in omloop met andere woordenlijsten, dan moet je de betreffende woordenlijst vooraf invoeren.)

We gaan een strategie bepalen om in zo min mogelijk beurten het te raden woord te vinden. We maken gebruik van twee procedures die we al hadden ontwikkeld voor het eerste deel:

Overeenkomsten(KeuzeWoord, TeRadenWoord): er wordt per letter gecontroleerd of de letter voorkomt in het onbekende woord TeRadenWoord, zo ja, op de juiste plaats, of op een andere plaats.

ReduceerWoorden(RWL, signatuur, KeuzeWoord): elke keer als je op Ok drukt, wordt gekeken naar het aantal mogelijke oplossingen (RWL). Deze procedure controleert voor welke woorden Woord in RWL exact dezelfde signatuur (dat is de lijst met nullen, enen en tweeën) wordt gegenereerd als TeRadenWoord. Er wordt een nieuwe lijst RWL2 opgesteld bestaande uit deze woorden.

We worden nu echter gedwongen om een stapje abstracter te denken. We weten immers niet welk woord geraden moet worden, maar bovendien weten we ook niet welke woorden verstandig zijn om te gebruiken.

Voorbeeld dat leidt tot falen

We kiezen het woord $HEREN$. We hebben geluk gehad. De uitkomst is: $\color{red}{H}\color{green}{EREN}$, ofwel de $H$ komt niet in het te raden woord voor, maar de letters van "$EREN$" komen wel voor en staan alle op de juiste plaats. Je denkt na en kiest voor $MEREN$. De uitkomst is $\color{red}{M}\color{green}{EREN}$. Je denkt opnieuw na en kiest in de derde beurt voor $PEREN$. Dat resulteert in $\color{red}{P}\color{green}{EREN}$. Dan volgt in de vierde beurt $BEREN$, hetgeen resulteert in $\color{red}{B}\color{green}{EREN}$. Dan volgt in de vijfde beurt $VEREN$, hetgeen resulteert in $\color{red}{V}\color{green}{EREN}$. Dan volgt in de laatste beurt $TEREN$, hetgeen resulteert in $\color{red}{T}\color{green}{EREN}$. Helaas, je hebt 6 beurten verbruikt, en het te raden woord was $KEREN$. Maar het had ook $WEREN$ kunnen zijn, of $IEREN$ of $LEREN$. Je gaat haast vermoeden dat het onmogelijk is om in zes beurten altijd het juiste woord te raden.

Toch valt dat nog wel mee (tenminste in dit geval). Als je in de eerste beurt kiest voor $HEREN$, dan weet je dat de eerste letter bevat is in de verzameling $\{B, D, I, K, L, M, P, T, V, W\}$. Dat zijn $10$ letters. Maar met het woord $KLIMT$ test je in één keer vijf letters! In drie woorden is het mogelijk om de overige letters te testen, bijvoorbeeld $BEVEL$ en $DWEIL$. De laatste letter ($P$) kun je bijvoorbeeld testen in $PEREN$. Er zijn ook andere lastige woordenlijsten, bijvoorbeeld $\color{red}{B}\color{green}{ALEN}$ en $\color{green}{MA}\color{red}{D}\color{green}{EN}$. Als je zelf Woordl al hebt uitgeprobeerd, zul je mogelijk andere lettercombinaties zijn tegengekomen, ook bij $6$ en $7$ letters.

Keuze voor het eerste woord en onderscheidend vermogen

We gaan nu kijken naar een slimme strategie om te bepalen welke woorden je wel en niet moet nemen als eerste woord. Voor een woord (welk woord je ook kiest) heb je een hele waaier aan oplossingen, die gerelateerd zijn aan de verschillende signaturen. Je kunt voor elke letter drie uitkomsten krijgen. Op het spelbord gebruik ik de kleuren grijs (letter komt niet voor), geel (letter komt voor, maar op een andere positie) en groen (letter komt voor op de correcte positie). Laten we voorlopig uitgaan van de woordlengte $5$, dan zijn er in principe $3^5$ signaturen voor alle mogelijk te raden woorden. In de praktijk blijken $5$ signaturen helemaal niet voor te komen.

 

Opgave

Weet jij welk $5$ signaturen nooit zullen optreden?

 

We gaan het onderscheidend vermogen van een (te gebruiken) woord bestuderen. Dat houdt in dat door het eerste gekozen woord de mogelijk te raden woorden zoveel mogelijk verspreid worden over de verschillende signaturen. Het zoveel mogelijk is nog een heel vaag begrip. We willen het invullen met dat je zo min mogelijk woorden hierna nodig hebt, maar dat is programma-technisch gezien best ingewikkeld. We kiezen voor een andere werkbare definitie, namelijk dat alle deelverzamelingen horende bij de signaturen zo klein mogelijk zijn. In dit artikel definiëren we op grond hiervan:

Onderscheidend vermogen van een woord is de grootte van de grootste verzameling gerelateerd aan de signaturen.

Hieronder gaan we dat programmeren. Het uitvoeren van het programma (zie hieronder bij [Bekijk oplossing]) is best een tijdrovende klus, want enerzijds test je elk woord als eerste woord, en dan neem je bij de test alle woorden mee als potentieel te raden woord. Dat kost heel wat tijd. De uitkomst is een Top $N$ van beste eerste keuzes. Steeds staat er bij hoe groot de grootste deelverzameling is en welke lettercode daar bij hoort.

Het tweede woord zoeken

We hebben in het eerste programma een Top $N$ samen gesteld van woorden met het beste onderscheidend vermogen. Nu passen we hetzelfde algoritme toe om een tweede woord te vinden. In principe hoef je niet één woord te kiezen. Per deelverzameling (wDeelV) kun je een ander woord kiezen. Voor de $5$-letterige woorden kun je tot $238$ woorden gebruiken. Dat loopt op bij de $7$-letterige woorden tot $2\,180$ woorden. Het onderscheidend vermogen gaat zeker dalen.

En daarna...

De rest van het artikel staat hieronder. Je kunt het programma Woordl downloaden. Tussen de verschillende programma's in staat nog extra toelichting. We willen je echter een paar zaken niet onthouden. Die volgen hieronder:

Resultaten eerste te kiezen woorden

5 letters

'$LITER$', '$ALTER$', '$LATER$', '$RATEL$', '$TROEL$', '$LATEI$', '$OLIET$', '$SALET$', '$RANSE$', '$REALO$'

6 letters

'$SOIREE$', '$SENIOR$', '$LOEIER$', '$STREEL$', '$TERSEL$'

7 letters

'$STRELEN$', '$GASTEER$', '$ORATIES$', '$SENIORE$', '$REISDEN$'

Maar dan hebben we een tegenvaller. Bij '$LITER$' zijn er twee woorden die niet in $6$ beurten kunnen worden geraden. Daarom toch nog maar andere woorden geprobeerd. Het programma genereert de regel: EXTRA BEURT bij LITER: ['$LITER$', '$KANON$', '$DUMPS$', '$WAZIG$', '$AFBAD$'] ['$HAZEN$', '$VAZEN$']

Dat moet je als volgt lezen: met behulp van het onderscheidend vermogen worden de 5 woorden $LITER$, $KANON$, $DUMPS$, $WAZIG$, $AFBAD$ gekozen. In dat specifieke geval is er een signatuur, waarbij nog twee woorden overblijven: $HAZEN$ en $VAZEN$. Dat is heel vervelend. Je kunt gokken op het ene woord, maar dan heb je zeven beurten nodig voor het andere woord. Gelukkig: bij '$RATEL$' kunnen alle woorden in $6$ beurten worden geraden! $RATEL$ blijkt het enige woord in de Top10 waarbij ALLE woorden in $6$ beurten of minder kunnen worden geraden. Er zijn ook woorden buiten de Top10 waarvoor dit het geval is. Dit is wel een indicatie dat de definitie van onderscheidend vermogen niet zaligmakend is.

Statistieken

Als je weet dat alle woorden in $6$ beurten geraden kunnen worden, dan wil je natuurlijk weten hoeveel woorden in resp. $1$ beurt, $2$, $3$, $4$, $5$ en $6$ beurten worden geraden. Daarom het volgende overzicht: 

  Aantal woorden geraden
Aantal beurten #5 #6 #7
$1$ $1$ $1$ $1$
$2$ $58$ $114$ $261$
$3$ $1\,097$ $3\,576$ $9\,622$
$4$ $3\,145$ $6\,230$ $8\,556$
$5$ $1\,150$ $1\,395$ $161$
$6$ $72$ $52$ $0$
Totaal $5\,523$ $11\,369$ $18\,601$

 Ik vond zelf de resultaten van de statistieken eveneens verrassend: met $7$ letters kun je een woord altijd in $5$ beurten raden. Bij $5$ en $6$ letters is het aantal woorden dat slechts in $6$ beurten kan worden geraden relatief klein.

Nawoord

Nederlands is een levende taal. Dat wil zeggen dat er dagelijks nieuwe woorden worden geïntroduceerd. Daarnaast wordt het gebruik van andere woorden juist oubollig. Na een generatie zijn dergelijke woorden gedoemd om uit een lijst van de woorden der Nederlandse taal geschrapt te worden. Maar stel nu dat er twee nieuwe woorden  worden geïntroduceerd, namelijk xeren en yeren (aanvankelijk als x-eren en y-eren, maar dat is maar tijdelijk), waarmee de spreker of schrijver zijn afschuw kan weergeven van het doen voor typisch vrouwelijke activiteiten en mannelijke activiteiten, zoals in de zinnen "Jij bent de hele tijd aan het xeren met je vriendinnen in de stad, en dat kost ook nog ontzettend veel geld." en "Waarom moeten mannen tegenwoordig yeren in een mancave?". Dat maakt de druk op woorden die eindigen op EREN zo groot dat er waarschijnlijk woorden gaan ontstaan die pas na zeven keren raden gevonden kunnen worden. Daarom is bovenstaande artikel (inclusief programma) geen bewijs dat je altijd in zes beurten een woord kunt raden. Wel geldt dat het momenteel mogelijk is voor de huidige lijst van woorden in de Nederlandse taal van Open Taal. 

 

Opgave

Je kunt een woord ook definiëren als elke combinatie van $5$ verschillende letters.

Kun je een ondergrens bepalen voor hoeveel keer je nu maximaal moet raden, als je wat pech hebt?

Opgave

Probeer de volledige code zo aan te passen dat er ook met woorden van $4$ letters gespeeld kan worden. Ik heb een Engelstalige versie een aantal keren gespeeld, daar lukt het in het algemeen wel. Ik heb echter mijn twijfels over de Nederlandse taal. Je kunt proberen om zelf alle programmatuur zo aan te passen dat er getest kan worden of elk woord van $4$ letters in $6$ beurten (of minder) geraden kan worden.

Opgave

Het laatste programma laat zien dat zelfs het toevoegen van $XEREN$, $YEREN$, $XEERT$ en $YEERT$ nog geen problemen veroorzaakt. Alle woorden zijn in $6$ beurten te raden. Kun jij een zo klein mogelijk aantal woorden verzinnen waardoor met de huidige programmatuur en huidige woordenlijst van Open Taal voor één of meer woorden minimaal $7$ beurten nodig zijn?

 

 

Bekijk oplossing