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 .
quelle
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
187**97
undk+15
funktioniert auch, aber ich bin mir ziemlich sicher, dass dies die einzigen beiden Sätze sind, die für diesen Algorithmus kürzer sind.1/34547
mitk+14
funktioniert auch.Python 2 ,
143140138136127125124123121 BytesProbieren Sie es online!
Asse sind hoch
Kodiert die drei Karten, indem sie ihre Position in einer sortierten Liste der Karten finden (
0=smallest, 1=middle, 2=largest
):Dies wird in der Basis 3 in eine Ganzzahl umgewandelt und mit 3 multipliziert und durch 10 dividiert:
Die verschiedenen Kodierungen sind:
Gerettet:
quelle
3
war clever! Nette Antwort :)0
am Ende ein und dividiere durch 10, was äquivalent aussieht.Gelee , 33 Bytes
Probieren Sie es online!
Erläuterung
Die erste Zeile ist Niladisch. Es ergibt sich eine Liste der 52 Karten
Ruft im Hauptlink
¢
das Ergebnis des ersten Links auf, bei dem es sich um die Liste der Karten handelt.quelle
1
für Ass verwenden.APL (Dyalog Unicode) , 49 Byte SBCS
Probieren Sie es online!
Übersicht:
'CDHS'∘.,2↓⎕D,'TJQKA'
Erzeugt das äußere Produkt, also eine 2D-Matrix mit(C2 C3 C4 ...), (D2 D3 D4 ...), ...
. Wir transponieren dann diese Matrix, um sie zu erhalten(C2 D2 H2 ...), ...
und dann zu verflachen.Vielen Dank an @ngn für das
2-⌊1.8⊥
, das die Reihenfolge der Karten (SML = 1 2 3) annimmt und bewertet (wie die 1 bis 6 im OP).Code Erklärung:
quelle
Retina ,
218208 BytesProbieren Sie es online!
Erläuterung:
Ersetzt Asse, Buben, Damen und Könige durch 1, 11, 12 und 13. Die ersten beiden Zeilen stehen
1
vor dem Buchstaben, und die letzte Zeile setzt die zweite Ziffer um.Das
*
bedeutet, dass in dieser Phase die Arbeitszeichenfolge nicht geändert werden darf. Dies mag die Bühne sinnlos erscheinen lassen, wird aber später nützlich sein. Der'
teilt die Arbeitszeichenfolge an jeder Stelle auf undG0
nimmt die erste (so findet er die erste Karte).Die ersten beiden Zeilen multiplizieren die Zahlen auf den Karten mit 5 und verwandeln sie dann in Unary (Beispiel: 5 wird als _____ dargestellt), sodass wir später kleinere Beträge für Farben hinzufügen können. Die letzte Zeile teilt sich in Felder auf und behält die letzten drei Karten.
Dies wandelt Clubs, Diamonds, Hearts und Spades in 0, 1, 2 und 3 um und verwandelt die Zahl in Unary. Da es sich nun auf dem an der Nummer angehängten Teil der Karte befindet, gibt es einen eindeutigen Wert für die Karte an, der bestimmt, wie hoch sie ist.
Dadurch werden die Reihenfolge der Karten und der Wert ermittelt, der der ersten Karte hinzugefügt werden soll. In der ersten Zeile werden beispielsweise
/^(_+)¶\1_+/(
Aufträge abgeglichen, deren mittlerer Wert größer als der erste Wert ist. Es wird eine if-else-Schleife erstellt, die angibt, was zu tun ist (da diese Reihenfolge den Permutationen 1, 2 und 4 entspricht).K
markiert eine Konstante.Erinnern Sie sich an früher, als wir
*
anzeigten, dass eine Bühne die Arbeitssaite nicht beeinträchtigen würde? Hier setzen wir es ein. Diese Stufe ist eine Ersetzungsstufe; Es ersetzt die Zahl, die hinzugefügt werden soll$+3-$&
.$+3
Er betritt die*
Bühne und erhält die-
Farbe und die Nummer der ersten Karte, fungiert als Trenner und$&
ist das Match. So ist der Arbeitsstring jetzt{suit}{original number}-{number to add}
Dies macht die beiden Zahlen unär und addiert sie.
Die oberste Zeile fängt entweder die Zahl oder die Zahl - 13 ein (damit wir keine Ausgaben von zB S16 bekommen). In der untersten Zeile wird die erfasste Zahl wieder zur Basis 10, und das Ergebnis wird implizit gedruckt.
quelle
Kohle ,
6462 BytesProbieren Sie es online! Link ist eine ausführliche Version des Codes. Verwendet
T
für 10 und sortiertA
hoch. Der Permutationsindex war nicht sehr einfach zu dekodieren. Eine andere Permutationsreihenfolge hätte mir mindestens drei Bytes erspart. Erläuterung:Addiere 2 zu allen ganzen Zahlen von 0 bis 7, verbinde sie dann und setze
TJQKA
das Suffix für die Bildkarten und das Ass. Dies spart 2 Bytes über ein String-Literal, obwohl sich herausstellt, dassA
ein Byte durch String-Komprimierung sowieso gespart worden wäre , wenn ein High-Wert vorliegt.Karte über die Karten und die Farben, die die beiden zusammenfassen. Da dies normalerweise ein verschachteltes Array ergeben würde, werden die Ergebnisse stattdessen zu einer einzelnen Zeichenfolge verkettet, die dann wieder in Zeichenpaare aufgeteilt wird.
Finde die Positionen der zweiten, dritten und vierten Karte.
Berechnen Sie den 1-indizierten Permutationsindex. Die ersten beiden Permutationen haben die kleinste Karte zuerst; Dies wird über getestet
⌕υ⌊υ
. Die beiden anderen Permutationspaare unterscheiden sich darin, ob die größte Karte die erste ist. Dies wird über getestet⌕υ⌈υ
. Logische und arithmetische Operationen ordnen diese Tests dann den Werten zu0
,2
und4
; Dies erhöht sich dann1
abhängig vom Vergleich zwischen der dritten und der vierten Karte, die über getestet wurden‹⊟υ⊟υ
. Schließlich wird der Index erhöht, um die gewünschte Codierung zu erhalten.Multiplizieren Sie dies mit 4, indem Sie den Abstand zwischen Karten der gleichen Farbe wiedergeben, die Position der ersten Karte addieren und das Ergebnis zyklisch indexieren und drucken.
quelle
Python 2 , 147 Bytes
Probieren Sie es online!
quelle
Pyth, 42 Bytes
Echt hässlich...
Probieren Sie es online aus: Demo oder Test Suite
quelle
J , 68 Bytes
Probieren Sie es online!
Hinweis: -3 aus TIO-Bytes, weil das
f=.
nicht zählt. Werde versuchen weiter zu golfen und morgen eine Erklärung hinzufügen.quelle
JavaScript (Node.js) , 124 Byte
Probieren Sie es online!
JavaScript (Node.js) , 125 Byte
Probieren Sie es online!
quelle
T-SQL, 211 Bytes
Die Eingabe ist eine Tabellenvariable. Mit T für 10 sind die Asse niedrig
Format für Kartenrang / Farbe KH, 6D, TS
Probieren Sie es online ungolfed
Beachten Sie, wie der SML-Wert (12-17) berechnet wird:
Logischerweise wird S, M, L (1,2,3) in einen numerischen Wert umgewandelt
Durch Multiplizieren mit 3 wird die abgerundete Quadratwurzel zu einer schönen fortlaufenden Zahl.
quelle
05AB1E , 37 Bytes
Port von @dylnans Gelee Antwort , aber leider hat 05AB1E nicht den eingebauten Permutationsindex.
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
Sehen Sie sich meinen Tipp 05AB1E an (Abschnitt So komprimieren Sie Zeichenfolgen, die nicht Teil des Wörterbuchs sind ), um zu verstehen, warum dies so
.•3u§•
ist"jqka"
und.•ôì•
ist"cdhs"
.quelle