Het kaartspel Set wordt gespeeld met een stapel van 81 kaarten. Op elke kaart staan symbolen met vier eigenschappen die de kaarten uniek maken:
het aantal symbolen: een, twee of drie
de vulling van de symbolen: vol, halfvol of leeg
de kleur van de symbolen: rood, groen of paars
de vorm van de symbolen: ruit, golf of ovaal
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:
een lege groene ruit
twee lege rode ruiten
drie lege paarse ruiten
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:
een halfvolle groene ovaal
twee halfvolle groene golven
drie halfvolle paarse ruiten
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.
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.
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:
Schrijf een functie willekeurige_kaart waaraan geen argumenten moeten doorgegeven worden. De functie moet een willekeurig getrokken kaart uit de stapel van het kaartspel Set teruggeven.
Schrijf een functie willekeurige_kaarten waaraan een getal $$n \in \mathbb{N}$$ (int) moet doorgegeven worden. De functie moet een verzameling (set) teruggeven met $$n$$ willekeurig getrokken kaarten uit de stapel van het kaartspel Set.
Schrijf een functie eigenschappen waaraan drie kaarten uit het kaartspel Set moeten doorgegeven worden. De functie moet een tuple met vier verzamelingen (set) teruggeven: i) de verschillende aantallen symbolen op de drie kaarten, ii) de verschillende vullingen van de symbolen op de drie kaarten, iii) de verschillende kleuren van de symbolen op de drie kaarten en iv) de verschillende vormen van de symbolen op de drie kaarten.
Schrijf een functie isset waaraan drie kaarten uit het kaartspel Set moeten doorgegeven worden. De functie moet een Booleaanse waarde (bool) teruggeven, die aangeeft of de drie gegeven kaarten een Set vormen.
Schrijf een functie sets waaraan een collectie (list, tuple of set) kaarten uit het kaartspel Set moet doorgegeven worden. De functie moet teruggeven hoeveel (int) verschillende combinaties van drie kaarten uit de collectie een Set vormen.
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.
>>> 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.
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.