Ein TicTacToe
Spiel kann durch eine Zeichenfolge dargestellt werden, die die Reihenfolge der Positionen angibt, an denen sich die Spieler bewegen.
0 1 2 3 4 5 6 7 8
Angenommen, es wird X
immer zuerst gespielt.
So bezeichnet eine Zeichenfolge von "012345678" das Spiel
XOX OXO XOX
Beachten Sie, dass das Spiel bereits gewonnen ist, wenn der Spieler das Spiel zu diesem Zeitpunkt als beendet X
markiert 6
und einen Gewinn für gewährt X
. (dh ignoriere die verbleibenden Züge, sobald ein Spieler gewinnt)
Ihre Herausforderung (Code) besteht darin, alle Spiele (sortierte Reihenfolge) und ihre Ergebnisse zu drucken.
Das Format
<movesequence>:<result>\n
z.B:
012345678:X
012345687:X
012345768:X
...
Bezeichnen Sie X
für den ersten Spieler, der gewinnt, O
für den zweiten Spieler und D
für Unentschieden.
Es wird 9!
(362880) Spiele geben.
Hier sind einige Daten, um Ihre Ergebnisse zu überprüfen.
'X' Wins: 212256
'O' Wins: 104544
Draws : 46080
Dies ist ein Codegolf und die Laufzeit sollte innerhalb einer Minute liegen. Habe Spaß!
BEARBEITEN: Entfernte überschüssige Details und drucke sie einfach auf stdout
. Keine Notwendigkeit, eine Datei zu erstellen.
Antworten:
Ruby 1.9, 201 Zeichen
Bisher leicht golfen. Die Fertigstellung dauert hier etwa 45 Sekunden.
quelle
J, 124 Zeichen
X Sieg, O Sieg und Unentschieden zählen Check-out.
War ein bisschen schmerzhaft zu debuggen. :)
quelle
Haskell,
224222 ZeichenLeider erzeugt die
permutations
Funktion vonData.List
keine Permutationen in lexografischer Reihenfolge. Also musste ich 6 Zeichen für die Sortierung aufwenden.quelle
APL (139)
Dies kann wahrscheinlich mehr verkürzt werden, aber es war schon schwer genug. Ob Sie es glauben oder nicht, auf meinem Computer dauert es ungefähr 45 Sekunden (außer der Zeit, die für die Ausgabe von allem auf dem Bildschirm erforderlich ist).
Erläuterung:
M←⍳9
: Speichern Sie in M die Zahlen von 1 bis 9. Intern verwendet dieses Programm 1..9 anstelle von 0..8.{
...}
: eine Funktion, um alle Permutationen zu erhalten:1≥⍴⍵:↑,↓⍵
: Wenn die Länge kleiner oder gleich 1 ist, geben Sie das Argument als Matrix zurück.⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵
: ansonsten entferne jedes Zeichen in⍵
von⍵
, erhalte die Permutationen davon und füge das Zeichen wieder in hinzu.¨↓
: für jede Permutation ...{
...}
: eine Funktion, die den Gewinner für diese Permutation gibt:⊃,/(,/⍕¨⍵-1),':',{
...}⍵
: Erhalte die Permutation als String, wobei alle Zahlen um 1 verringert werden (um die erforderliche 0..8-Ausgabe anstelle von 1..9 zu erhalten), gefolgt von einem Doppelpunkt, gefolgt von dem Zeichen, das den Gewinner bezeichnet:⍉5 2⍴0,⍨⍵
: trenne die Züge mit X von den Zügen mit O. Da O einen Zug weniger als X hat, wird dieser Raum mit gefüllt0
, was nicht genutzt wird und das Ergebnis nicht beeinflusst.{
...}¨↓
: Führen Sie für die X-Karte und die O-Karte die folgende Funktion aus, die bestimmt, ob in einem der neun Zeitschritte ein Gewinn erzielt wird:(M∘.≥M)∧[2]M∊⍵
Generieren Sie eine Bitboard aus dem Umzug Zahlen und:and
diese Bitboard mit dem bitstrings100000000
,110000000
...111111111
den Zustand der Platte an jeden der neun Momente in der Zeit zu erhalten.{
...}¨↓
: Führen Sie für jede dieser Funktionen die folgende Funktion aus:⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔'
: Holen Sie sich die Bitboards für jede mögliche Gewinnsituation⍵∘{⍵≡⍵∧⍺}¨↓
:and
Jeder Gewinnstatus mit dem aktuellen Bitboard und prüfen, ob der Gewinnstatus noch vorhanden ist∨/↑
:or
diese zusammen geben, ob es einen Gewinn auf diesem Bitboard gibt1∊T←↑
: Erstelle eine 9x2-Matrix mit den 9 X-Zeitschritten in der ersten Reihe und den 9 O-Zeitschritten in der zweiten Reihe. Speichern Sie dies in T. Wenn es eine 1 in dieser Matrix gibt, hat jemand gewonnen.:'XO'[1+</+/T]
: Wenn jemand gewonnen hat, geben Sie "X" oder "O", je nachdem, wer1
zuerst war.⋄'D'
: Wenn niemand gewonnen hat, geben Sie 'D'.↑
: Bilde daraus eine Matrix, so dass sie jeweils in einer eigenen Zeile angezeigt werden.quelle
Python Ungolfed
quelle
permutations
C ++ Ungolfed
quelle
Python 2.7 (237)
quelle