Schreiben Sie ein Programm, das alle möglichen Tic Tac Toe-Positionen einschließlich des entsprechenden Spielergebnisses ausgibt. Vermeiden Sie doppelte Ausgaben gleicher Positionen.
Das Programm nimmt keine Eingabe entgegen.
Regeln:
- Eine Positionsausgabe muss aus 9 Zeichen unter Verwendung von
X
undO
für die aufgenommenen Quadrate und einem beliebigen Nicht-Leerzeichen für die leeren Quadrate bestehen - Jede Position muss in 3 Zeilen / Spalten gedruckt werden, wobei eine leere Zeile als Trennzeichen zwischen zwei Positionen dient.
- Zusätzliche Leerzeichen / Leerzeilen / Kästchenzeichen sind willkommen
- Spieler X geht zuerst
Das Ergebnis kann eines der folgenden sein:
- X hat gewonnen
- O hat gewonnen
- Zeichnen
- Gerade stattfindendes Spiel
Sie können eine geeignete Visualisierung des Positionsergebnisses auswählen, z. B. als farbigen Text oder als Textanmerkung, sofern diese in der Nähe der entsprechenden Position platziert ist
- Positionen werden als gleich angesehen, wenn eine durch Drehen oder Spiegeln voneinander erhalten werden kann. Doppelte Positionen dürfen nicht gedruckt werden. (Mit anderen Worten, drucken Sie nur die Gleichheitsklassen.)
Drucken Sie beispielsweise nur eine der folgenden Optionen:
X•• ••X ••• •••
••• ••• ••• •••
••• ••• X•• ••X
- Dies ist Code-Golf , also gewinnt der kürzeste Code!
Beispielausgabe:
•••
•••
••• -
X••
•••
••• -
•X•
•••
••• -
•••
•X•
••• -
[…]
XXO
OOX
XXO /
OXO
XXX
OXO X
Tipp: Es gibt 765 Positionen mit 91 Siegen für X, 44 Siegen für O und 3 Unentschieden.
Eine ähnliche Frage wurde bereits gestellt, aber diese ist anders.
code-golf
tic-tac-toe
ThomasR
quelle
quelle
Antworten:
Gelee ,
192179168 BytesProbieren Sie es online aus! (Dauert ungefähr 30 Sekunden, seien Sie also geduldig).
Wie es funktioniert
Überblick auf hoher Ebene:
In Zwischenschritten speichert dies X als
1
, nicht platziert als0
und O als-1
. Das Programm generiert alle 3 ^ 9 Möglichkeiten und behält dann nur die gültigen Positionen bei, basierend auf der Erfüllung der drei Kriterien:Anschließend ersetzt das Programm jeden Spielstatus durch alle seine Rotationen und Reflexionen, um eine Liste aller Äquivalenzklassen zu erhalten. Dies ist der Vorgang, der die meiste Zeit in Anspruch nimmt.
Der erste Spielstatus wird aus jeder der Äquivalenzklassen entnommen, und dann wird berechnet, wer gewonnen hat.
Wo dies geschieht Die Zeilen sind zur besseren Lesbarkeit nummeriert
quelle
Ruby, 305 Bytes
Dies funktioniert ähnlich wie bei den anderen Antworten, indem alle
3**9
Karten generiert und dann die gültigen herausgefiltert werden. Intern verwenden wir ternäre Zahlen0=X 1=. 2=O
in der Ausgabe. Durchlaufen Siec
die 3 möglichen Werte für die Mitte unds
die3**8 = 6561
Werte für den Umfang. Bevori/3
wir in eine Zeichenfolgendarstellung einer ternären Zahl konvertieren , multiplizieren wir mit6562
, um alle Ziffern zu duplizieren, und addieren3**16
, um die Zahl mit einer 1 zu beginnen, um sicherzustellen, dass gegebenenfalls führende Nullen vorhanden sind.w
ist die Gewinnbedingung - setzen Sie diese auf Null.Durchlaufen Sie für jede Karte 4 Umdrehungen der Ziffern
s
, um die lexikalisch niedrigste Version der aktuellen 8-stelligen ternären Zahl zu finden, die den Umfang darstellt. Addieren Sie gleichzeitig die ASCII-Werte der ersten 3 Ziffern (obere Reihe der aktuellen Drehung) und überprüfen Sie anhand dieser Werte, ob ein Gewinn erzielt wurde. Addieren Sie außerdem die ASCII-Wertec
und ein Paar diametral entgegengesetzter Ziffern, um zu überprüfen, ob in der Mitte ein Gewinn erzielt wird.Überprüfen Sie, ob die Ausgabe gültig ist. Wenn sowohl das 1-Bit als auch das 64-Bit
w
gesetzt sind, gewinnen beide Seiten. Dies ist ungültig. Überprüfen Sie das Gleichgewicht zwischen X und O (wenn es noch keinen Gewinner gibt, kann es entweder gleich X und O oder ein weiteres X sein - aber wenn das Spiel gewonnen ist, gibt es nur einen möglichen Wert, da der Gewinner zuletzt gegangen sein muss.) Um zu vermeiden, dass unterschiedliche Rotationen derselben Karte angezeigt werden, wird nur ausgegeben, wenn die lexikalisch niedrigste Version des Umfangs dem aktuellen Wert von entsprichts[2,9]
.Ausgabe der Vorstand , sustituting die Symbole
tr("012","X.O")
. Der Spielstatus wird unter dem Brett angezeigt. Wenn w = 0 ist, ist dies der Fall,true
wenn noch leere Felder vorhanden sind (Spielfalse
läuft noch) und wenn das Brett voll ist. Wennw
ungleich Null ist, geben wir aus,1
ob Spieler 1 (X) gewonnen hat oder64%31==2
ob Spieler 2 (O) gewonnen hat.Ungolfed
Überprüfungsschema
Die folgenden Diagramme zeigen das Rotationsschema (und die Gewinnprüfung in Großbuchstaben). Die Diagramme werden ungedreht angezeigt. Die vier verschiedenen Rotationen werden als Teilzeichenfolgen aus der Doppelkopie von übernommen
i/3
, wobei die 3 aufeinanderfolgenden Großbuchstaben am Umfang jedes Diagramms (die "Spitze" pro aktueller Rotation) die ersten 3 Zeichen in der 9-stelligen Teilzeichenfolge sind. Für jede Umdrehung wird auch eine Umkehrung mit 9 Zeichen (diagonale Umkehrung um die AE- oder CG-Achse) versucht. Die Karte wird nur ausgegeben, wenn der aktuelle Wert voni/3
der lexikalisch niedrigste aller Drehungen und Spiegel ist.quelle
Python 2 ,
648620 BytesProbieren Sie es online aus!
Wahrscheinlich ist hier mit diesem Ansatz ein bisschen geringfügiges Golfen möglich; Aber nicht viele.
Bearbeiten: Danke an die Ovs, die eine Optimierung festgestellt haben, die 28 Bytes gewonnen hat; und 3 von Artemis Fowl
Code ohne Golf
Die Grundidee hier ist: Brute Force jede der 3 ^ 9 = 19683 möglichen Board-Codierungen. Behalten Sie die Konjugate (Rotationen und Reflexionen) von Brettern im Auge, die bereits untersucht wurden, damit Sie keine Einträge duplizieren. Gültige Boards müssen mindestens eine gleiche Anzahl von X und O haben oder ein X mehr als O. Es ist nicht möglich, sowohl einen Gewinn für X als auch einen Gewinn für O zu erzielen. plus einige zusätzliche knifflige Einschränkungen.
quelle
Counter
. Sie können es durchc=b.count;d=c(x)-c(o)
return
kann seinreturn 0if d not in[0,1]else 0if w and v else(x*(d==1))if w else(o*(d==0))if v else'.'if'.'in b else'/'