Alice und Bob spielen gerne ein Kartenspiel mit einem Kartenspiel, das mit aufeinander folgenden nichtnegativen ganzen Zahlen nummeriert ist.
Alice hat jedoch eine ganz besondere Art, das Deck zu mischen. Zuerst nimmt sie die oberste Karte vom Stapel und legt sie unten auf den Stapel. Dann entnimmt sie die nächste Karte und legt sie auf einen Stapel. Dann fährt sie die oberste Karte wieder nach unten und legt die neue oberste Karte auf den Stapel. Sie wiederholt diesen Vorgang, bis sie das Deck geleert hat. An diesem Punkt ist der Stapel das neue Deck.
deck | pile
-----------+-----------
3 1 4 0 2 |
1 4 0 2 3 |
4 0 2 3 | 1
0 2 3 4 | 1
2 3 4 | 0 1
3 4 2 | 0 1
4 2 | 3 0 1
2 4 | 3 0 1
4 | 2 3 0 1
| 4 2 3 0 1
4 2 3 0 1 |
Abbildung 1: Alice mischt auf dem 5-Karten-Deck "3, 1, 4, 0, 2". Die Rückseiten der Karten zeigen alle nach links.
Eines Tages gibt Bob bekannt, dass er eine Woche Urlaub macht. Alice, die niemanden hat, mit dem sie spielen kann, engagiert ihre Freundin Eva. Jetzt ist Eve ein schamloser Betrüger, und als sie Alice 'eigentümliches Durcheinander sieht, merkt sie, dass sie das Deck vorher zu ihrem Vorteil stapeln kann!
Wenn Eva nach dem ersten Tag nach Hause kommt, analysiert sie das Spiel und stellt fest, dass sie die besten Chancen hat, wenn die Karten in der Reihenfolge 0, 1, 2, 3, 4, 5 sind. Das hat sie nicht fangen Sie jedoch ab, wie viele Karten sich im Stapel befanden, und schraffieren Sie ein hirnrissiges Schema, um einen Code auf ihren Arm zu schreiben, der beim Ausführen die Größe des Stapels annimmt und die Reihenfolge anzeigt, in der Eve die Karten einlegen muss, damit wann Alice mischt das Deck, das letzte Deck ist in der Reihenfolge 0, 1, 2, 3, ...
Es spielt keine Rolle, in welcher Sprache sich der Code befindet (sie kennt sie alle) oder ob der Code eine Funktion ist, die ein ganzzahliges Argument verwendet und ein Array zurückgibt, oder ein vollständiges Programm, das Eingaben über ein Befehlszeilenargument oder STDIN vornimmt und Schreiben der Ergebnisse an STDOUT. Sie braucht den Code jedoch so kurz wie möglich, um die Wahrscheinlichkeit zu minimieren, dass Alice ihn sieht und sie fängt.
So unmoralisch es auch sein mag, könnt ihr Eve helfen?
Beispiel Ein- und Ausgänge:
in out
1 0
2 0 1
5 2 4 0 3 1
10 2 9 4 8 0 7 3 6 1 5
52 6 51 25 50 12 49 24 48 1 47 23 46 11 45 22 44 5 43 21 42 10 41 20 40 2 39 19
38 9 37 18 36 4 35 17 34 8 33 16 32 0 31 15 30 7 29 14 28 3 27 13 26
quelle
shuffle(shuffle(range(5))) == range(5)
...Antworten:
GolfScript,
151413 BytesProbieren Sie es online aus.
Beispiel
Wie es funktioniert
quelle
{}/
anstelle des Kartenoperators ein Zeichen speichern.](
Während die ersten beiden Zeichen effektiv ein leeres Array unter die Eingabe setzen, sparen Sie sich ein späteres[]\
.Julia, 83
Das letzte Element im zurückgegebenen Vektor ist die Oberseite des Decks.
quelle
Mathematica,
927746 BytesErwartet die Eingabe in Variable
n
:Es wird nur buchstäblich rückwärts gespielt, indem man über eine Karte fährt und dann die unterste Karte auflegt.
BEARBEITEN: Sie müssen den Ausgabestapel nicht verfolgen, sondern müssen nur die ganzen Zahlen durchlaufen.
quelle
Python 2.7 - 57
Schön und einfach, einfach den Shuffle umkehren. Ziemlich nah dran, wie es Golfscript macht.
quelle
J (13 Zeichen) und K (9)
Wie sich herausstellt, ist es ein einfacher Vorgang, das Mischen rückgängig zu machen, und APL-Likes haben das Fold-Adverb
/
, um dies so kurz wie möglich zu machen.J nimmt 13 Zeichen mit
(_1|.,)/@i.@-
, während K braucht nur 9:|(1!,)/!:
. APL wäre ähnlich knapp.Hier ist eine Schritt-für-Schritt-Anleitung für die J-Version.
Sie werden vielleicht bemerken, dass wir in J zuerst das Array der ganzen Zahlen umkehren, aber in K machen wir es danach: Dies liegt daran, dass die K-Falte im
foldl
Vergleich zu den J- Zahlen eher wie eine istfoldr
.quelle