Der 5-Karten-Zaubertrick beinhaltet einen Magier, dessen Assistent ihnen 4 gezeigte und eine versteckte Karte in dieser Reihenfolge gibt, und der Magier muss die versteckte Karte erraten.
WARNUNG: Lösung unten! Geh jetzt oder lass dich damit verwöhnen.
Die Lösung
Der Trick dabei ist, dass die fünf Karten in einer bestimmten Reihenfolge vergeben werden !
sind die 5 Karten in der angegebenen Reihenfolge.
ist die Kartennummer von in (Zahlenreihenfolge).
, wobei eine Kartennummer und eine ganze Zahl ist, ist gleich der Kartennummer , die rechts von in , und wird bei Bedarf an den Anfang umgebrochen.
ist die Farbe von in (Farbenreihenfolge).
, wobei eine Kartennummer und eine Farbe ist, bezeichnet die Karte mit Kartennummer und Farbe .
, wo und - Karten sind, ist wahrwenn ‚s Anzug auf den von links ist s Anzug in‘ oder ihre Anzüge gleich sind und ‚s Kartennummer ist links von ‘ s Kartennummer in .
, wobei und Karten sind, ist wahr, wenn falsch ist.
, wobei , und Karten sind, ist der Permutationsindex dieser Reihenfolge von ihnen, spezifiziert durch die folgende Tabelle:
Die Lösung für den 5-Karten-Zaubertrick lautet:
Die Herausforderung
So weit, ist es gut. Jedoch angegeben , die Berechnung zu tun oben bereits gefragt hier . Stattdessen besteht Ihre Herausforderung darin, die 5 Karten in keiner bestimmten Reihenfolge richtig zu bestellen. Dies bedeutet, dass die ersten vier Karten in der Ausgabe die fünfte darstellen. Mit anderen Worten, sei der Assistent. Bedarf:
- .
- (das muss also möglich sein).
Beispiel
Betrachten wir die Menge 7H,2D,6D,5C,6C
. Zunächst nehmen wir die 25 Paare:
7H,7H 7H,2D 7H,6D 7H,5C 7H,6C
2D,7H 2D,2D 2D,6D 2D,5C 2D,6C
6D,7H 6D,2D 6D,6D 6D,5C 6D,6C
5C,7H 5C,2D 5C,6D 5C,5C 5C,6C
6C,7H 6C,2D 6C,6D 6C,5C 6C,6C
Dann entfernen wir offensichtlich die 5 Paare, die dieselbe Karte zweimal enthalten, sie existieren nicht in einem einzigen Deck:
7H,2D 7H,6D 7H,5C 7H,6C
2D,7H 2D,6D 2D,5C 2D,6C
6D,7H 6D,2D 6D,5C 6D,6C
5C,7H 5C,2D 5C,6D 5C,6C
6C,7H 6C,2D 6C,6D 6C,5C
Danach, da die Anzüge gleich sein müssen, sind verschiedene Anzüge in einem Paar ein Nein-Nein:
2D, 6D 6D, 2D 5C, 6C 6C, 5C
Schließlich prüfen wir, ob es möglich ist, von der ersten zur zweiten Karte zu gelangen, indem wir höchstens 6 addieren und die Hälfte der verbleibenden Paare entfernen:
2D, 6D 5C, 6C
Jetzt haben wir die gültigen Paare: 2D,6D
und 5C,6C
. Die erste Karte jedes Paares ist Karte 1, die letzte Karte ist Karte 5.
Wir werden 5C,6C
hier der Einfachheit halber mitgehen . Der ganze Satz besteht 7H,2D,6D,5C,6C
also darin, die 2 Karten in dem von uns gewählten Paar zu entfernen 7H,2D,6D
. Diese Karten stellen dar 6 - 5 = 1
, also müssen wir sie wie "min, mid, max" bestellen. 7H > 2D < 6D < 7H
oder einfach 2D < 6D < 7H
, so haben wir es jetzt 2D,6D,7H
.
Der letzte Schritt ist, all dies zusammenzufügen, so dass unser Ergebnis sein wird 5C,2D,6D,7H,6C
.
Klarstellungen
- Sie können
10
anstelle von verwendenT
. - Sie können eine von verwenden
♠♥♦♣
,♤♡♢♧
oder♠♡♢♣
stattCDHS
, respectively. - Dies ist Code-Golf , der kürzeste Code gewinnt.
Testfälle
Sie können für jeden Testfall eine oder mehrere der gültigen Lösungen ausgeben.
8S,TD,5C,QS,TS -> 8S,5C,QS,TD,TS
... 8S,TD,TS,5C,QS
... TS,5C,8S,TD,QS
JD,KH,4S,9D,8S -> 9D,KH,8S,4S,JD
... 4S,JD,KH,9D,8S
4H,4D,TH,KH,2C -> 4H,KH,4D,2C,TH
... TH,4D,2C,4H,KH
... KH,4D,TH,2C,4H
3S,KS,8S,KH,9H -> 9H,8S,KS,3S,KH
... 3S,KS,9H,KH,8S
... 8S,3S,9H,KH,KS
... KS,KH,9H,8S,3S
KH,TS,3C,7H,JD -> 7H,TS,JD,3C,KH
4C,KC,TD,JD,QS -> KC,JD,QS,TD,4C
... TD,4C,KC,QS,JD
AC,5H,8D,6D,8S -> 6D,AC,8S,5H,8D
AS,TC,3S,2H,9C -> 9C,2H,AS,3S,TC
... AS,9C,2H,TC,3S
4C,JS,AS,8H,JC -> JC,JS,AS,8H,4C
... JS,JC,4C,8H,AS
4H,QS,TH,QC,AC -> QC,4H,QS,TH,AC
... 4H,QS,QC,AC,TH
quelle
Antworten:
Node.js ,
190186180 BytesProbieren Sie es online!
Wie?
Kartennummern identifizieren und vergleichen
Die HilfsfunktionG gibt einen Index zurück, der die Nummer einer gegebenen Karte darstellt.
"NS"
Generieren der Permutationen der Eingabe
Die Anzüge testen
Der erste offensichtliche Test besteht darin, sicherzustellen, dass die erste und die letzte Karte dieselbe Farbe haben. Wir lehnen die Permutation ab, wenn sie nicht gleich sind.
Den Abstand prüfen
Wir berechnen den Abstand zwischen der ersten Kartennummer und der letzten Kartennummer mit:
Dieser Test basiert auf der Funktionsweise des
sort()
Algorithmus von Node.js.sort()
Betrachten wir den folgenden Code:
Nun, wenn wir das tun:
Jede Permutation generiert eine eindeutige Bitmaske, die auf eine eindeutige Entfernung abgebildet wird:
Gegebenk können wir es in die Distanz umrechnen, indem wir tun:
Wenn wir alles zusammenfügen, haben wir folgenden Test:
quelle
Python 3 ,
260 248232 BytesProbieren Sie es online!
-12 Bytes dank Eric the Outgolfer
-14 Bytes durch Entfernen eines Listenverständnisses
quelle
Sauber ,
225220209 BytesProbieren Sie es online!
Als komponierte Funktion
:: [[Char]] -> [[Char]]
, mit einigen Helfern.Erweitert:
quelle
Ruby , 175 Bytes
Probieren Sie es online!
Eine Lambda-Funktion, die eine Reihe von Karten als Zeichenfolgen verwendet
Kommentiert
quelle
Jelly , 41 Bytes
Ein monadischer Link, der eine Liste von Zeichenlisten akzeptiert und eine Liste aller gültigen Arrangements im selben Format zurückgibt.
Probieren Sie es online! (Die Fußzeile formatiert das Ergebnis als Raster, um das implizite Zertrümmern des Ausdrucks durch den Code des Links bei Ausführung als vollständiges Programm zu vermeiden.)
Oder sehen Sie sich eine Testsuite an .
Ich habe den Verdacht, dass ein anderer Ansatz viel knapper sein wird. Ich werde diese Herausforderung später noch einmal wiederholen müssen!
... hmm, ich hatte noch ein bisschen Geduld und bekam noch 41 Bytes ( Test ):
quelle