Kasper — het huisspook — heeft in de ruïnes van de burcht een oud fototoestel gevonden. Daarmee heeft hij alles vastgelegd wat hij bij het rondspoken graag laat verdwijnen … en hij wil zelf ook wel eens in het niets oplossen! Maar er is iets vreemd aan de hand met de foto's: gek genoeg blijken de voorwerpen vaak de verkeerde kleur te hebben. Soms is de groene fles wit, dan weer blauw. De foto's zijn zo verwarrend dat hij niet meer weet wat hij moet wegtoveren. Wie kan het juiste voorwerp noemen en laten verdwijnen?
Geesten staan centraal in het gezelschapsspel vlotte geesten, maar het is vooral ook een spel voor de vlotte geest. Het wordt gespeeld met 2 tot 8 spelers (vanaf 8 jaar), 5 fysieke voorwerpen en 60 speelkaarten (die foto's van de voorwerpen voorstellen). Elk voorwerp heeft twee unieke eigenschappen: een unieke kleur en een unieke vorm. Er is een rode stoel, een blauw boek, een groene fles, een grijze muis en een wit spook.
Elke speelkaart bevat de weergave van 2 voorwerpen. Een voorwerp op een speelkaart heeft niet noodzakelijk dezelfde kleur als het corresponderende fysieke voorwerp.
Bij aanvang van het spel worden de 5 fysieke voorwerpen op tafel gezet, zodat alle spelers er goed bij kunnen. De speelkaarten worden geschud en als een gedekte stapel op tafel gelegd. De startspeler (bijvoorbeeld de jongste speler of de speler die het laatst in een burcht of kasteel geweest is) draait de bovenste speelkaart zodanig om dat alle spelers de kaart tegelijkertijd zien. Iedere speler probeert nu zo snel mogelijk het fysieke voorwerp van tafel te grijpen dat op deze speelkaart in de juiste kleur is afgebeeld. Voor de speelkaarten hieronder zijn dat respectievelijk het blauwe boek (links), de grijze muis (midden) en de groene fles (rechts).
Als geen van de twee voorwerpen op de speelkaart in de juiste kleur is afgebeeld, dan moeten de spelers het fysieke voorwerp van tafel te grijpen dat qua vorm niet op de kaart is afgebeeld en waarvan de kleur ook niet op de kaart te zien is. De linker speelkaart hieronder toont bijvoorbeeld een blauw spook en een grijze stoel. Deze fysieke voorwerpen staan niet als dusdanig op tafel. Daarom moeten de spelers de groene fles grijpen, omdat zowel de fles als de kleur groen niet op de speelkaart te zien zijn. Om dezelfde reden moeten de spelers ook voor de rechter speelkaart hieronder de groene fles grijpen.
Wie als eerste het juiste fysieke voorwerp op tafel heeft gegrepen, legt als beloning de omgedraaide kaart voor zich op tafel en draait daarna de volgende kaart van de gedekte stapel om.
Per ronde mag een speler niet meer dan 1 voorwerp grijpen. Wie een verkeerd voorwerp heeft gegrepen, moet 1 van zijn kaarten (voor zover hij die heeft) aan de winnaar van de ronde geven. Het is dus goed mogelijk dat de winnaar van de ronde naast de omgedraaide kaart nog meer kaarten wint.
Het spel is afgelopen als de gedekte stapel kaarten is opgebruikt. De speler die de meeste kaarten voor zich heeft, is de winnaar.
We stellen een voorwerp voor als een tuple (tuple) met twee strings (str) die elk een eigenschap van het voorwerp beschrijven: de eerste eigenschap beschrijft de kleur van het voorwerp, en de tweede de vorm van het voorwerp.
We stellen een collectie voorwerpen voor als een lijst (list), een tuple (tuple) of een verzameling (set) met unieke voorwerpen. Deze uniciteit moet zowel gelden voor de voorwerpen als geheel, als voor hun individuele eigenschappen. Het is dus niet toegelaten dat de collectie twee identieke voorwerpen bevat, of twee voorwerpen met dezelfde eigenschap (dezelfde kleur of dezelfde vorm). De collectie mag ook geen objecten bevatten die geen voorwerp voorstellen.
Voor het spelletje vlotte geesten stellen we de fysieke voorwerpen op tafel voor als een collectie met 5 voorwerpen. Deze voorwerpen mogen verschillend zijn van de originele voorwerpen uit het spelletje vlotte geesten: er mag bijvoorbeeld een blauw spook of een roze flamingo op tafel staan.
Een speelkaart uit het spelletje vlotte geesten stellen we voor als een collectie met 2 voorwerpen. Elk voorwerp op een speelkaart moet qua vorm corresponderen met de vorm van een fysiek voorwerp op tafel, en moet ook qua kleur corresponderen met de kleur van een fysiek voorwerp op tafel. Dat hoeft voor die twee eigenschappen echter niet hetzelfde fysieke voorwerp te zijn. Een voorwerp op een speelkaart kan dus de vorm en de kleur combineren van twee fysieke voorwerpen op tafel. Maar als er een roze flamingo op een speelkaart staat, dan moet er ook een roze voorwerp op tafel staan, en moet er ook een flamingo op tafel staan. Bovendien moet juist één van de volgende voorwaarden voldaan zijn:
juist één fysiek voorwerp op tafel correspondeert qua vorm en qua kleur met een voorwerp op de speelkaart
juist één fysiek voorwerp op tafel heeft een vorm en een kleur die niet voorkomt op de speelkaart
Het juiste voorwerp dat je voor een bepaalde speelkaart van tafel moet grijpen volgens de regels van het spelletje vlotte geesten, is net dat fysieke voorwerp uit de voorwaarde hierboven die voldaan is.
Gevraagd wordt:
Schrijf een functie isvoorwerp waaraan een argument moet doorgegeven worden. De functie moet een Booleaanse waarde (bool) teruggeven, die aangeeft of het argument een voorwerp voorstelt.
Schrijf een functie iscollectie waaraan een argument moeten doorgegeven worden. De functie moet een Booleaanse waarde (bool) teruggeven, die aangeeft of het argument een collectie voorwerpen voorstelt.
Schrijf een functie istafel waaraan een argument moet doorgegeven worden. De functie moet een Booleaanse waarde (bool) teruggeven, die aangeeft of het argument voorwerpen voorstelt die fysiek op tafel kunnen staan bij een spelletje vlotte geesten. Dat is het geval als het argument een collectie is met 5 voorwerpen.
Schrijf een functie iskaart waaraan twee argumenten moeten doorgegeven. Deze argumenten moeten resp. een speelkaart en de voorwerpen op tafel voorstellen bij een spelletje vlotte geesten. Als het tweede argument geen voorwerpen voorstelt die fysiek op tafel kunnen staan bij een spelletje vlotte geesten, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige tafel. Anders moet de functie een Booleaanse waarde (bool) teruggeven, die aangeeft of het eerste argument een speelkaart voorstelt voor het spelletje vlotte geesten. Dat is het geval als het argument voldoet aan deze voorwaarden:
een speelkaart is een collectie met 2 voorwerpen
de vorm van elk voorwerp op de speelkaart correspondeert met de vorm van een fysiek voorwerp op tafel
de kleur van elk voorwerp op de speelkaart correspondeert met de kleur van een fysiek voorwerp op tafel
juist één van deze twee voorwaarden is voldaan
juist één fysiek voorwerp op tafel correspondeert qua vorm en qua kleur met een voorwerp op de speelkaart
juist één fysiek voorwerp op tafel heeft een vorm en een kleur die niet voorkomt op de speelkaart
Schrijf een functie grijp waaraan twee argumenten moeten doorgegeven. Deze argumenten moeten resp. de voorwerpen op tafel en een speelkaart voorstellen bij een spelletje vlotte geesten. Als het eerste argument geen voorwerpen voorstelt die fysiek op tafel kunnen staan bij een spelletje vlotte geesten, dan moet een AssertionError opgeworpen worden met de boodschap ongeldige tafel. Anders moet de functie een AssertionError opwerpen met de boodschap ongeldige kaart als het tweede argument geen speelkaart voorstelt voor het spelletje vlotte geesten. Anders moet de functie het juiste voorwerp teruggeven dat je voor de gegeven kaart van tafel moet grijpen volgens de regels van het spelletje vlotte geesten.
>>> tafel = [('rood', 'stoel'), ('blauw', 'boek'), ('groen', 'fles'), ('grijs', 'muis'), ('wit', 'spook')]
>>> kaart1 = [('blauw', 'boek'), ('groen', 'stoel')]
>>> kaart2 = (('wit', 'fles'), ('grijs', 'muis'))
>>> kaart3 = {('rood', 'spook'), ('groen', 'fles')}
>>> kaart4 = [('blauw', 'spook'), ('grijs', 'stoel')]
>>> kaart5 = (('wit', 'muis'), ('rood', 'boek'))
>>> isvoorwerp(('blauw', 'boek'))
True
>>> isvoorwerp(['groen', 'spook'])
False
>>> isvoorwerp(('wit', 'lang', 'fles'))
False
>>> isvoorwerp((666, 'stoel'))
False
>>> iscollectie(tafel)
True
>>> iscollectie(kaart1)
True
>>> iscollectie(kaart2)
True
>>> iscollectie(frozenset(tafel))
False
>>> iscollectie([666] + tafel)
False
>>> iscollectie([('wit', 'spook'), ('wit', 'spook')])
False
>>> iscollectie([('wit', 'spook'), ('wit', 'stoel')])
False
>>> iscollectie([('wit', 'stoel'), ('rood', 'stoel')])
False
>>> istafel(tafel)
True
>>> istafel(kaart1)
False
>>> iskaart(kaart1, tafel)
True
>>> iskaart(kaart2, tafel)
True
>>> iskaart([('blauw', 'boek'), ('groen', 'stoel'), ('wit', 'fles')], tafel)
False
>>> iskaart([('blauw', 'boek'), ('groen', 'kikker')], tafel)
False
>>> iskaart(tafel, kaart1)
Traceback (most recent call last):
AssertionError: ongeldige tafel
>>> grijp(tafel, kaart1)
('blauw', 'boek')
>>> grijp(tafel, kaart2)
('grijs', 'muis')
>>> grijp(tafel, kaart3)
('groen', 'fles')
>>> grijp(tafel, kaart4)
('groen', 'fles')
>>> grijp(tafel, kaart5)
('groen', 'fles')
>>> grijp(kaart1, tafel)
Traceback (most recent call last):
AssertionError: ongeldige tafel
>>> grijp(tafel, [('blauw', 'boek'), ('groen', 'kikker')])
Traceback (most recent call last):
AssertionError: ongeldige kaart