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!
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.
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:
een string xy geeft de startpositie en de richting op het bord aan, waarbij x het label van de rij of de kolom aanduidt waarop het woord gespeld wordt, en y de tweede coordinaat aanduidt van de eerste letter van het woord
een string met de letters van het woord; alle letters worden voorgesteld door hoofdletters, behalve als er een blanco blokje gebruikt wordt voor een bepaalde letter; in dat laatste geval wordt de gekozen letter aangeduid door de kleine letter variant
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. Bij het aanmaken van een spelbord (Scrabble) moet de grootte $$n \in \mathbb{N}$$ van het spelbord doorgegeven worden. Hierbij moet gelden dat $$1 \leq n \leq 26$$. Als dit niet het geval is, dan moet een AssertionError opgeworpen worden met de boodschap ongeldig spelbord.
Een spelbord $$s$$ (Scrabble) moet minstens de volgende methoden ondersteunen:
Een methode toString waaraan geen argumenten moeten doorgegeven worden. De methode moet een string (String) teruggeven die aangeeft welke woorden reeds op het spelbord $$s$$ aangelegd werden. Hierbij worden lege posities op het spelbord voorgesteld met een koppelteken (-), posities waarop een blokje met een letter gelegd werd met een hoofdletter, en positie waarop een blanco blokje gelegd werd met een kleine letter. Bekijk onderstaande voorbeeldsessie om de details van de stringvoorstelling af te leiden.
Een methode aanleggen waaraan twee stringargumenten (String) moeten doorgegeven worden die de plaats aanduiden waarop een woord op het spelbord moet aangelegd worden. Als het woord niet op de aangegeven plaats kan aangelegd worden, dan mag het spelbord niet wijzigen en moet een AssertionError opgeworpen worden met de boodschap woord kan niet aangelegd worden. Anders moet het woord op het spelbord aangelegd worden, en moet de notatie teruggegeven worden die aangeeft welke letters als blanco op het bord liggen en welke letters reeds op het bord lagen.
> bord = new Scrabble(7);
> console.log(bord.toString());
-------
-------
-------
-------
-------
-------
-------
> bord.aanleggen("3C", "WEB");
"WEB"
> console.log(bord.toString());
-------
-------
--WEB--
-------
-------
-------
-------
> bord.aanleggen("C2", "AWnING");
"A(W)nING"
> console.log(bord.toString());
-------
--A----
--WEB--
--n----
--I----
--N----
--G----
> bord.aanleggen("4A", "ZINC");
"ZI(n)C"
> console.log(bord.toString());
-------
--A----
--WEB--
ZInC---
--I----
--N----
--G----
> bord.aanleggen("4A", "ZINCoID");
"(ZInC)oID"
> console.log(bord.toString());
-------
--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"
> console.log(bord.toString());
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)"
> console.log(bord.toString());
KWYJIBO
L-A---X
E-WEB-I
ZInCoID
M-I-G-I
ENNUI-Z
R-G-E-E
> bord.aanleggen("3C", "WEBLIKE");
AssertionError: woord kan niet aangelegd worden
> bord.aanleggen("D3", "ECOUTE");
AssertionError: woord kan niet aangelegd worden
> bord.aanleggen("7A", "RIVIERE");
AssertionError: woord kan niet aangelegd worden
> console.log(bord.toString());
KWYJIBO
L-A---X
E-WEB-I
ZInCoID
M-I-G-I
ENNUI-Z
R-G-E-E
> bord = new Scrabble(42);
AssertionError: ongeldig spelbord
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
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.