Lass uns Code Golf spielen!
Bei einem Tic-Tac-Toe-Board-Status (Beispiel :)
|x|x|o|
|x|o|x|
|o|o|x|
Bestimmen Sie, ob ein Spiel win
ein lose
oder ist cat
. Ihr Code sollte eine dieser Optionen mit einem bestimmten Status ausgeben. Das obige Spiel sollte ausgegeben werdenlose
Um es klar auszudrücken: Ein Gewinn ist definiert als 3 x
Sekunden hintereinander (diagonal, horizontal, vertikal). Eine Niederlage ist 3 o
Sekunden hintereinander, während eine cat
Partie in keiner hintereinander ist.
Um die Dinge interessant zu machen, müssen Sie Ihre Eingabestruktur für den Zustand bestimmen, den Sie dann erklären müssen. Zum Beispiel xxoxoxoox
ist ein gültiger Zustand wie oben, wo jedes der Zeichen von links nach rechts, von oben nach unten gelesen wird. [['x','x','o'],['x','o','x'],['o','o','x']]
ist das Spiel in mehrdimensionaler Anordnung in ähnlicher Weise zu lesen. Während 0x1a9
das Hex für 110101001
eine geeignete Komprimierung ist, 1
kann es für x
s manipuliert werden und 0
kann für manipuliert werden o
.
Aber das sind nur ein paar Ideen, ich bin mir sicher, dass Sie viele von Ihnen haben könnten.
Grundregeln:
- Ihr Programm muss in der Lage sein, jeden lebensfähigen Zustand zu akzeptieren.
- Die Eingabeform muss einen beliebigen Zustand abbilden können.
- "Der Gewinnzustand muss aus der Tafel ermittelt werden"
- Nehmen Sie eine komplette Karte an
Win
vorherlose
zum Beispiel im Fall 'xxxoooxxx'
Die niedrigste Anzahl an Charakteren gewinnt
(win|lose|cat) [xo]{9}
bei der das erste Wort angibt, ob das Spiel ein Gewinn, eine Niederlage oder eine Katze (?) Für Spieler x ist. Kann jeden Staat vertreten.Antworten:
Ruby 2.0, 85 Zeichen
Hier ist eine einfache Bitmasken-basierte Lösung in Ruby:
Die Karte wird als Hex-Zahl dargestellt, die aus neun Bits besteht, die den neun Quadraten entsprechen. 1 ist ein
X
, 0 ist einO
. Dies ist genau wie das0x1a9
Beispiel in der Frage, obwohl die0x
optional ist!Es gibt wahrscheinlich eine bessere Möglichkeit, die Bitmasken zu erstellen, als nur eine große Liste fest zu codieren. Ich nehme gerne Vorschläge entgegen.
Sehen Sie hier, wie es auf Ideone läuft .
quelle
273
zweimal. Und diemax
Idee gefällt mir sehr gut !Mathematica, 84 Zeichen
Eingabeformat:
{{1, 1, 0}, {1, 0, 1}, {0, 0, 1}}
quelle
Tr@a
ist die Spur des Feldes (Summe über Diagonale),Tr@Reverse@a
ist die Spur des umgedrehten Feldes (einige über Antidiagonale),Tr/@a
wirdTr
auf jede Zeile angewendet, was Ihnen die Summe über jede ZeileTotal@a
gibt , gibt Ihnen die Summe über jede Spalte. Sie haben also im Grunde alle 8 Zeilen, die Sie überprüfen müssen. Dann wird dasWhich
Ding darauf angewendet (im Grunde genommen eineif/elseif/else
Aussage), wobei#
diese Liste von 8 Werten repräsentiert.if
es gibt einen, den3
du gewinnst,else if
es gibt einen, den0
du verlierst,else if 1>0
(wahr)cat
.Bash:
283262258Mit einer relativ benutzerfreundlichen Oberfläche.
Ausführen
bash tictactoe.sh O X O X O X X O X
Hinweis: Die Liste der 9 Positionen ist eine Standardmatrixdarstellung. Es spielt keine Rolle, ob die Tafel in Spalten- oder Zeilenmajor dargestellt wird, von links nach rechts oder von oben nach unten gelesen wird - Spiele mit Nullen und Kreuzen (oder Tic Tac Toe, wenn Sie darauf bestehen) sind symmetrisch, daher sollte die Eingabereihenfolge irrelevant sein zum Ergebnis bei jeder korrekten Implementierung, solange die Eingabe linear ist.
Edit: Danke an hjk für den kürzeren Syntaxvorschlag.
quelle
t() { ... }
stattfunction t
? Kann dort einige Zeichen speichern. :)<<<
, um weitere vier Zeichen zu speichern.Befunge 93 - 375
Nimmt eine Binärzeichenfolge als Eingabe.
Liest die Zeichenfolge. Bruteforce schreibt es (den am weitesten rechts stehenden Streifen) als Matrix zwischen
Gitter hinzufügen (idk). Bestimmt die Summe der Spalten, Zeilen und zwei Diagnosen. Vergleicht diese Werte mit 3 ("gewinnen") oder 0 ("verlieren"). Wenn alle Werte gleich 1 oder 2 sind, wird gezogen ("katze").
quelle
GolfScript, 27 Zeichen
Das Eingabeformat ist eine Zeichenfolge, die aus acht oktalen Ziffern besteht, wobei jede (redundant) drei aufeinanderfolgende Quadrate auf der Karte codiert:
Um eine Folge (Zeile / Spalte / Diagonale) von drei Quadraten als Oktalziffer zu codieren, ersetzen Sie jede
x
in der Folge durch eine 1 und jedeo
durch eine 0 und interpretieren Sie die resultierende Folge von Einsen und Nullen als Binärzahl zwischen 0 und 7 inklusive.Dieses Eingabeformat ist ziemlich redundant (alle Kartenpositionen sind mindestens zweimal codiert, die mittlere Position ist viermal codiert), es repräsentiert jedoch eindeutig jeden möglichen Zustand einer vollständig gefüllten Tic-Tac-Toe-Karte und codiert die Karte nicht direkt Gewinner in den Eingang.
Die Eingabe kann optional Leerzeichen oder andere Trennzeichen zwischen den Ziffern enthalten. Tatsächlich kümmert sich das Programm nur darum, ob die Eingabezeichenfolge die Ziffern
7
oder enthält0
.Zum Beispiel die Beispieltafel:
kann durch die Eingabe dargestellt werden:
Der Einfachheit halber finden Sie hier ein GolfScript-Programm, mit dem Sie ein ASCII-Grafikkartenlayout, wie in der obigen Aufforderung gezeigt, in eine für dieses Programm geeignete Eingabezeichenfolge konvertieren können:
Dieser Konverter ignoriert alle Zeichen außer
x
undo
in beiden Fällen in seiner Eingabe. Es wird eine einstellige Zeichenfolge (mit Leerzeichen wie oben gezeigt) erstellt, die in das obige Gewinnermittlungsprogramm eingespeist werden kann, sodass die Verkettung dieser beiden Programme verwendet werden kann, um den Gewinner direkt von der ASCII-Zeichenfläche aus zu ermitteln.Hier ist auch ein Umkehrwandler, um zu demonstrieren, dass der Eingang tatsächlich die Karte eindeutig darstellt:
Ps. Hier ist eine Online-Demo dieser Lösung.
quelle
Python 2 - 214 Bytes
Ich bin mir sicher, dass Verbesserungen vorgenommen werden müssen.
Zu rennen:
welches repräsentiert diese Tafel:
Ausgänge mit
NameError
Ausnahme in jedem Fall außercat
.quelle
<<<
! +1 nur dafür../whatever <<< 'blah blah blah'
ist das gleiche wie,echo -n 'blah blah blah' | ./whatever
aber ohne einen ganzen separaten Prozess fürecho
.echo
inbash
ist eigentlich eine eingebaute, so gabelt keinen neuen ProzessHaskell, 146 Zeichen
IN ORDNUNG :). Meine Darstellung einer Tafel ist eine dieser 126 Zeichen
Hier ist die Lösung in 146 Zeichen:
Und so funktioniert es als Hash-Skript:
quelle
JavaScript, 420 Zeichen
s
Enthält in dieser Version eine Ganzzahl, die den Status des Spielplans darstellt. Hierbei handelt es sich um ein Bit-Array mit einem Wert, bei dem zwei Bits für jedes Quadrat auf der Karte stehen:10
- X11
- O00
- Leeres QuadratDiese Lösung verwendet Bit-Manipulation, um jede der acht möglichen "Drei-in-einer-Reihe" -Konfigurationen zu testen (sie werden jeweils zweimal getestet, einmal für X und einmal für O).
Ich präsentiere dies mit einer kleinen Verkleinerung von meiner Tic-Tac-Toe-Website, auf der diese
detectWin
Funktion als Teil eines echten Tic-Tac-Toe-Spiels verwendet wird.quelle
Ruby, 84 Zeichen
Einfache, auf RegExp basierende Lösung. Das Eingabeformat ist eine 9-stellige Binärzeichenfolge, z. B.
110101001
für die in der Frage angegebene Beispielkarte.Ruby, 78 Zeichen
Eingabeformat:
xxo_xox_oox
quelle
Haskell, 169
Eingabeformat: "X" wird nur durch
x
, "O" nur durch dargestellto
. In jeder Zeile sind die Zeichen gleichzeitig ohne Leerzeichen usw. Die Zeilen werden durch neue Zeilen getrennt.Erzeugt alle möglichen Zeilen / Spalten / Diagonalen, filtert
[("ooo","lose"),("xxx","win")]
nach ihrer Existenz auf dem Brett und wählt dann das zweite Wort im Tupel aus, damit wir wissen, welche Spieler gewonnen haben. Wir gehen voran,"cat"
damit wir das letzte Element der Liste als unseren Gewinner nehmen können. Wenn beide Spieler gewonnen haben,"win"
wird der letzte sein (Listenverständnis behält Reihenfolge bei). Da"cat"
es immer das erste ist, wenn ein Gewinner existiert, wird es ausgewählt, aber ansonsten existiert noch ein letztes Element, da das Voranstellen"cat"
die Unversehrtheit garantiert.BEARBEITEN: Rasiert 3 Zeichen durch Ändern des letzten Listenverständnisses auf
map
.quelle
C, ca. 150
Es ist Mitternacht hier und ich habe noch keine Tests durchgeführt , aber ich werde das Konzept trotzdem veröffentlichen. Ich werde morgen darauf zurückkommen.
Der Benutzer gibt zwei Oktalzahlen ein (ich wollte binär verwenden, aber soweit ich weiß, unterstützt C nur Oktal):
a
stellt das mittlere Quadrat dar, 1 für ein X, 0 für ein Ob
ist eine neunstellige Zahl, die die Umfangsquadrate darstellt, die in einer Ecke beginnen und in derselben Ecke enden (wobei nur diese Ecke wiederholt wird), 1 für ein X, 0 für ein O.Es gibt zwei Möglichkeiten zu gewinnen:
Das mittlere Quadrat ist X (
a
= 1) und zwei gegenüberliegende Quadrate sind ebenfalls X (b&b*4096
ungleich Null).Drei benachbarte Perimeterquadrate sind X (
b/8 & b & b*8
ungleich Null). Dies ist nur dann ein gültiger Gewinn, wenn das mittlere Quadrat ein Kantenquadrat und kein Eckquadrat ist. Daher ist es erforderlich, auch die Maske anzuwendenm
, um die Eckquadratfälle zu vermeiden.Das Verlieren wird anhand der Variablen c erkannt, die das Inverse von b ist.
quelle
m
in der Erkennung "Verlieren" anzuwenden -c/8&c&c*8
. Ich habe Ihren Code (ohne die Funktion zu testen) wie folgt erneut golfen:int a,b;t(v){return a&&v&v<<12||v/8&v&v*8&0x208208;}main(){scanf("%o%o",a,b);printf("%s",t(b)?"win":t(b^0x1249249)?"lose":"cat");}
(130 Zeichen). Der wiederholte Test war lang genug, um in eine Testfunktion zu extrahierent()
; dies beseitigt die Notwendigkeit fürc
undm
; Die Konstanten wurden in Hex konvertiert, um jeweils ein Zeichen zu speichern.printf
benötigt - geben Sie einfach die Ergebniszeichenfolge als Format an - oderputs
es, da die Frage nach der Ausgabe nicht nach einer neuen Zeile fragt! (spart weitere 7 Zeichen).Bash,
107103Erzeugt ein sed-Skript und führt es aus.
E / A-Format:
oxo-oox-xoo
Ausgängelose
(-
zum Trennen der Zeilen verwenden Sie a). Eingang auf stdin. Benötigt GNU sed für denc
Befehl.Ich habe Regel 5 wie folgt interpretiert: "Wenn sowohl Sieg als auch Niederlage möglich sind, wähle Sieg."
Haupt code
Dies ist die eigentliche Antwort.
Eigentlich nichts Interessantes. Es definiert,
$b
wie/cwin
Zeichen gespeichert werden sollen, definiert dann den Teil der Gewinnbedingung des Skripts und verwendet dannsed y/x/o/\;s$b/close/
, umx
nacho
undcwin
nach zu konvertierenclose
(wodurch die Verlustbedingungen erzeugt werden). Es sendet dann die beiden Dinge undccat
(die ausgegeben werden,cat
wenn keine Gewinn / Verlust-Bedingung erfüllt ist) an sed.Generierter Code
Dies ist das sed-Skript, das vom Bash-Skript generiert und ausgeführt wird.
Stimmt
.
mit einem beliebigen Zeichen in den regulären Ausdrücken überein und gibt danachcTEXT
TEXT aus und wird beendet, wenn die reguläre Ausdrücke übereinstimmen.Dies kann als eigenständiges sed-Skript ausgeführt werden. Es ist 125 Zeichen lang, Sie können es als eine andere Lösung zählen.
quelle
Python 3, 45
Die Eingabe erfolgt in
i
einer Liste von Zahlen, die jede Zeile, Spalte und Diagonale des Spielplans darstellen, z.wird vertreten durch
[6, 2, 1, 4, 6, 1, 7, 4]
.Code :
('cat','lose','win')[2 if 7 in i else 0 in i]
quelle
Dart - 119
(Siehe dartlang.org ).
Originalversion mit RegExp: 151 Zeichen.
Die Eingabe in der Befehlszeile umfasst 11 Zeichen, z. B. "xxx | ooo | xxx". Jedes Nicht-XO-Zeichen kann als Trennzeichen verwendet werden.
Führende Leerzeichen und Zeilenumbrüche sollten weggelassen werden, bevor Zeichen gezählt werden, aber ich schneide die internen Leerzeichen weg, wo dies möglich ist. Ich wünschte, es gäbe eine kleinere Möglichkeit, die Teilzeichenfolge zu erstellen.
Recusive Bit-Base-Version: 119 Zeichen. Die Eingabe muss eine 9-Bit-Zahl sein, wobei 1 für 'x' und 0 für 'o' steht.
quelle
CJam,
39 3836 ZeichenDies ist ein konvertierter Basiscode für
Das ist 52 Zeichen lang.
Die Eingabe ist einfach die Zeichenfolgendarstellung der Platine, beginnend von links oben und zeilenweise. Beispielsweise:
was zu einer
win
Ausgabe führt. Oderwas zu einer
cat
Ausgabe usw. führtDer Code führt einfach die folgenden drei Dinge aus:
q3/_
- Teilen Sie die Zeichenfolge in Teile von 3, dh pro Zeile_z
- Kopieren Sie das Array pro Zeile und transponieren Sie es in ein Array pro Spalte.__Wf%s4%
- Kehren Sie jede Reihe um und bewegen Sie sich von links nach rechts. Dies ist die sekundäre Diagonale der Platine.\s4%
- Holen Sie sich die Hauptdiagonale der Tafel]`
- Wickeln Sie alles in Array und fassen Sie das Array zusammen.Jetzt haben wir alle möglichen 3er-Gruppen vom Brett. Wir überprüfen einfach die Existenz von "ooo" und "xxx", um das Ergebnis zu bestimmen.
Probieren Sie es hier online aus
quelle
GNU sed, 25 Bytes
Handelt es sich bei der Eingabe um eine redundante Darstellung des Bretts mit getrennten Ansichten für Spalten, Zeilen und Diagonalen, wie sie auch in anderen Antworten verwendet werden, ist sed sehr gut geeignet, um den Endzustand des Spiels mit den wenigsten Bytes zu überprüfen.
Eingabeformat:
xxx ooo xxx xox xox xox xox xox
(Kartenstatus aus der Frage des OP)Wenn das Eingabeformat nicht redundant ist (
xxx ooo xxx
), funktioniert der obige sed-Code nur, wenn die darunter stehende Zeile vorangestellt wird, wodurch das Programm 96 Byte lang wird (wobei das erforderlicher
Flag gezählt wird).quelle
Bash: 208 Zeichen
Ausführen
bash tictactoe.sh 0 1 0 1 0 1 1 0 1
Inspiriert von dieser Antwort .
quelle
VB.net
In diesem Beispiel wird provision als das folgende Bitmuster codiert
Nun können wir das Ergebnis (oder den Gewinner) wie folgt bestimmen.
quelle
J - 97 Bytes
Nun, der einfachste verfügbare Ansatz. Die Eingabe erfolgt als
111222333
, wobei die Zahlen Zeilen darstellen. Lesen Sie von links nach rechts. Spieler istx
und Feind isto
. Leere Felder können alles außerx
oder seino
.Beispiele: (Anm. Ist ein Kommentar)
Ungolfed Code eine Erklärung
quelle
Python 2, 120 Bytes
Oder Python, 115 Bytes von der Python-Shell (2 oder 3):
Die Kartenvariable wird auf das in der Frage beschriebene Binärformat gesetzt:
1
für X0
für O von links nach rechts von oben nach unten. In diesem Fall101001110
stelltWas zur Ausgabe führt:
Cat
quelle
Python (
7362 Zeichen)Die Eingabe besteht aus vier Zeichenfolgen in Kleinbuchstaben, die vier verschiedene Ansichten derselben Platine darstellen, die alle zu einer einzigen Zeichenfolge verknüpft sind: zeilenweise, spaltenweise, diagonal nach rechts und diagonal nach links.
AKTUALISIEREN
Vielen Dank an theRare für den Hinweis mit einem guten Gegenbeispiel! Jede Ansicht der Karte sowie jedes Segment (Zeile oder Spalte) innerhalb einer Karte muss durch ein Zeichen getrennt werden, das weder ein "x" noch ein "o" ist, damit die Struktur der Karte auch nach der Verkettung erhalten bleibt. Die Rahmen um jede Ansicht der Tafel sind eckige Klammern ("[" und "]"), und das Trennzeichen zwischen Zeilen / Spalten ist ein Pipe-Zeichen "|".
Dies macht den Algorithmus einfach - suchen Sie nach "xxx" oder "ooo" für einen Gewinn oder Verlust. Ansonsten ist es eine Krawatte (Katze).
ZB die Tafel (von links nach rechts, von oben nach unten) ...
X | X | X X | O | X O | X | O
... wird dargestellt als "[xxx | xox | oxo]" (in Zeilen) + "[xxo | xox | xxo]" (in Spalten) + "[xoo]" (rechts) + [xoo] "(links) diag) = "[xxx | xox | oxo] [xxo | xox | xxo] [xoo] [xoo]".
Diese Python-Anweisung gibt das Spielergebnis unter Berücksichtigung der Variablen s als Eingabe aus:
quelle
OXX XOO XOX
(sollte es Katze sein)?Haskell (69 Zeichen)
Dies erfordert die gleiche Eingabe wie in dieser Antwort beschrieben . Insbesondere besteht die Eingabe aus 8 Oktalwerten, die den Binärwert jeder Zeile, Spalte und Diagonale beschreiben. Der Code bewirkt, dass jede Instanz von 7 "gewinnt", jede Instanz von 0 "verliert" und alles andere entfernt wird. Dann fügt es "cat" zum Ende hinzu und entnimmt die ersten 4 Zeichen aus dem Ergebnis.
Es gibt 4 mögliche Antworten: "verlieren", "Katze", "gewinnen", gefolgt von einem "l" und "gewinnen", gefolgt von einem "c", was die Regeln nicht verbieten :)
Anwendungsbeispiel:
quelle
J: 83
Verbrauch: hängen Sie einfach eine Schnur von x und von O an und passen Sie die magische Arbeit auf. z.B. 'xxxoooxxx'.
Das innere Verb
(+/@:(*./"1)@;@(;((<0 1)&|:&.>@(;|.)(,<)|:)))
fasst im Grunde genommen die ursprüngliche binäre Matrix zusammen, wobei die Transponierte zusammen mit den 2 Diagonalen eingeschlossen ist. Diese Ergebnisse werden zusammengefasst. Zeilensummen werden zur Ermittlung der Gewinne herangezogen und dann aufsummiert. Ich werde dieses Verb weiter nennenInner
.Um den Gewinner zu finden, wird die Differenz der Punktzahlen zwischen der normalen und der inversen binären Matrix vom Hook genommen
(-&Inner -.)
.Der Rest des Codes erstellt einfach die Ausgaben und wählt die richtige aus.
quelle
JavaScript,
133, 114 ZeichenDie Eingabe
i
ist eine einfache Zeichenfolge mit Begrenzern für die Zeilen, z100|001|100
Bearbeiten: Die Methode wurde aktualisiert, um die Einsen im regulären Ausdruck durch Nullen zu ersetzen und den Verlustfall zu überprüfen.
quelle
=
und Anführungszeichen um das Regex-Literal entfernen . Außerdem1...
ist ein Zeichen kürzer als1.{3}
.r.test(i)
ist auch ein Zeichen kürzer alsi.match(r)
.J - 56 (26?) Char
Die Eingabe erhält eine 3x3-Matrix mit neun Zeichen, da J dies als Datentyp LOL unterstützen kann.
Beispiele:
Wenn wir die Golfscriptish-Codierung von Oktalziffern zulassen, die den Status jeder Zeile, Spalte und Diagonale redundant darstellen, dann sind es nur 26 Zeichen:
quelle
T-SQL (2012), 110
select max(iif(@&m=0,'lose',iif(@&m=m,'win','cat')))from(VALUES(292),(146),(73),(448),(56),(7),(273),(84))z(m)
Die Eingabe ist eine Hex-Zahl. Dies ist so ziemlich eine Übersetzung der Ruby-Lösung in T-SQL, ziemlich nett und ordentlich.
quelle
Javascript 1.6, 71 Zeichen
Ich gehe von einer Eingabe als Array aus,
game
die jede Zeile, jede Spalte und jedes Diag als 3-Zeichen-Zeichenfolge enthält. Ähnlich wie die Antwort von Bob , jedoch in einem Array, nicht als verkettete Zeichenfolge.Kommentar von EDIT @ nyuszika7h (67 Zeichen)
quelle
~game.indexOf("xxx")
stattdessengame.indexOf("xxx")>=0
dasselbe für das andere verwenden.Java 7, 260 Bytes
Ungolfed & Testfälle:
Probieren Sie es hier aus.
Ausgabe:
quelle
APL (NARS), 69 Zeichen, 138 Byte
Die Eingabe sollte eine 3x3-Matrix oder ein lineares Array von 9 Elementen sein, die nur 1 (für X) und 0 (für O) sein können. Das Ergebnis ist "cat", wenn niemand gewinnt, "lose", wenn O gewinnt, "win" "wenn X gewinnt. Es wird nicht geprüft, ob eine Karte ungültig ist oder ob ein Array weniger als 9 oder mehr Elemente enthält, oder ob jedes Element <2 ist.
Als Kommentar: Es würde die Eingabe in eine 3x3-Matrix konvertieren und ein Array mit dem Namen "x" erstellen, wobei Elemente die Summe jeder Zeile, Spalte und Diagonale sind.
Einige Tests zeigen Beispiele von anderen:
quelle