La tâche est extraite d’une conférence du professeur MIT Devadas intitulée « Vous pouvez lire dans les pensées» . Une explication détaillée de l'astuce peut être trouvée dans la vidéo liée, ou dans ce document . Je vais essayer de l'expliquer en termes plus simples.
Il s’avère que cette invention a été inventée dans les années 1930 et qu’elle est connue sous le nom de "tour de cinq cartes de Fitch Cheney" .
Le truc va comme ça:
- Cinq cartes au hasard sont choisies parmi un jeu de cartes. Le public et votre assistant peuvent les voir, mais vous ne les voyez pas.
- Votre assistant (avec qui vous avez pratiqué) sélectionnera quatre de ces cartes et vous les montrera dans un ordre spécifique. Notez que la carte cachée n'est pas choisie au hasard parmi les 5 cartes. L'assistant choisit une / la carte qui fera fonctionner l'astuce.
- Vous en déduirez, en fonction des informations que vous pouvez collecter sur les quatre cartes, en quoi consiste la cinquième carte.
Comment?
Gardez les deux points suivants à l’esprit:
Lorsque vous choisissez 5 cartes au hasard, vous avez la garantie qu'au moins deux cartes ont la même couleur 1 .
L'image ci-dessous montre un cercle avec tous les rangs 2 . Comme il s’agit d’un cercle, il est possible de compter: J, Q, K, A, 2, 3 (comptage modulaire). Vous avez la garantie que la carte cachée n'a pas le même rang que la première, puisqu'elles auront la même couleur (expliqué ci-dessous). Il est toujours possible de choisir la première carte et les cartes cachées de telle sorte que la carte cachée soit entre 1 et 6 rangs plus élevé que la première (en comptant dans les cercles). Si la première carte est 1 , la carte cachée sera 2,3,4,5,6 ou 7 . Si la première carte est J , alors la carte cachée sera Q, K, A, 2,3 ou 4 et ainsi de suite.
L'algorithme:
La première carte: Cette carte aura la même couleur que la carte cachée. La carte sera également le point de référence que vous utiliserez pour déterminer le rang de la carte cachée.
Les 2ème, 3ème et 4ème cartes décodent une valeur comprise entre 1 et 6 . Nous appellerons les trois cartes S, M, L (la plus petite carte, la carte du milieu, la plus grande). Les valeurs seront codées comme ceci (ordre lexicographique):
S M L -> 1
S L M -> 2
M S L -> 3
M L S -> 4
L S M -> 5
L M S -> 6
Donc, si le rang de la première carte est 5 et que les trois cartes restantes ont le rang 4 Q 7 (elles sont commandées SLM ), alors la dernière carte a le rang 5 + 2 = 7 . Vous pouvez choisir si l'as doit être la carte la plus haute ou la plus basse, tant que c'est cohérent.
Si plusieurs cartes partagent le rang, la couleur déterminera l'ordre dans lequel C <D <H <S .
Format d'entrée:
Les quatre cartes seront données sous la forme H3 (trois de cœur), DK (roi des diamants), etc. Vous pouvez choisir de prendre l’inverse à l’inverse sous la forme 3H et KD .
L'entrée peut être sur n'importe quel format pratique, mais vous ne pouvez pas combiner la liste des couleurs dans une variable et la liste des rangs dans une autre. 'D5', 'H3' ..
et [['D',5],['H',3] ...
sont tous les deux OK, mais 'DHCH',[5,3,1,5]
n'est pas. Vous ne pouvez pas utiliser des numéros au lieu de lettres, à l' exception des T .
Sortie
La carte cachée, au même format que l’entrée.
Exemple
Faisons un pas à pas:
Input:
D3 S6 H3 H9
Nous savons que la carte cachée est un diamant, puisque la première carte est un diamant. Nous savons aussi que le rang est de 4,5,6,7,8 ou 9 puisque le rang de la première carte est de 3 .
Les cartes restantes sont commandées 6,3,9 ==> M, S, L , qui code la valeur 3 . La carte cachée est donc 3 + 3 = 6 de diamants, donc la sortie devrait être D6 .
Cas de test:
C3 H6 C6 S2
C9 # The order is LMS (H6 > C6, and 2 < 6). 3+6=9
SQ S4 S3 ST # (ST = S10. Format is optional)
S2 # The order is MSL. 12+3=2
HA CA DA SA
H2 # The order is SML. 14+1=2
C'est du code-golf , donc la solution la plus courte dans chaque langue est gagnante. Les explications sont les bienvenues!
1 Il y a quatre couleurs ( C lubs, D iamonds, H earts et S pades).
2 Il y a 13 rangs, 2,3,4,5,6,7,8,9,10, J, Q, K, A . Vous pouvez choisir d’utiliser T au lieu de 10 .
92427**3
et modifiezk+7
pourk+8
sauvegarder 1 octet:a=>(k='A23456789TJQK'+92427**3)[[[r,s],...x]=a.map((c,i)=>[k.search(c[0])+10,c[1],i]),(r-k[x.sort().map(c=>k=k*2|c[2])|k+8])%13]+s