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.

dobble
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:

Opgave

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:

Voorbeeld

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'}

Epiloog