Scrabble is een bordspel voor twee tot vier spelers, die bestaande woorden op een spelbord moeten leggen met een aantal willekeurige getrokken letters. Hierbij gaan geluk en vernuft hand in hand, omdat de letters willekeurig getrokken worden en het de kunst is hiermee een zo hoog mogelijke score te behalen.

scrabblebord
Speelbord waarop het spelletje Scrabble gespeeld wordt.

Het spel wordt gespeeld op een bord bestaande uit $$15 \times 15 = 225$$ vakjes, waarbij 61 gekleurde vakjes (8 rode, 17 roze, 24 lichtblauwe en 12 donkerblauwe) een speciale betekenis hebben. De overige 164 vakjes hebben een neutrale kleur (vaak groen) en hebben geen speciale betekenis. In de Nederlandstalige versie zijn er 100 letters en twee blanco blokjes te verdelen die in een stoffen zakje bewaard worden. Daaruit kunnen de blokjes gemakkelijk blind getrokken worden.

De blokjes die een spelers getrokken heeft worden naast elkaar op een rekje gezet, uit het zicht van zijn medespelers. Elke speler probeert tijdens zijn beurt een aantal van zijn getrokken letters op het bord te leggen aan de woorden die reeds gevormd zijn, om daarmee een bestaand woord van ten minste twee letters te vormen, zodanig dat een zo hoog mogelijk aantal punten behaald wordt. Blanco blokjes mogen door de speler voor eender welke letter gebruikt worden, maar leveren zelf geen punten op. Vervolgens vult de speler de letters op zijn rekje weer aan door blind letters uit het stoffen zakje te trekken. Het spel is voorbij als één van de spelers geen letters meer heeft of als niemand met zijn letters nog een woord kan bedenken.

stoffen zakje
Bij het bordspel Scrabbel worden de letters blind getrokken uit een stoffen zakje.

Opgave

Een collectie letters stellen we voor als een string (str), een lijst (list), een tuple (tuple) of een verzameling (set) bestaande uit hoofdletters en underscores (_). Hierbij worden de blanco's uit het spelletje Scrabble voorgesteld door underscores, en mogen letters en blanco's meerdere keren voorkomen.

Een zakje met letters stellen we voor als een dictionary (dict) waarvan de sleutels (str) enkel bestaan uit hoofdletters en eventueel een underscore (die opnieuw een blanco voorstelt). Met elke sleutel wordt een strikt positief natuurlijk getal geassocieerd, dat aangeeft hoe vaak de letter (of de blanco) voorkomt in het zakje. Merk dus op dat het niet toegelaten is om de waarde nul te associeren met een letter of een blanco. Als een letter/blanco niet voorkomt in het zakje, dan heeft die ook geen overeenkomstig sleutel/waarde paar in de dictionary die het zakje voorstelt.

Gevraagd wordt:

Voorbeeld

>>> zak = vullen('IAMDIETINGIEATQUINCEJELLYLOTSOFGROUNDMAIZEGIVESVARIETYICOOKRHUBARBANDSODAWEEPANEWORPUTONEXTRAFLESH__')
>>> zak
{'U': 4, '_': 2, 'C': 2, 'K': 1, 'D': 4, 'T': 6, 'Q': 1, 'V': 2, 'A': 9, 'F': 2, 'O': 8, 'J': 1, 'I': 9, 'N': 6, 'P': 2, 'S': 4, 'M': 2, 'W': 2, 'E': 12, 'Z': 1, 'G': 3, 'Y': 2, 'B': 2, 'L': 4, 'R': 6, 'X': 1, 'H': 2}
>>> omschrijving(zak)
{1: {'Q', 'Z', 'X', 'K', 'J'}, 2: {'F', '_', 'P', 'C', 'M', 'W', 'Y', 'B', 'V', 'H'}, 3: {'G'}, 4: {'U', 'D', 'L', 'S'}, 6: {'N', 'R', 'T'}, 8: {'O'}, 9: {'I', 'A'}, 12: {'E'}}
>>> wegnemen('AEERTYOXMCNB_S', zak)
>>> omschrijving(zak)
{1: {'J', '_', 'C', 'K', 'M', 'Z', 'Y', 'B', 'Q'}, 2: {'W', 'P', 'V', 'F', 'H'}, 3: {'S', 'G'}, 4: {'U', 'D', 'L'}, 5: {'N', 'R', 'T'}, 7: {'O'}, 8: {'A'}, 9: {'I'}, 10: {'E'}}
>>> wegnemen('XXX', zak)
Traceback (most recent call last):
AssertionError: niet alle letters zitten in het zakje

Epiloog

In 1975 ontdekte Phoebe Winch dat de 100 letters uit de Engelstalige versie van Scrabble een geheime boodschap onthullen:

I AM DIETING. I EAT QUINCE JELLY. LOTS OF GROUND MAIZE GIVES VARIETY. I COOK RHUBARB AND SODA, WEEP ANEW, OR PUT ON EXTRA FLESH.

De vraag is of dit Scrabble-dieet ook echt lekker smaakt …