Het kaartspel Set wordt gespeeld met een stapel van 81 kaarten. Op elke kaart staan symbolen met vier eigenschappen die de kaarten uniek maken:

Elke mogelijke combinatie van eigenschappen (bijvoorbeeld drie volle groene ruiten) komt op precies één kaart voor. Bepaalde combinaties van drie kaarten vormen een Set als voor elk van de vier eigenschappen afzonderlijk geldt dat de drie kaarten ofwel gelijk zijn voor die eigenschap (de symbolen op de drie kaarten zijn bijvoorbeeld allemaal rood), ofwel dat ze alledrie verschillende zijn voor die eigenschap (er is bijvoorbeeld een kaart met rode symbolen, een kaart met groene symbolen en een kaart met paarse symbolen). Een voorbeeld van een Set is:

De symbolen op deze drie kaarten hebben dezelfde vulling en dezelfde vorm. Het aantal en de kleur van de symbolen is voor de drie kaarten verschillend. Het volgende voorbeeld is géén Set want twee kaarten hebben symbolen met dezelfde kleur (groen), terwijl de symbolen op de derde kaart een andere kleur (paars) hebben:

In het spel legt een deler kaarten op tafel totdat er twaalf zijn neergelegd of een speler een Set ziet en "Set!" roept. Er kunnen bijvoorbeeld vijf Sets gevonden worden onder de twaalf kaarten in onderstaande afbeelding: het zijn de combinaties van drie kaarten die in de linkerbovenhoek met dezelfde letter aangeduid worden. De combinatie die aangeduid wordt met de letter A correspondeert met het voorbeeld van een Set dat we hierboven gegeven hebben.

set
Tijdens het verloop van het kaartspel SET liggen er doorgaans 12 kaarten op tafel. De combinaties van drie kaarten die in de linkerbovenhoek met dezelfde letter aangeduid zijn, vormen de vijf sets in deze collectie van 12 kaarten.

De speler die "Set!" riep, neemt de kaarten in de Set en de deler vult de kaarten aan totdat er twaalf op tafel liggen. Een speler die een Set tussen de twaalf kaarten ziet, roept "Set!" en neemt de drie kaarten, die door de deler vervangen worden door drie nieuwe kaarten. Een speler die "Set!" roept maar niet direct een Set kan aanwijzen of een combinatie aanwijst die geen Set is, mag niet meer meespelen totdat een andere speler een Set heeft gevonden. Zolang er tussen de kaarten op tafel geen Set te vinden is, legt de deler regelmatig nog drie extra kaarten op tafel. Het spel gaat verder totdat de stapel kaarten uitgeput is en er geen Sets meer op tafel liggen. Op dat moment wint de speler die het meeste Sets heeft verzameld.

Opgave

Een kaart uit het kaartspel Set wordt voorgesteld als een tuple met de vier onderscheidende eigenschappen (str) van de kaart in een vaste volgorde: i) het aantal symbolen (een, twee of drie), ii) de vulling van de symbolen (vol, halfvol of leeg), iii) de kleur van de symbolen (rood, groen of paars) en iv) de vorm van de symbolen (ruit, golf of ovaal). Gevraagd wordt:

Opmerking

De functies eigenschappen, isset en sets zijn niet afhankelijk van de functies willekeurige_kaart en willekeurige_kaarten. Deze twee groepen functies kunnen dus los van elkaar geïmplementeerd worden.

Voorbeeld

>>> willekeurige_kaart()
('een', 'vol', 'rood', 'golf')
>>> willekeurige_kaart()
('twee', 'leeg', 'paars', 'ruit')
>>> willekeurige_kaart()
('drie', 'halfvol', 'groen', 'ovaal')

>>> willekeurige_kaarten(2)
{('een', 'vol', 'paars', 'ruit'), ('een', 'vol', 'paars', 'ovaal')}
>>> willekeurige_kaarten(3)
{('twee', 'halfvol', 'rood', 'ruit'), ('een', 'vol', 'rood', 'ruit'), ('twee', 'vol', 'paars', 'ovaal')}
>>> willekeurige_kaarten(4)
{('drie', 'vol', 'rood', 'ruit'), ('twee', 'halfvol', 'paars', 'ruit'), ('een', 'vol', 'rood', 'ovaal'), ('drie', 'leeg', 'groen', 'ovaal')}

>>> eigenschappen(('een', 'leeg', 'groen', 'ruit'), ('twee', 'leeg', 'rood', 'ruit'), ('drie', 'leeg', 'paars', 'ruit'))
({'een', 'twee', 'drie'}, {'leeg'}, {'groen', 'paars', 'rood'}, {'ruit'})
>>> eigenschappen(('een', 'halfvol', 'groen', 'ovaal'), ('twee', 'halfvol', 'groen', 'golf'), ('drie', 'halfvol', 'paars', 'ruit'))
({'een', 'twee', 'drie'}, {'halfvol'}, {'groen', 'paars'}, {'golf', 'ovaal', 'ruit'})
>>> eigenschappen(('twee', 'halfvol', 'rood', 'ruit'), ('een', 'vol', 'rood', 'ruit'), ('twee', 'vol', 'paars', 'ovaal'))
({'een', 'twee'}, {'halfvol', 'vol'}, {'rood', 'paars'}, {'ovaal', 'ruit'})

>>> isset(('een', 'leeg', 'groen', 'ruit'), ('twee', 'leeg', 'rood', 'ruit'), ('drie', 'leeg', 'paars', 'ruit'))
True
>>> isset(('een', 'halfvol', 'groen', 'ovaal'), ('twee', 'halfvol', 'groen', 'golf'), ('drie', 'halfvol', 'paars', 'ruit'))
False
>>> isset(('twee', 'halfvol', 'rood', 'ruit'), ('een', 'vol', 'rood', 'ruit'), ('twee', 'vol', 'paars', 'ovaal'))
False

>>> sets([('drie', 'vol', 'paars', 'ovaal'), ('een', 'leeg', 'groen', 'ruit'), ('twee', 'vol', 'paars', 'ruit'), ('een', 'vol', 'rood', 'golf'), ('twee', 'leeg', 'rood', 'golf'), ('een', 'vol', 'paars', 'ruit'), ('drie', 'vol', 'groen', 'ruit'), ('een', 'halfvol', 'paars', 'golf'), ('drie', 'vol', 'groen', 'golf'), ('drie', 'vol', 'groen', 'ovaal'), ('twee', 'leeg', 'rood', 'ruit'), ('drie', 'leeg', 'paars', 'ruit')])
5
>>> sets((('drie', 'leeg', 'rood', 'ruit'), ('drie', 'leeg', 'groen', 'golf'), ('een', 'halfvol', 'groen', 'ovaal'), ('drie', 'leeg', 'groen', 'ruit'), ('een', 'leeg', 'paars', 'ovaal'), ('drie', 'halfvol', 'paars', 'ovaal'), ('twee', 'halfvol', 'rood', 'golf'), ('drie', 'vol', 'rood', 'ruit'), ('twee', 'vol', 'paars', 'ovaal'), ('een', 'halfvol', 'groen', 'golf'), ('drie', 'halfvol', 'groen', 'ruit'), ('drie', 'leeg', 'rood', 'ovaal')))
4
>>> sets({('een', 'vol', 'groen', 'ovaal'), ('twee', 'vol', 'rood', 'ovaal'), ('drie', 'leeg', 'paars', 'ruit'), ('twee', 'vol', 'rood', 'ruit'), ('drie', 'halfvol', 'paars', 'ovaal'), ('twee', 'vol', 'rood', 'golf'), ('twee', 'halfvol', 'paars', 'ovaal'), ('een', 'leeg', 'paars', 'ruit'), ('twee', 'leeg', 'groen', 'ruit'), ('drie', 'vol', 'paars', 'golf'), ('een', 'vol', 'groen', 'ruit'), ('twee', 'vol', 'groen', 'ruit')})
6
>>> sets([('drie', 'leeg', 'paars', 'ruit'), ('twee', 'leeg', 'groen', 'ruit'), ('drie', 'halfvol', 'rood', 'golf'), ('drie', 'vol', 'paars', 'ruit'), ('drie', 'vol', 'rood', 'golf'), ('een', 'halfvol', 'groen', 'ovaal'), ('twee', 'vol', 'rood', 'ruit'), ('drie', 'leeg', 'paars', 'ovaal'), ('drie', 'vol', 'paars', 'ovaal'), ('een', 'vol', 'groen', 'ovaal'), ('een', 'leeg', 'paars', 'ovaal'), ('twee', 'halfvol', 'rood', 'ruit')])
0

De eerste collectie van 12 kaarten die in bovenstaande voorbeeldsessie wordt doorgegeven aan de functie sets, correspondeert met de kaarten op de afbeelding uit de inleiding.

Epiloog

Marsha Falco ontwikkelde Set terwijl ze in 1974 aan de universiteit van Cambridge genetisch onderzoek1 deed naar de erfelijke oorzaken van epilepsie2 bij Duitse herders3. Om genen en chromosomen in de cellen te bestuderen, maakte ze kaarten met informatie voor elke hond. Omdat bepaalde blokken informatie op elke kaart identiek waren, tekende ze symbolen die blokken informatie vertegenwoordigden, in plaats van alle informatie uit te schrijven. Ze gebruikte symbolen met verschillende eigenschappen (zoals kleur, vulling en aantal) om verschillende combinaties van genen weer te geven. Tijdens het uitleggen van de combinaties aan de dierenartsen waarmee ze werkte, zag Falco dat de kaarten ook ter ontspanning konden dienen en Set was geboren. Marsha speelde het spel jarenlang met haar familie en vrienden voordat ze het commercieel beschikbaar maakte voor het grote publiek.