De kaarten die gebruikt worden bij het spelletje Dobble bevatten elk een aantal verschillende symbolen, en hebben als eigenschap dat elke twee kaarten juist één symbool gemeenschappelijk hebben.
Het spel wordt gespeeld door meerdere spelers die bij aanvang elk een kaart krijgen. De overgebleven kaarten worden met hun beeldzijde naar boven op een stapel in het midden van de tafel gelegd. De eerste speler die kan roepen wat het gemeenschappelijke symbool is op de bovenste kaart van zijn eigen stapel en de bovenste kaart van de centrale stapel, verplaatst de bovenste kaart van de centrale stapel naar de bovenkant van zijn eigen stapel. Het spel gaat door totdat er geen kaarten in de centrale stapel meer liggen. De winnaar is de speler met het meeste kaarten in zijn stapel.
Er bestaan verschillende versies van het spelletje Dobble die variëren in de gebruikte symbolen, het aantal kaarten en het aantal symbolen op een kaart. De kaarten voldoen echter altijd aan de volgende eigenschappen:
het aantal kaarten is gelijk aan het aantal verschillende symbolen
op elke kaart staan $$n$$ symbolen (voor een vaste $$n$$)
elk symbool staat op $$n$$ verschillende kaarten (dezelfde $$n$$ als hiervoor)
elke twee kaarten hebben juist één symbool gemeenschappelijk
elk paar symbolen komt op juist één kaart voor
Een kaartspel bestaat uit kaarten waarop een aantal verschillende symbolen staan. Deze kaarten moeten dus niet noodzakelijk voldoen aan de eigenschappen van het spelletje Dobble. Een symbool wordt beschreven door een string (str) die geen komma's bevat. Het kaartspel wordt beschreven in een tekstbestand, waarvan elke regel bestaat uit een door komma's gescheiden reeks symbolen die op één kaart staan. Zo'n tekstbestand kan er dan bijvoorbeeld als volgt uitzien:
kaas,ijsblokje,sneeuwman,waterdruppel,gloeilamp,hart,oog oog,sneeuwman,solsleutel,ijsblokje,uitroepteken,schaar,zebra,rode lippen ijsblokje,zebra,gloeilamp,rode lippen,solsleutel,sneeuwman,madeliefje gloeilamp,solsleutel,sneeuwman,oog,madeliefje,hart,zebra uitroepteken,zebra,gloeilamp,kaas,madeliefje,ijsblokje solsleutel,zebra,madeliefje,sneeuwman,waterdruppel,uitroepteken,gloeilamp rode lippen,madeliefje,uitroepteken,kaas,oog,zebra hart,zebra,schaar,madeliefje,sneeuwman,uitroepteken rode lippen,uitroepteken,waterdruppel,schaar,ijsblokje waterdruppel,gloeilamp,oog,rode lippen,hart kaas,sneeuwman,madeliefje,uitroepteken,ijsblokje,waterdruppel rode lippen,schaar,hart,ijsblokje,madeliefje,uitroepteken
Op basis van hun beschrijving in het tekstbestand worden de kaarten opeenvolgend genummerd vanaf 1. De eerste regel van het tekstbestand correspondeert dus met kaart 1, de tweede regel met kaart 2, enzoverder. Gevraagd wordt:
Schrijf een functie kaart2symbolen waaraan de locatie (str) moet doorgegeven worden van een tekstbestand dat een kaartspel beschrijft. De functie moet een dictionary (dict) teruggeven die het volgnummer (int) van elke kaart in het kaartspel afbeeldt op de verzameling (set) van symbolen (str) op de kaart.
Schrijf een functie gedeelde_symbolen waaraan drie argumenten moeten doorgegeven worden. De eerste twee daarvan zijn de volgummers (int) van twee kaarten uit een kaartspel. Het derde argument is een dictionary (dict; zoals teruggegeven door de functie kaart2symbolen) die het kaartspel beschrijft. De functie moet een verzameling (set) teruggeven met alle gemeenschappelijke symbolen (str) van de twee gegeven kaarten.
Schrijf een functie symbool2kaarten waaraan een dictionary (dict; zoals teruggegeven door de functie kaart2symbolen) moet doorgegeven worden die een kaartspel beschrijft. De functie moet een nieuwe dictionary (dict) teruggeven die elk symbool (str) op de kaarten afbeeldt op een verzameling (set) met alle volgnummers (int) van de kaarten waarop het symbool voorkomt.
Schrijf een functie gedeelde_kaarten waaraan drie argumenten moeten doorgegeven worden. De eerste twee daarvan zijn symbolen (str) die op de kaarten van een kaartspel voorkomen. Het derde argument is een dictionary (dict; zoals teruggegeven door de functie symbool2kaarten) die aangeeft op welke kaarten de symbolen voorkomen. De functie moet een verzameling (set) teruggeven met alle kaarten (int) waarop de twee gegeven symbolen voorkomen.
Schrijf een functie ontbrekende_kaart waaraan de locatie (str) moet doorgegeven worden van een tekstbestand dat de kaarten van een spelletje Dobble beschrijft (die dus voldoen aan de eigenschappen zoals beschreven in de inleiding). Helaas is één van de kaarten uit het kaartspel verloren geraakt. De functie moet een verzameling (set) teruggeven met alle symbolen (str) op de ontbrekende kaart.
In onderstaande voorbeeldsessie gaan we ervan uit dat de tekstbestanden kaarten.txt1 en ontbrekend.txt2 zich in de huidige directory bevinden.
>>> k2s = kaart2symbolen('kaarten.txt3')
>>> k2s[1]
{'gloeilamp', 'hart', 'ijsblokje', 'kaas', 'oog', 'sneeuwman', 'waterdruppel'}
>>> k2s[2]
{'ijsblokje', 'oog', 'rode lippen', 'schaar', 'sneeuwman', 'solsleutel', 'uitroepteken', 'zebra'}
>>> k2s[3]
{'gloeilamp', 'ijsblokje', 'madeliefje', 'rode lippen', 'sneeuwman', 'solsleutel', 'zebra'}
>>> gedeelde_symbolen(1, 2, k2s)
{'ijsblokje', 'oog', 'sneeuwman'}
>>> gedeelde_symbolen(1, 3, k2s)
{'gloeilamp', 'ijsblokje', 'sneeuwman'}
>>> gedeelde_symbolen(2, 3, k2s)
{'ijsblokje', 'rode lippen', 'sneeuwman', 'solsleutel', 'zebra'}
>>> s2k = symbool2kaarten(k2s)
>>> s2k['sneeuwman']
{1, 2, 3, 4, 6, 8, 11}
>>> s2k['ijsblokje']
{1, 2, 3, 5, 9, 11, 12}
>>> s2k['zebra']
{2, 3, 4, 5, 6, 7, 8}
>>> gedeelde_kaarten('sneeuwman', 'ijsblokje', s2k)
{1, 2, 3, 11}
>>> gedeelde_kaarten('ijsblokje', 'zebra', s2k)
{2, 3, 5}
>>> gedeelde_kaarten('zebra', 'sneeuwman', s2k)
{2, 3, 4, 6, 8}
>>> ontbrekende_kaart('ontbrekend.txt4')
{'babyfles', 'clown', 'madeliefje', 'wortel'}