Een Spelling Bee is een woordpuzzel waarbij een aantal verschillende letters gegeven zijn. Eén van die letters is als "verplicht" gemarkeerd. Het doel is om zoveel mogelijk bestaande woorden te vinden die met de gegeven letters kunnen gespeld worden. De woorden moeten niet alle letters uit de puzzel gebruiken, mogen dezelfde letter ook meerdere keren gebruiken, maar moeten minstens de verplichte letter bevatten.

De puzzels verschillen niet enkel in welke letters er gegeven zijn, maar ook in het aantal gegeven letters, het minimaal aantal letters waaruit woorden moeten bestaan om als oplossing in aanmerking te komen en het woordenboek dat gebruikt wordt om te bepalen of woorden effectief bestaan. Dit zijn bijvoorbeeld drie puzzels met respectievelijk 13, 9 en 7 gegeven letters, waarbij de gele cel telkens aangeeft wat de verplichte letter is.

puzzel (13 letters)
Een Spelling Bee puzzel met 13 letters. De gele cel bevat de letter die verplicht in alle oplossingen moet voorkomen. Het woord multiprocessing is een pangram voor deze puzzel.
puzzel (9 letters)
Een Spelling Bee puzzel met 9 letters. De gele cel bevat de letter die verplicht in alle oplossingen moet voorkomen. De woorden microorganism en microorganisms zijn twee pangrammen voor deze puzzel.
puzzel (7 letters)
Een Spelling Bee puzzel met 7 letters. De gele cel bevat de letter die verplicht in alle oplossingen moet voorkomen. De woorden flowing, following, fowling, wolfing zijn de vier pangrammen voor deze puzzel.

Doorgaans zit er in elke puzzel ook minstens één pangram verborgen: een woord dat alle letters van de puzzel minstens één keer bevat. Dat is het geval voor bovenstaande puzzels: multiprocessing is een pangram voor de linker puzzel, de middelste puzzel heeft met microorganism en microorganisms twee pangrammen en de rechter puzzel heeft er zelfs vier: flowing, following, fowling en wolfing.

Opgave

Schrijf een bash shell script bee waarmee oplossingen of pangrammen van een gegeven puzzel kunnen bepaald worden. Aan het script moeten twee argumenten doorgegeven worden: i) de omschrijving van een puzzel en ii) de padnaam van een woordenboek.

De omschrijving van de puzzel moet uit één hoofdletter en nul of meer kleine letters bestaan, waarbij elke letter hoogstens één keer mag voorkomen (zonder onderscheid te maken tussen hoofdletters en kleine letters). De hoofdletter markeert de verplichte letter van de puzzel, en de kleine letters zijn optioneel te gebruiken letters.

Het woordenboek is een tekstbestand met een lijst van woorden. Elk woord staat op een afzonderlijke regel en bestaat enkel uit letters (zowel hoofdletters als kleine letters).

Het script moet een alfabetisch gesorteerde lijst met alle oplossingen van de puzzel uitschrijven naar standaard uitvoer (stdout). Dat zijn de woorden uit het woordenboek die kunnen gespeld worden met de letters van puzzel en die de verplichte letter van puzzel bevatten. Elke oplossing moet op een afzonderlijke regel staan en bij het sorteren van de oplossingen mag geen onderscheid gemaakt worden tussen hoofdletters en kleine letters.

Het script moet de volgende opties ondersteunen:

Het script moet voor de verwerking van de opties de flexibiliteit aan de dag leggen die gebruikelijk is bij Unix commando's: volgorde van opties speelt geen rol, opties kunnen samengenomen worden, argument bij een optie moet niet noodzakelijk van de optieletter gescheiden worden door witruimte, …. Daarnaast moet het script de volgende foutafhandeling voorzien:

De gepaste foutboodschappen vind je terug in onderstaand voorbeeld.

Voorbeeld

In onderstaande voorbeeldsessie gaan we ervan uit dat het tekstbestand dictionary.txt1 zich in de huidige directory bevindt.

$ bee -l 8 inwLogf dictionary.txt2
flinging
flogging
following
giggling
goggling
googling
niggling
wiggling
$ bee -p inwLogf dictionary.txt3
flowing
following
fowling
wolfing
$ bee -x inwLogf dictionary.txt4
Usage: bee [-p] [-l <int>] <PUZZLE> <DICTIONARY>
$ echo $?
1
$ bee
Usage: bee [-p] [-l <int>] <PUZZLE> <DICTIONARY>
$ echo $?
1
$ bee XXX dictionary.txt5
bee: invalid puzzle
$ echo $?
2
$ bee inwLogf unknown_dictionary.txt
bee: invalid dictionary
$ echo $?
3

Epiloog

Een spelling bee is een spellingswedstrijd waarin deelnemers een brede waaier aan woorden moeten spellen, meestal met variërende moeilijkheidsgraad. De deelnemers moeten de spelling van de woorden uit hun hoofd leren zoals die in het woordenboek staat, en moeten deze spelling nazeggen.

spelling bee competitie
Een spellingswedstrijd op een basisschool, met een speller die een publiek en een jurylid toespreekt, met daarachter een aantal andere deelnemers.

Spellingswedstrijden werden in de jaren 1800 wijdverspreid in de Verenigde Staten, als een manier om leerlingen te motiveren om gestandaardiseerd te leren spellen. De Scripps National Spelling Bee6 — de jaarlijkse nationale spellingswedstrijd van de Verenigde Staten — werd in 1925 opgericht en is nu zo beroemd dat de winnaar (en het woord waarmee hij of zij won) de landelijke krantenkoppen en nieuwsprogramma's kan halen. Zijn de woorden in de loop der jaren moeilijker geworden? Oordeel zelf:

  • 1920–1929: gladiolus (1925), abrogate (1926), luxuriance (1927), albumen (1928), asceticism (1929)

  • 1930–1939: fracas (1930), foulard (1931), knack (1932), torsion (1933), deteriorating (1934), intelligible (1935), interning (1936), promiscuous (1937), sanitarium (1938), canonical (1939)

  • 1940–1949: therapy (1940), initials (1941), sacrilegious (1942), semaphore (1946), chlorophyll (1947), psychiatry (1948), dulcimer (1949)

  • 1950–1959: meerschaum / meticulosity (1950), insouciant (1951), vignette (1952), soubrette (1953), transept (1954), crustaceology (1955), condominium (1956), schappe (1957), syllepsis (1958), catamaran (1959)

  • 1960–1969: eudaemonic (1960), smaragdine (1961), esquamulose (1962), equipage (1963), sycophant (1964), eczema (1965), ratoon (1966), chihuahua (1967), abalone (1968), interlocutory (1969)

  • 1970–1979: croissant (1970), shalloon (1971), macerate (1972), vouchsafe (1973), hydrophyte (1974), incisor (1975), narcolepsy (1976), cambist (1977), deification (1978), maculature (1979)

  • 1980–1989: elucubrate (1980), sarcophagus (1981), psoriasis (1982), Purim (1983), luge (1984), milieu (1985), odontalgia (1986), staphylococci (1987), elegiacal (1988), spoliator (1989)

  • 1990–1999: fibranne (1990), antipyretic (1991), lyceum (1992), kamikaze (1993), antediluvian (1994), xanthosis (1995), vivisepulture (1996), euonym (1997), chiaroscurist (1998), logorrhea (1999)

  • 2000–2009: demarche (2000), succedaneum (2001), prospicience (2002), pococurante (2003), autochthonous (2004), appoggiatura (2005), Ursprache (2006), serrefine (2007), guerdon (2008), Laodicean (2009)

  • 2010–2019: stromuhr (2010), cymotrichous (2011), guetapens (2012), knaidel (2013), stichomythia / feuilleton (2014), scherenschnitte / nunatak (2015), Feldenkrais / gesellschaft (2016), marocain (2017), koinonia (2018), auslaut / erysipelas / bougainvillea / aiguillette / pendeloque / palama / cernuous / odylic (2019)

  • 2020–2023: Murraya (2021), moorhen (2022), psammophile (2023), abseil (2024)