Woordle

Woordle

In de komende twee afleveringen van Pythagoras staat er Pythonprogrammatuur in het blad over Woordle. Woordle is overgewaaid uit Amerika en is in Nederland inmiddels ook populair. Bekijk bijvoorbeeld op een Android omgeving de software van AppSurd.

In Pythagoras 56-6, juni 2017 schreef ik al eens over Woordmastermind. Zowel bij Woordmastermind als bij Woordle moet je een woord raden. Dat doe je door een woord op te geven. De computer bepaalt welke letters op de goede plaats staan en welke letters in het te raden woord staan, maar niet op de juiste plaats. Het grote verschil tussen de twee spellen is dat bij Woordmastermind alleen twee aantallen worden geretourneerd (aantal letters op de goede positie en aantal letters in het woord maar niet op de juiste positie). Maar bij Woordle wordt de achtergrond van letters aangepast. Als de achtergrond groen wordt, dan staat de betreffende letter op de juiste positie en bij geel komt de betreffende letter in het woord voor.

In deze aflevering gaan we voornamelijk in op de details die van belang zijn om een dergelijk programma te schrijven. Om te beginnen is dat het speelbord. Dat speelbord heeft de redactie van Pythagoras al gemaakt en daar wordt verder geen woord over vuil gemaakt. De code voor het spelbord en het volledige spel vind je bij [Documenten] onderaan de pagina. Je moet om het te kunnen gebruiken tkinter hebben geïnstalleerd. Je roept het speelbord aan door ShowWindow(). Vervolgens gebruik je window.mainloop() om in een oneindige loop in het speelbord te blijven. Je kunt op het speelbord op allerlei knoppen drukken. Wanneer je op Exit drukt dan kom je uit de loop. Het programma wordt beëindigd.

De woordenlijst

We gaan uit van de woordenlijst van Onze Taal (neem wel de licentie in acht). Er wordt gespeeld met woorden van lengte 5, 6 en 7. Deze woordenlijsten hebben we uit de bovengenoemde woordenlijst van Onze Taal gehaald. Er zijn nog drie zaken die van belang zijn:

  • Het alfabet kent 26 letters. Het Nederlands kent echter diverse accenten en trema's. Daardoor groeit het aantal letters tot ver boven de 30. Wij hebben er voor gekozen om alle woorden uit de lijst te verwijderen die niet louter bestaan uit de 26 (kleine letters). Daarom zijn Joost, vwo'er, web-tv, n.a.v. en marqué niet toegestaan.
  • Het Nederlands kent IJ en Y. Soms worden i en j samengevoegd. Wij kiezen er hier voor om dat niet te doen. Zodoende is de software op die manier vergelijkbaar met de software van AppSurd.
  • Het doel van Onze Taal is compleet verschillend van ons belang om een leuk spel te spelen, al hoewel Onze Taal wel een fantastische lijst met woorden aanbiedt. Ik schat dat rond de 35% van de woorden niet echt "past" bij dit spel. Ik heb deze woorden uitgefilterd voor woordlengte 5. Deze woorden (zoals ACTIO, AEQUO, CIRRI, DYOGO en SQUAW) zijn geplaatst in Afvalwoorden5.txt, te downloaden op pyth.eu). Ik nodig iedereen uit om te helpen bij het filteren van de woorden van lengte 6 en 7. Zodoende zijn er eigenlijk twee lijsten: een eerste lijst van woorden die kunnen worden gebruikt bij de invoer van woorden, en een andere lijst van woorden die geraden moeten worden. Deze laatste lijst is aanzienlijk kleiner. Je kunt er voor kiezen om deze lijst ook te gebruiken als lijst waaruit gekozen kan worden.

In de documentatie wordt uitgelegd hoe je op grond van de woordenlijst kunt komen tot drie lijsten met woorden van lengte resp. 5, 6 en 7. We hebben resp. 5 523 woorden van lengte 5, 11 368 woorden van lengte 6 en 18 601 woorden van lengte 7. Deze lijsten moeten in de folder geplaatst worden waar ook WoordL.ipynb staat.

Vanaf hier gaan we uit van het spel met 5 letters. De andere spellen gaan exact zo.

Je moet de 5 letters uit A t/m Z intikken. Er ontstaat een woord. Staat dit woord in onze lijst? Zo niet dan wordt de achtergrond van de letters rood (eigenlijk magenta). Zo ja, dan kan op de OK-knop worden gedrukt. Nu wordt dit gekozen woord vergeleken met het te raden woord.

Rechtsonder in de hoek staat aanvankelijk het aantal woorden in de lijst. Maar steeds nadat een woord wordt geprobeerd, dan wordt er gekeken hoeveel woorden er nu nog matchen, en wordt dit aantal weergegeven.

Opdracht

Je zult merken dat niet alle woorden die je zou willen gebruiken herkend worden door het programma. ZEEEN schrijf je eigenlijk met een trema en is dus verwijderd uit onze lijst. Vervang letters met een accent of andere toevoeging, door de letter zelf en voeg deze woorden toe aan de lijsten. In de volgende aflevering gaan we kijken of het altijd mogelijk is om binnen 6 beurten het juiste woord te raden.

Het spelbord

Links kunnen 6 woorden van lengte $L$ worden ingevuld, waarbij $L \in {5, 6, 7}$. Pal daaronder staat een regel waar komt te staan of je hebt gewonnen of niet, daaronder staan de letters A t/m Z. Daar moet je gebruik van maken.

Rechts is nog één kolom met een aantal opdrachten:

  • Back: Er wordt één letter gewist.
  • Del: De gehele regel wordt gewist.
  • Ok: Er wordt een berekening uitgevoerd op het ingevoerde woord, je springt automatisch naar een nieuwe regel.
  • New: Nieuw spel
  • 5: Nieuw spel met 5 letterwoorden
  • 6: Nieuw spel met 6 letterwoorden
  • 7: Nieuw spel met 7 letterwoorden
  • Exit: Je verlaat het spel

Stukje slimprogrammeren

Een belangrijk onderdeel van het programma is de procedure Overeenkomsten(KeuzeWoord, TeRadenWoord). Deze bepaalt een lijst van getallen (0, 1 of 2) die respectievelijk aangeven of de letter van KeuzeWoord niet voorkomt in TeRadenWoord (0), voorkomt, maar niet op de juiste positie (1) of voorkomt, maar wel op de juiste positie (2). Deze rij nullen enen en tweeën noemen we Signatuur.

Deze procedure speelt ook een rol in het bepalen van het getal rechts onderin. Daar zie je steeds een getal dat aangeeft hoeveel oplossingen er mogelijk zijn op grond van de woorden die je al hebt ingetikt. Hoe kun je dit aantal woorden bepalen?

We gaan uit van een lijst met woorden W. Daarvan maken we een kopie, RWL(RaadWoordenLijst). Elke keer als je op Ok drukt, dan wordt het ingetikte woord (KeuzeWoord) vergeleken met het te raden woord (TeRadenWoord) (door gebruik te maken van Overeenkomsten. Maar tegelijkertijd wordt het betreffende woord ook vergeleken met alle woorden in RWL. Alle woorden in RWL met dezelfde Signatuur blijven behouden. Je zult zien dat het getal rechtsonder snel zal afnemen.

Slotopmerking

Je kunt heel gauw helemaal lyrisch raken van het feit dat het programma voorrekent hoeveel mogelijke oplossingen er op enig moment nog zijn. Maar het valt niet mee om zelf die oplossingen te bedenken. Zeker als je een woord van 7 letters moet raden, dan komt het regelmatig voor dat de teller na drie beurten op 1 staat. Je hebt dan 4 van de 7 letters, waarvan één op de goede plaats staat. Maar dan? Het geeft aan dat je woordenkennis toch maar beperkt is!

Bekijk oplossing