Die Aufgabe stammt aus einer MIT-Vorlesung von Prof. Devadas mit dem Titel You can read minds . Eine ausführliche Erklärung des Tricks finden Sie im verlinkten Video oder in diesem Dokument . Ich werde versuchen, es in einfacheren Begriffen zu erklären.
Es stellt sich heraus, dass dies in den 1930er Jahren erfunden wurde und als "Fünf-Karten-Trick von Fitch Cheney" bekannt ist .
Der Trick geht so:
- Aus einem Kartenspiel werden fünf zufällige Karten ausgewählt. Das Publikum und Ihr Assistent können sie sehen, aber Sie tun es nicht.
- Ihr Assistent (mit dem Sie geübt haben) wählt vier dieser Karten aus und zeigt sie Ihnen in einer bestimmten Reihenfolge. Beachten Sie, dass die versteckte Karte nicht zufällig aus den 5 Karten ausgewählt wird. Der Assistent wählt eine / die Karte, mit der der Trick funktioniert.
- Sie werden auf der Grundlage der Informationen, die Sie aus den vier Karten entnehmen können, ableiten, was die fünfte Karte ist.
Wie?
Beachten Sie die folgenden zwei Punkte:
Bei der Auswahl von 5 zufälligen Karten wird garantiert, dass mindestens zwei Karten dieselbe Farbe 1 haben .
Das Bild unten zeigt einen Kreis mit allen Rängen 2 . Da es sich um einen Kreis handelt, kann gezählt werden: J, Q, K, A, 2, 3 (dh modulares Zählen). Es wird garantiert, dass die versteckte Karte nicht den gleichen Rang wie die erste hat, da sie dieselbe Farbe hat (siehe unten). Es ist immer möglich, die erste Karte und die versteckten Karten so zu wählen, dass die versteckte Karte zwischen 1 und 6 Rängen höher ist als die erste (beim Zählen in Kreisen). Wenn die erste Karte 1 ist , ist die versteckte Karte 2,3,4,5,6 oder 7 . Wenn die erste Karte J ist , ist die versteckte Karte Q, K, A, 2,3 oder 4 und so weiter.
Der Algorithmus:
Die erste Karte: Diese Karte hat die gleiche Farbe wie die versteckte Karte. Die Karte ist auch der Bezugspunkt, an dem Sie den Rang der versteckten Karte ermitteln.
Die 2., 3. und 4. Karte dekodiert einen Wert im Inklusivbereich 1 ... 6 . Wir nennen die drei Karten S, M, L (kleinste Karte, mittlere Karte, größte Karte). Die Werte werden wie folgt codiert (lexikografische Reihenfolge):
S M L -> 1
S L M -> 2
M S L -> 3
M L S -> 4
L S M -> 5
L M S -> 6
Wenn also der Rang der ersten Karte 5 ist und die verbleibenden drei Karten den Rang 4 Q 7 haben (sie sind SLM- geordnet ), hat die letzte Karte den Rang 5 + 2 = 7 . Sie können wählen, ob das Ass die höchste oder die niedrigste Karte sein soll, solange es konsistent ist.
Wenn mehrere Karten den gleichen Rang haben, bestimmt die Farbe die Reihenfolge, in der C <D <H <S ist .
Eingabeformat:
Die vier Karten werden als H3 (drei Herzen), DK (König der Diamanten) usw. ausgegeben . Sie können die Eingabe auch umgekehrt als 3H und KD verwenden.
Die Eingabe kann in einem beliebigen Format erfolgen, aber Sie können die Liste der Farben in einer Variablen und die Liste der Ränge in einer anderen nicht kombinieren. 'D5', 'H3' ..
und [['D',5],['H',3] ...
sind beide OK, ist es aber 'DHCH',[5,3,1,5]
nicht. Sie können Zahlen nicht anstelle von Buchstaben verwenden, mit Ausnahme von T .
Ausgabe
Die versteckte Karte im selben Format wie die Eingabe.
Beispiel
Machen wir eine Komplettlösung:
Input:
D3 S6 H3 H9
Wir wissen, dass die versteckte Karte ein Diamant ist, da die erste Karte ein Diamant ist. Wir wissen auch, dass der Rang 4,5,6,7,8 oder 9 ist, da der Rang der ersten Karte 3 ist .
Die restlichen Karten sind nach 6,3,9 geordnet ==> M, S, L , was den Wert 3 codiert . Die verborgene Karte ist also 3 + 3 = 6 Diamanten, daher sollte die Ausgabe D6 sein .
Testfälle:
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
Das ist Code-Golf , also gewinnt die kürzeste Lösung in jeder Sprache. Erklärungen sind erwünscht!
1 Es gibt vier Farben ( C Lubs, D iamonds, H eARTS und S PAdES).
2 Es gibt 13 Reihen, 2,3,4,5,6,7,8,9,10, J, Q, K, A . Sie können T anstelle von 10 verwenden .
92427**3
und ändernk+7
,k+8
um 1 Byte zu speichern: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