In de episode Bart the Genius van de Simpsons is het gezin een spelletje Scrabble aan het spelen, waarbij Bart (de zoon) het zelfverzonnen woord "kwyjibo" op het spelbord legt. Wanneer Homer (de vader) hem er weinig subtiel op wijst dat dit woord niet bestaat, komt Bart met een definitie op de proppen (met een addendum van Marge, de moeder):

kwyjibo: a big, dumb, balding North American ape with no chin (and a short temper)

Homer kan er helemaal niet mee lachen, meer nog omdat het een onverholen omschrijving is van zijn eigen persoonlijkheid. Wanneer hij met een banaan in de hand op zijn zoon afstormt

I'll show you a big, dumb, balding ape!

schreeuwt Bart het uit

Uh oh. Kwyjibo on the loose!

Opgave

Het bordspel Scrabble wordt gespeeld op een bord bestaande uit $$n \times n$$ vakjes die gerangschikt zijn in een vierkant rooster met $$n$$ rijen en $$n$$ kolommen. In elk vakje past een blokje waarop een letter of een blanco staat. De spelers trekken een vast aantal blokjes uit een stoffen zak, en moeten daar om de beurt woorden mee vormen die ze op het spelbord aanleggen. De woorden mogen zowel van links naar rechts als van boven naar onder gespeld worden.

kwyjibo
Woorden worden van links naar rechts of van boven naar onder aangelegd op een Scrabblebord. Kleine letters geven aan welke letter werd vastgelegd voor een blanco.

De kolommen van het bord worden van links naar rechts gelabeld met de opeenvolgende hoofdletters van het alfabet, en de rijen worden van onder naar boven gelabeld met de natuurlijke getallen 1, 2, 3, …. We gaan er voor de eenvoud van uit dat $$1 \leq n \leq 26$$. De plaats waar een woord op het spelbord gelegd wordt, wordt aangeduid aan de hand van twee strings:

Op die manier geeft 3C WEB aan dat het woord WEB horizontaal wordt aangelegd op de derde rij, en dit vanaf de derde kolom. Analoog geeft C2 AWnING aan dat het woord AWNING verticaal wordt aangelegd in de derde kolom, te beginnen vanaf de tweede rij. Bovendien werd voor de derde letter van het woord AWNING een blanco gebruikt, waarvoor de letter n werd vastgelegd.

Als een woord op het spelbord aangelegd wordt, moet rekening gehouden worden met de letters die reeds op het bord liggen (inclusief de letters die gekozen werden bij het aanleggen van blanco blokjes). Hiervoor wordt een notatie gebruikt waarbij de letters die reeds op het bord lagen tussen ronde haakjes gezet worden. In bovenstaand voorbeeld gebruiken we bij het aanleggen van het woord AWNING de letter W van het woord WEB dat reeds op het bord ligt. Dit wordt genoteerd als A(W)nING (let erop dat we in de notatie met een kleine letter ook aangeven dat de letter n als blanco op het bord gelegd werd). Als er in het woord dat wordt aangelegd meerdere opeenvolgende letters zijn die reeds op het bord lagen, dan wordt deze groep letters samen tussen ronde haakjes gezet. We gebruiken dus bijvoorbeeld de notatie (Bo)G(I)E en niet (B)(o)G(I)E.

Opmerking voor wie het spelletje Scrabble kent: in deze opgave houden we geen rekening met bijkomende regels in verband met bestaande woorden, of de mogelijkheid dat bij het aanleggen van een woord ook secundaire woorden kunnen gevormd worden.

Definieer een klasse Scrabble die kan gebruikt worden om een Scrabble spelbord voor te stellen waarop woorden kunnen aangelegd worden. Deze klasse moet minstens de volgende methoden ondersteunen:

Voorbeeld

>>> bord = Scrabble(7)
>>> print(bord)
-------
-------
-------
-------
-------
-------
-------
>>> bord.aanleggen('3C', 'WEB')
'WEB'
>>> print(bord)
-------
-------
--WEB--
-------
-------
-------
-------
>>> bord.aanleggen('C2', 'AWnING')
'A(W)nING'
>>> print(bord)
-------
--A----
--WEB--
--n----
--I----
--N----
--G----
>>> bord.aanleggen('4A', 'ZINC')
'ZI(n)C'
>>> print(bord)
-------
--A----
--WEB--
ZInC---
--I----
--N----
--G----
>>> bord.aanleggen('4A', 'ZINCoID')
'(ZInC)oID'
>>> print(bord)
-------
--A----
--WEB--
ZInCoID
--I----
--N----
--G----
>>> bord.aanleggen('G1', 'OXIDIZE')
'OXI(D)IZE'
>>> bord.aanleggen('6A', 'ENNUI')
'EN(N)UI'
>>> bord.aanleggen('A1', 'KLEZMER')
'KLE(Z)M(E)R'
>>> bord.aanleggen('E3', 'BOGIE')
'(Bo)G(I)E'
>>> print(bord)
K-----O
L-A---X
E-WEB-I
ZInCoID
M-I-G-I
ENNUI-Z
R-G-E-E
>>> bord.aanleggen('1A', 'KWYJIBO')
'(K)WYJIB(O)'
>>> print(bord)
KWYJIBO
L-A---X
E-WEB-I
ZInCoID
M-I-G-I
ENNUI-Z
R-G-E-E
>>> bord.aanleggen('3C', 'WEBLIKE')
Traceback (most recent call last):
AssertionError: woord kan niet aangelegd worden
>>> bord.aanleggen('D3', 'ECOUTE')
Traceback (most recent call last):
AssertionError: woord kan niet aangelegd worden
>>> bord.aanleggen('7A', 'RIVIERE')
Traceback (most recent call last):
AssertionError: woord kan niet aangelegd worden
>>> print(bord)
KWYJIBO
L-A---X
E-WEB-I
ZInCoID
M-I-G-I
ENNUI-Z
R-G-E-E

>>> bord = Scrabble(42)
Traceback (most recent call last):
AssertionError: ongeldig spelbord

Epiloog

Het woord "kwyjibo" dat werd uitgevonden voor de episode Bart the Genius van de Simpsons, heeft ondertussen al tot inspiratie gediend voor

  • het pseudoniem van David L. Smith, de ontwikkelaar van het computervirus Melissa 1

  • de naam van een geologisch afzettingsgebied met hoge concentraties van ijzeroxide, koper en goud in Quebec (Canada) 2

  • de naam van een jojo-truc 3

  • de naam van een rockband 4

Op 11 augustus 2014 bracht Merriam-Webster de vijfde editie uit van het woordenboek The Official Scrabble Dictionary, dat door Hasbro (de producent van Scrabble) en heel wat Scrabble-competities wordt gebruikt als officiële lijst van geldige Scrabblewoorden. In deze nieuwe editie werden meer dan 5000 woorden aan de lijst toegevoegd5, waaronder enkele woorden die Hasbro en Merriam-Webster hebben geselecteerd op basis van een rondvraag onder fans op Facebook6. Ondanks het feit dat het woord "kwyjibo" daarbij het meeste stemmen kreeg, werd het toch niet weerhouden.