Maak een stapel met evenveel rode als zwarte kaarten, waarbij de kaarten met hun beeldzijde naar onder liggen. Schud de kaarten willekeurig door elkaar.
Verdeel de kaarten nu op de volgende manier over drie nieuwe stapels. Draai de bovenste kaart van de stapel om. Als het een rode kaart is dan leg je de volgende kaart op de rode stapel zonder naar zijn kleur te kijken. Als het een zwarte kaart is dan leg je de volgende kaart op de zwarte stapel zonder naar zijn kleur te kijken. De bovenste kaart die je hebt omgedraaid leg je op de wegwerpstapel. Herhaal deze stappen totdat je alle kaarten uit de oorspronkelijke stapel verdeeld hebt over de drie nieuwe stapels.
Kies nu willekeurig een natuurlijk getal dat kleiner is dan het aantal kaarten in de rode en de zwarte stapel. Kies willekeurig $$n$$ kaarten uit elk van de twee stapels en verplaats die kaarten naar de andere stapel. Het aantal rode kaarten in de rode stapel zal altijd gelijk zijn aan het aantal zwarte kaarten in de zwarte stapel.
Een standaard kaartspel bestaat uit 52 verschillende kaarten die onderverdeeld worden in vier soorten van elk 13 kaarten: 13 klaveren (♣), 13 ruiten (♦), 13 harten (♥) en 13 schoppen (♠). Klaveren en schoppen zijn zwart, ruiten en harten zijn rood. Van elke soort zijn er telkens kaarten met een rang van 2 tot en met 10, een boer, een vrouw, een heer en een aas. Daarnaast bevat een spel soms twee of drie jokers, maar die laten we hier even buiten beschouwing.
Elke kaart van een standaard kaartspel wordt voorgesteld als een string (str) die bestaat uit de rang van de kaart, gevolgd door de soort van de kaart:
rangen: 2, 3, 4, 5, 6, 7, 8, 9, 10, J (boer), Q (vrouw), K (heer) en A (aas)
soorten: C (klaveren; ♣), D (ruiten; ♦), H (harten; ♥) en S (schoppen; ♠)
Zo stelt AS bijvoorbeeld schoppenaas voor, 10H hartentien en KC klaverenheer.
Een stapel kaarten wordt voorgesteld als een lijst (list) of een tuple (tuple) met de voorstellingen van de opeenvolgende kaarten uit de stapel, waarbij de bovenste kaart van de stapel het eerste element is. Een stapel hoeft niet noodzakelijk alle 52 kaarten van een kaartspel te bevatten. Gevraagd wordt:
Schrijf een functie aantal_kaarten waaraan een stapel kaarten moet doorgegeven worden. De functie heeft ook nog een optionele parameter kleur. Als niet expliciet een argument wordt doorgegeven aan de parameter kleur dan moet de functie het aantal kaarten in de gegeven stapel teruggeven. Als de string rood wordt doorgegeven aan de parameter kleur dan moet de functie het aantal rode kaarten in de gegeven stapel teruggeven. Als de string zwart wordt doorgegeven aan de parameter kleur dan moet de functie het aantal zwarte kaarten in de gegeven stapel teruggeven. Voor alle andere argumenten die aan de parameter kleur worden doorgegeven moet de functie een AssertionError opwerpen met de boodschap ongeldige kleur.
Schrijf een functie roodzwart waaraan een stapel kaarten moet doorgegeven worden. De gegeven stapel kaarten moet evenveel rode als zwarte kaarten bevatten. Als dat niet het geval is dan moet de functie een AssertionError opwerpen met de boodschap verschillend aantal rode en zwarte kaarten. De functie heeft ook nog een optionele parameter onderaan waaraan een Booleaanse waarde kan doorgegeven worden (standaardwaarde: False). De functie moet de procedure uit de inleiding toepassen op de gegeven stapel kaarten en moet een tuple (tuple) teruggeven met de bekomen rode en zwarte stapel. Beide stapels moeten zelf ook als een tuple (tuple) voorgesteld worden. Als de waarde False werd doorgegeven aan de parameter onderaan dan moeten de kaarten uit de gegeven stapel telkens bovenop de rode of de zwarte stapel gelegd worden. Als de waarde True werd doorgegeven aan de parameter onderaan dan moeten de kaarten uit de gegeven stapel telkens onderaan toegevoegd worden aan de rode of de zwarte stapel.
Schrijf een functie verwissel waaraan twee stapels kaarten moeten doorgegeven worden. De functie heeft ook nog een optionele parameter aantal waaraan een natuurlijk getal $$n$$ kan doorgegeven worden (standaardwaarde: 0). De waarde $$n$$ moet kleiner zijn dan het aantal kaarten in de twee gegeven stapels. Als dat niet het geval is dan moet de functie een AssertionError opwerpen met de boodschap ongeldig aantal kaarten. De functie heeft ook nog een optionele parameter onderaan waaraan een Booleaanse waarde kan doorgegeven worden (standaardwaarde: False). De functie moet twee nieuwe stapels maken door $$n$$ kaarten te kiezen uit elk van de twee gegeven stapels en die te verplaatsen naar de andere stapel. Als de waarde False werd doorgegeven aan de parameter onderaan, dan moeten de bovenste $$n$$ kaarten gekozen worden en moeten die ook bovenop de andere stapel gelegd worden. Als de waarde True werd doorgegeven aan de parameter onderaan, dan moeten de onderste $$n$$ kaarten gekozen worden en moeten die ook onderaan toegevoegd worden aan de andere stapel. De functie moet een tuple (tuple) met de twee nieuwe stapels teruggeven, waarbij de nieuwe stapels zelf ook als een tuple (tuple) moeten voorgesteld worden.
>>> stapel = ['4C', '6C', 'JC', '4D', '8D', '9C', '9D', '8S', '2H', '10C', '5D', '7C', '8H', '10H', 'AH', 'KD', 'AC', 'QH', '5C', 'AS', '5H', 'JS', '8C', 'JD'] >>> aantal_kaarten(stapel) 24 >>> aantal_kaarten(stapel, kleur='rood') 12 >>> aantal_kaarten(stapel, kleur='zwart') 12 >>> aantal_kaarten(stapel, kleur='schoppen') Traceback (most recent call last): AssertionError: ongeldige kleur >>> stapel1, stapel2 = roodzwart(stapel) >>> stapel1 ('JS', 'KD', '10H', '7C', '10C', '8S', '9C') >>> stapel2 ('JD', 'AS', 'QH', '4D', '6C') >>> stapel3, stapel4 = roodzwart(stapel, onderaan=True) >>> stapel3 ('9C', '8S', '10C', '7C', '10H', 'KD', 'JS') >>> stapel4 ('6C', '4D', 'QH', 'AS', 'JD') >>> stapel5, stapel6 = verwissel(stapel3, stapel4, aantal=3) >>> stapel5 ('6C', '4D', 'QH', '7C', '10H', 'KD', 'JS') >>> stapel6 ('9C', '8S', '10C', 'AS', 'JD') >>> aantal_kaarten(stapel3, kleur='rood') 2 >>> aantal_kaarten(stapel4, kleur='zwart') 2 >>> stapel7, stapel8 = verwissel(stapel3, stapel4, aantal=2, onderaan=True) >>> stapel7 ('9C', '8S', '10C', '7C', '10H', 'AS', 'JD') >>> stapel8 ('6C', '4D', 'QH', 'KD', 'JS') >>> aantal_kaarten(stapel5, kleur='rood') 4 >>> aantal_kaarten(stapel6, kleur='zwart') 4
Het effect van het verwisselen van de drie bovenste kaarten tussen twee stapels wordt hieronder geïllustreerd aan de hand van dezelfde twee stapels waarop de functie verwissel wordt aangeroepen in het voorbeeld.
Hieronder doen we hetzelfde, maar dan voor onder twee onderste kaarten van de stapels.