Het spelletje buzzword bingo (ook bekend onder de naam bullshit bingo) kreeg vooral bekendheid toen het in 1994 werd gebruikt in een strip van Dilbert.
Buzzword bingo wordt vaak gespeeld om de tijd te doden tijdens saaie lessen, vergaderingen of andere bijeenkomsten waarin naar het oordeel van de luisteraars te veel geleuterd wordt. Het idee is dat elke deelnemer voorafgaand aan een les of vergadering een lijstje maakt van stopwoorden of buzzwords waarvan hij verwacht dat de spreker die zal gebruiken. Deze woorden worden op een bingokaart ingevuld in een vierkant rooster met $$n$$ rijen en $$n$$ kolommen ($$n \in \mathbb{N}$$). Voor een les genetica zou je bijvoorbeeld de volgende de kaart kunnen opstellen.
Als een deelnemer de spreker een woord hoort zeggen dat hij op zijn kaart heeft staan, dan mag het woord geschrapt worden. Wie als eerste alle woorden op een rij of een kolom van zijn kaart geschrapt heeft, en daarna heel hard "Bingo!" roept, heeft het spelletje gewonnen.
Schrijf een klasse BuzzBingo waarmee objecten kunnen aangemaakt worden die een bingokaart voorstellen waarmee een spelletje buzzword bingo kan gespeeld worden. De objecten van de klasse BuzzBingo moeten minstens de volgende methoden ondersteunen.
Een initialisatiemethode waaraan een getal $$n \in \mathbb{N}$$ en een reeks (een lijst of een tuple) woorden moeten doorgegeven worden. De methode moet ervoor zorgen dat het nieuw aangemaakte object van de klasse BuzzBingo een bingokaart voorstelt waarvan het $$n \times n$$ rooster van links naar rechts en van boven naar onder gevuld met de gegeven reeks woorden, en waarbij de woorden later kunnen geschrapt worden. Bij initialisatie is er op de bingokaart uiteraard nog geen enkel woord geschrapt. Als het aantal woorden in de gegeven reeks niet overeenkomt met het aantal vakjes in het rooster, dan moet de initialisatiemethode een AssertionError opwerpen met de boodschap ongeldige kaart.
De methoden __str__ en __repr__ die beide dezelfde stringvoorstelling van het object teruggeven. Deze stringvoorstelling heeft de vorm van een vierkant rooster dat aangeeft welke woorden op de bingokaart reeds geschrapt zijn. Woorden die geschrapt zijn, worden aangeduid met de letter x en woorden die nog niet geschrapt zijn, worden aangeduid met een koppenteken (-).
Een methode schrapWoord die kan gebruikt worden om op de bingokaart een woord te schrappen. Het te schrappen woord moet als argument aan de methode doorgegeven worden. Naast het feit dat de methode ervoor moet zorgen dat het object bijhoudt dat het gegeven woord geschrapt werd, moet de methode ook een tuple $$(r, k)$$ teruggeven dat aangeeft dat het gegegeven woord gevonden werd op rij $$r$$ en kolom $$k$$ op de bingo kaart. Hierbij worden de rijen van het rooster oplopend genummerd van links naar rechts, en de kolommen oplopend van boven naar onder. De nummering begint telkens vanaf nul. Indien het gegeven woord niet voorkomt op de bingokaart, dan moet de methode een AssertionError opwerpen met de boodschap woord staat niet op de kaart. Indien het gegeven woord reeds geschrapt is, dan moet de methode een AssertionError opwerpen met de boodschap woord is reeds geschrapt. In beide boodschappen moet het gegeven woord ingevuld worden op de plaats van woord.
Een methode schrapWoorden die kan gebruikt worden om op de bingokaart een reeks woorden te schrappen. De te schrappen woorden moeten als een lijst of een tuple aan de methode doorgegeven worden. De methode moet een lijst teruggeven, waarin voor elk van de gegeven woorden staat waar dat woord gevonden werd op de bingokaart. Hetzelfde tuple als datgene dat teruggegeven wordt door de methode schrapWoord wordt gebruikt om de positie aan te geven waarop een woord gevonden werd.
Een methode gewonnen die kan gebruikt worden om na te gaan of een speler gewonnen is op basis van de geschrapte woorden op de bingokaart. De methode moet een Booleaanse waarde teruggeven die aangeeft of er op de bingokaart al dan niet een rij of een kolom voorkomt waarin alle woorden geschrapt zijn.
>>> bingo = BuzzBingo(4, [
... 'cell', 'bacteria', 'PCR', 'virus',
... 'allele', 'chromosome', 'DNA', 'meiosis',
... 'protein', 'phenotype', 'gene', 'mutation',
... 'genome', 'recessive', 'RNA', 'mitosis'
... ])
>>> bingo
----
----
----
----
>>> bingo.gewonnen()
False
>>> bingo.schrapWoord('phenotype')
(2, 1)
>>> print(bingo)
----
----
-x--
----
>>> bingo.gewonnen()
False
>>> bingo.schrapWoord('dominant')
Traceback (most recent call last):
AssertionError: dominant staat niet op de kaart
>>> bingo.schrapWoord('phenotype')
Traceback (most recent call last):
AssertionError: phenotype is reeds geschrapt
>>> bingo.schrapWoorden(['PCR', 'chromosome', 'protein'])
[(0, 2), (1, 1), (2, 0)]
>>> bingo
--x-
-x--
xx--
----
>>> bingo.gewonnen()
False
>>> bingo.schrapWoorden(('recessive', 'bacteria', 'mitosis'))
[(3, 1), (0, 1), (3, 3)]
>>> print(bingo)
-xx-
-x--
xx--
-x-x
>>> bingo.gewonnen()
True
>>> bingo = BuzzBingo(2, ('cell', 'bacteria', 'PCR'))
Traceback (most recent call last):
AssertionError: ongeldige kaart
>>> bingo = BuzzBingo(2, ['cell', 'bacteria', 'PCR', 'virus', 'allele'])
Traceback (most recent call last):
AssertionError: ongeldige kaart