PROG0457 - Secret cards

no tags 

Here is a card trick that was invented by Martin David Kruskal, an American mathematician and physicist who made his career at Princeton University and Rutgers University. Give a friend a complete set of playing cards and ask them to follow the instructions :

  1. Think of a "secret number" between 1 and 10 (for example: 6)
  2. Shuffle the set and place the cards one by one on the table face up. Start counting from one in your mind while you are going through the cards.
  3. If you have counted up to the secret number, consider the last card you have placed on the table as the next "secret card". Use the value of the secret card as your new secret number. Aces count as 1 and jacks, queens and kings count as 5. (for example: if the sixth card is a four of clubs, then four is your new secret number)
  4. Go through all the playing cards one by one while you start over again, silently start counting from when you encountered a new secret card. Remember the last secret card that you have encountered.

That is the only explanation that you have to give. You then look at how they put the cards on the table one by one. After all the cards are on the table, you can reveal the last secret card, preferably by means of a bet with gigantic stakes.

geheime kaarten

You can do this because you have played along. While your friend is laying the cards on the table, choose the value of one of the first cards on the table (or choose a secret number between 1 and 10 beforehand ) and silently follow the same procedure. Nine out of ten times your "path" through the cards will intersect and your last secret card will be the same as hers. It's been far from clear to see that this is the case, and that will certainly not change if you refuse to explain what is behind the trick.

Assignment

In this task, we represent a complete set of playing cards as a list or tuple with 52 strings. Each playing card is hereby represented by a string consisting of two characters: the first character is the value of the card and the second character the color. The following two tables give the representation of the thirteen different values (left) and four different colors (right). A complete set of playing cards contains 52 different cards which are formed by using all combinations of the values with the colors.

value representation
2, …, 9 2, …, 9
10 T
jack J
queen Q
king K
ace A
colour representation
clubs c
diamonds d
spades s
hearts h

Write a function secret_cards to which two arguments should be passed: a secret number $n \in \mathbb{N}$ ($1 \leq n \leq 10$) and a complete set of playing cards. The function must perform the procedure of the card trick as described above, and return a list with all the secret cards that are put on the table during this procedure, in the order they are placed on the table. The arguments that are passed to the function, determine the secret number that is chosen in step 1 of the procedure, and the order of the cards after they are shuffled in step 2 of the procedure. The function can not shake the cards again.

Example

>>> game = ['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']
>>> secret_cards(6, game)
['Th', '2h', '9h', 'Tc', '4c', '3s', '4h', 'Ac', '9s']
>>> secret_cards(2, game)
['2d', 'Ts', 'Jh', '5s', 'Qd', '5h', '3d', '4c', '3s', '4h', 'Ac', '9s']
>>> secret_cards(10, game)
['4d', 'Jh', '5s', 'Qd', '5h', '3d', '4c', '3s', '4h', 'Ac', '9s']

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


Added by:Peter Dawyndt
Date:2014-03-23
Time limit:10s
Source limit:50000B
Memory limit:1536MB
Cluster: Cube (Intel G860)
Languages:PY_NBC
Resource:None