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.
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.
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:
Schrijf een functie vullen waaraan een collectie letters moet doorgegeven worden. De functie moet een dictionary (dict) teruggeven die het zakje voorstelt dat gevuld werd met de gegeven letters.
Schrijf een functie omschrijving waaraan een zakje met letters moet doorgegeven worden. De functie moet een nieuwe dictionary (dict) teruggeven, waarvan de sleutels bestaan uit de waarden (int) van de dictionary die het gegeven zakje voorstelt. Elke sleutel $$n \in \mathbb{N}_0$$ moet afgebeeld worden op een verzameling (set) die de letters/blanco (str) bevat die $$n$$ keer voorkomen in het gegeven zakje.
Schrijf een functie wegnemen waaraan twee argumenten moeten doorgegeven worden: i) een collectie letters en ii) een zakje met letters. De functie moet alle gegeven letters wegnemen uit het gegeven zakje, door de dictionary die het zakje voorstelt bij te werken. Als het gegeven zakje niet alle gegeven letters bevat, dan mag de dictionary die het zakje voorstelt niet bijgewerkt worden, en moet de functie een AssertionError opwerpen met de boodschap niet alle letters zitten in het zakje.
>>> zak = vullen('IAMDIETINGIEATQUINCEJELLYLOTSOFGROUNDMAIZEGIVESVARIETYICOOKRHUBARBANDSODAWEEPANEWORPUTONEXTRAFLESH__')
>>> zak
{'A': 9, 'B': 2, 'C': 2, 'D': 4, 'E': 12, 'F': 2, 'G': 3, 'H': 2, 'I': 9, 'J': 1, 'K': 1, 'L': 4, 'M': 2, 'N': 6, 'O': 8, 'P': 2, 'Q': 1, 'R': 6, 'S': 4, 'T': 6, 'U': 4, 'V': 2, 'W': 2, 'X': 1, 'Y': 2, 'Z': 1, '_': 2}
>>> omschrijving(zak)
{1: {'J', 'K', 'Q', 'X', 'Z'}, 2: {'B', 'C', 'F', 'H', 'M', 'P', 'V', 'W', 'Y', '_'}, 3: {'G'}, 4: {'D', 'L', 'S', 'U'}, 6: {'N', 'R', 'T'}, 8: {'O'}, 9: {'A', 'I'}, 12: {'E'}}
>>> wegnemen('AEERTYOXMCNB_S', zak)
>>> zak
{'A': 8, 'B': 1, 'C': 1, 'D': 4, 'E': 10, 'F': 2, 'G': 3, 'H': 2, 'I': 9, 'J': 1, 'K': 1, 'L': 4, 'M': 1, 'N': 5, 'O': 7, 'P': 2, 'Q': 1, 'R': 5, 'S': 3, 'T': 5, 'U': 4, 'V': 2, 'W': 2, 'Y': 1, 'Z': 1, '_': 1}
>>> omschrijving(zak)
{1: {'B', 'C', 'J', 'K', 'M', 'Q', 'Y', 'Z', '_'}, 2: {'F', 'H', 'P', 'V', 'W'}, 3: {'G', 'S'}, 4: {'D', 'L', 'U'}, 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
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 …