Hier is een kaartentruc die uitgedacht werd door Martin David Kruskal, een Amerikaanse wiskundige en fysicus die carrière maakte aan Princeton University en Rutgers University. Geef een vriendin een complete set speelkaarten en vraag haar om de volgende instructies op te volgen:

  1. Denk aan een "geheim getal" tussen 1 en 10. (voorbeeld: 6)

  2. Schud het kaartspel willekeurig door elkaar en leg de kaarten één voor één op tafel met de beeldzijde naar boven. Tel in gedachten vanaf 1 terwijl je de kaarten aan het aflopen bent.

  3. Als je geteld hebt tot aan het geheim getal, beschouw dan de laatste kaart die je op tafel gelegd hebt als de volgende "geheime kaart". Gebruik de waarde van die geheime kaart als je nieuw geheim getal. Azen tellen als 1 en boeren, dames en heren tellen als 5. (voorbeeld: als de zesde kaart een klaver vier is, dan wordt 4 je nieuw geheim getal)

  4. Doorloop op die manier één voor één alle speelkaarten, terwijl je telkens opnieuw stilletjes begint te tellen vanaf 1 wanneer je een nieuwe geheime kaart tegenkomt. Onthoud de laatste geheime kaart die je bent tegengekomen.

Dat is de enige uitleg die je hoeft te geven. Je kijkt vervolgens toe hoe zij één voor één de kaarten op tafel legt. Nadat alle kaarten op tafel gelegd zijn, kan je de laatste geheime kaart onthullen op gelijk welke manier, bij voorkeur door middel van een weddenschap met een gigantisch grote inzet.

geheime kaarten

Je kunt dit doen omdat je gewoon hebt meegespeeld. Als je vriendin de kaarten op tafel aan het leggen is, kies je de waarde van één van de eerste kaarten die op de tafel gelegd worden (of je kiest op voorhand zelf een geheim getal tussen 1 en 10) en je volgt in stilte dezelfde procedure die zij uitvoert. Negen op de tien keer zullen jullie "paden" doorheen de speelkaarten elkaar kruisen en zal jouw laatste geheime kaart dezelfde zijn als de hare. Het is al verre van evident om in te zien dat dit het geval is, en dat zal het zeker niet zijn als je weigert om uit te leggen wat er achter de truc zit.

Opgave

Bij deze opgave stellen we een complete set speelkaarten voor als een lijst of tuple met 52 strings. Elke speelkaart wordt hierbij voorgesteld door een string bestaande uit twee karakters, waarvan het eerste karakter de waarde van de kaart voorstelt, en het tweede karakter de kleur. De onderstaande twee tabellen geven de voorstelling weer van de dertien verschillende waarden (links) en de vier verschillende kleuren (rechts). Een complete set speelkaarten bevat de 52 verschillende kaarten die gevormd worden door alle combinaties te maken van de waarden met de kleuren.

waarde voorstelling
2, …, 9 2, …, 9
10 T
boer J
dame Q
heer K
aas A
kleur voorstelling
klaveren c
ruiten d
schoppen s
harten h

Schrijf een functie geheime_kaarten waaraan twee argumenten moeten doorgegeven worden: een geheim getal $$n \in \mathbb{N}$$ ($$1 \leq n \leq 10$$) en een complete set speelkaarten. De functie moet de procedure van de kaartentruc uitvoeren zoals die hierboven werd beschreven, en een lijst teruggeven met alle geheime kaarten die men bij deze procedure op tafel legt, in de volgorde waarin ze op tafel gelegd worden. De argumenten die aan de functie doorgegeven worden, leggen het geheime getal vast dat in stap 1 van de procedure gekozen wordt, en de volgorde van de kaarten nadat ze geschud zijn in stap 2 van de procedure. De functie mag de kaarten dus niet opnieuw schudden.

Voorbeeld

>>> spel = ['3c', '2d', 'Kd', 'Ts', '8d', 'Th', 'Jc', '8c', '6s', '4d', '3h', '5d', '7h', 'Jh', '2c', '2h', '2s', '9h', '5s', '6c', '6h', 'Qh', 'Ah', 'Qd', '9d', 'Kc', 'Tc', 'Td', '5h', '7c', 'As', '5c', 'Ks', '3d', 'Qs', '8h', '4c', 'Js', '7s', '4s', '3s', '6d', 'Qc', '4h', 'Ad', '7d', '8s', 'Ac', '9s', 'Jd', 'Kh', '9c']
>>> geheime_kaarten(6, spel)
['Th', '2h', '9h', 'Tc', '4c', '3s', '4h', 'Ac', '9s']
>>> geheime_kaarten(2, spel)
['2d', 'Ts', 'Jh', '5s', 'Qd', '5h', '3d', '4c', '3s', '4h', 'Ac', '9s']
>>> geheime_kaarten(10, spel)
['4d', 'Jh', '5s', 'Qd', '5h', '3d', '4c', '3s', '4h', 'Ac', '9s']