Das Ziel dieses Puzzles ist es, ein Kartenspiel mit 52 Karten zu nehmen und es so zu mischen, dass sich jede Karte in einer zufälligen Position befindet.
Gegeben:
- Ein Array
deck
von 52 verschiedenen Ganzzahlen, die die Karten darstellen.deck
Enthält zu Beginn genau eine Karte in einer unbekannten Reihenfolge. - Eine Funktion,
int rand(min, max)
die eine zufällige Ganzzahl zwischen intsmin
undmax
inclusive zurückgibt . Sie können davon ausgehen, dass diese Funktion wirklich zufällig ist. - Eine Funktion,
void swap(x, y)
die zwei Karten im Stapel vertauscht. Wenn Sie callenswap(x, y)
, wechseln die Karten an Positionenx
undy
Stellen.
Wann:
- Das Programm ruft auf
shuffle()
(odershuffle(deck)
oderdeck.shuffle()
oder wie auch immer Ihre Implementierung es mag),
Dann:
deck
sollte genau eine von jeder Karte in vollkommen zufälliger Reihenfolge enthalten.
Der Fang:
Sie können keine Variablen deklarieren. Rufen Sie swap
und rand
so oft Sie möchten auf, aber Sie können keine eigenen Variablen deklarieren. Dies schließt for
Schleifenzähler ein - auch implizite wie in a foreach
.
Klarstellungen:
- Sie können kleinere Details an Ihre gewählte Sprache anpassen. Beispielsweise können Sie schreiben
swap
, um zwei Ganzzahlen durch Verweis zu wechseln. Änderungen sollten darin bestehen, diese Arbeit mit Ihrer Sprache zu machen, nicht um das Rätsel zu vereinfachen. deck
kann eine globale Variable sein oder als Parameter verwendet werden.- Sie können alles tun, was Sie wollen, um den Inhalt von
deck
, aber Sie können die Länge nicht ändern. - Ihre Karten können mit 0-51, 1-52 oder einer beliebigen Nummer versehen werden.
- Sie können dies in jeder Sprache schreiben, aber mit der in Ihrer Sprache integrierten
shuffle
Funktion können Sie nicht schummeln . - Ja, Sie könnten die gleiche Zeile 52 Mal schreiben. Niemand wird beeindruckt sein.
- Die Ausführungszeit spielt keine Rolle, aber die wahre Zufälligkeit.
- Dies ist nicht wirklich Code-Golf, aber Sie können Ihren Code gerne minimieren / verschleiern.
Bearbeiten: Kesselschild-Code und Visualizer
Wenn Sie .NET oder JavaScript verwendet haben, finden Sie hier einige nützliche Testcodes:
JavaScript:
- Schneller JavaScript-Visualizer mit CoffeeScript-Quelle: https://gist.github.com/JustinMorgan/3989752bdfd579291cca
- Lauffähige Version (fügen Sie einfach Ihre
shuffle()
Funktion ein): http://jsfiddle.net/4zxjmy42/
C #:
- ASP.NET Visualizer mit C # -CodeBehind: https://gist.github.com/JustinMorgan/4b630446a43f28eb5559
- Stub nur mit den Dienstprogrammmethoden
swap
undrand
: https://gist.github.com/JustinMorgan/3bb4e6b058d70cc07d41
Dieser Code sortiert und mischt das Deck mehrere tausend Mal und führt einige grundlegende Vernunftstests durch: Bei jedem Mischen wird überprüft, ob sich genau 52 Karten ohne Wiederholungen im Deck befinden. Anschließend zeichnet der Visualizer die Häufigkeit jeder Karte auf, die an jeder Stelle im Stapel landet, und zeigt eine Graustufen-Heatmap an.
Die Ausgabe des Visualizers sollte wie Schnee ohne erkennbares Muster aussehen. Offensichtlich kann es keine echte Zufälligkeit beweisen, aber es ist eine schnelle und einfache Möglichkeit zur Stichprobenprüfung. Ich empfehle es oder ähnliches zu verwenden, da bestimmte Fehler im Mischalgorithmus zu sehr erkennbaren Mustern in der Ausgabe führen. Hier ist ein Beispiel für die Ausgabe von zwei Implementierungen, von denen eine einen gemeinsamen Fehler aufweist:
Die fehlerhafte Version mischt das Deck teilweise, sodass es gut aussehen kann, wenn Sie das Array von Hand untersuchen. Der Visualizer erleichtert das Erkennen eines Musters.
deck
selbst gemacht werden kann.
swap
Sie möchten, solange sie ihren grundlegenden Zweck erfüllt. Ein Teil meines Grundes, swap
ein gegebenes zu machen, war, dass die Leute es als "Magie" betrachten und sich auf das Hauptproblem konzentrieren konnten, ohne sich darum sorgen zu müssen, dass es in der Sprache ihrer Wahl funktioniert. Sie können dies entweder tun oder selbst schreiben swap
, es liegt an Ihnen.