Erstellen Sie ein deterministisches Programm zu spielen n d Tic-Tac-Toe mit den anderen Kandidaten.
Ihr Programm sollte funktionieren, wenn n
(width) und d
(dimension number) in diesen Bereichen liegen:
n∈[3,∞)∩ℕ ie a natural number greater than 2
d∈[2,∞)∩ℕ ie a natural number greater than 1
n = 3; d = 2
(3 2, dh 3 mal 3):
[][][]
[][][]
[][][]
n = 3; d = 3
(3 3 dh 3 mal 3 mal 3):
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
n = 6; d = 2
(6 2, dh 6 mal 6):
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
Und so weiter.
Eingang:
Die Eingabe erfolgt in STDIN. Die erste Zeile der Eingabe wird zwei Zahlen, sein n
und d
in der Form n,d
.
Danach wird eine Linie aus Koordinaten erstellt, die die durchgeführten Bewegungen angeben. Die Koordinaten werden in Form aufgeführt werden: 1,1;2,2;3,3
. Die obere linke Ecke ist der Ursprung (0,0 für 2D). Im allgemeinen Fall entspricht diese Liste der Stelle, 1,2,...,1,4;4,0,...,6,0;...
an der die erste Zahl die Links-Rechts-Position, die zweite Auf-Ab-Position, die dritte bis dritte Dimension usw. darstellt. Beachten Sie, dass die erste Koordinate die X
erste und die zweite Kurve ist ist O
s erste Runde, ....
Sollte dies der erste Zug sein, wird bei der Eingabe eine Zahl gefolgt von einer Leerzeile eingegeben.
Aus Gründen der Konsistenz endet die Eingabe immer mit einem Zeilenumbruch. Beispieleingabe (\ n ist Newline):
10,10\n0,0,0,0,0,0,0,0,0,0;0,2,3,4,5,6,7,8,9,0;0,1,2,3,4,5,6,7,8,9\n
Für den ersten Zug:
10,10\n\n
Wo \n
ist das Newline-Zeichen?
Ausgabe:
Geben Sie den Zug, den Sie ausführen möchten, in demselben Format wie die Eingabe aus (eine durch Kommas getrennte Liste). Ein ungültiger Zug (dh ein Zug, der bereits ausgeführt wurde) führt zu einem Verlust für das Spiel.
Hinweis: Sie können einen Zufallszahlengenerator verwenden, solange Sie einen Wert festlegen, bei dem jeder Lauf unter den gleichen Bedingungen identisch ist. Mit anderen Worten, das Programm muss deterministisch sein.
Hinweis: Es sind nur gültige Züge erlaubt.
Gewinnspiele (Wenn Sie genug mehrdimensionale Tic Tac Toe gespielt haben, ist dies dasselbe.)
Um zu gewinnen, muss ein Spieler alle angrenzenden Felder entlang einer Linie haben. Das heißt, dieser Spieler muss n
Züge auf einer Linie haben, um ein Gewinner zu sein.
Benachbart:
- jedes Plättchen ist ein Punkt; Zum Beispiel ist (0,0,0,0,0) ein Punkt in
d=5
- benachbarte Kacheln sind solche Kacheln, die beide Punkte auf derselben Einheit d-Würfel sind. Mit anderen Worten beträgt der Chebyshev-Abstand zwischen den Kacheln 1.
- Mit anderen Worten, wenn ein Punkt
p
an einen Punkt angrenztq
, unterscheidet sich jede Koordinate in derp
entsprechenden Koordinateq
darin nicht mehr als um eins. Außerdem unterscheidet sich mindestens ein Koordinatenpaar um genau eins.
Linien:
- Linien werden durch Vektoren und eine Kachel definiert. Eine Linie ist jedes Plättchen, das von der folgenden Gleichung getroffen wird:
p0 + t
<
some vector with the same number of coordinates as p0>
Simulations- und Gewinnbedingungen:
Geben Sie in Ihrer Antwort an, ob sie zur Benotung bereit ist. Geben Sie also deutlich an, ob Ihre Antwort fertig ist oder nicht.
Wenn Ihre Antwort als erledigt markiert ist, wird sie erst 24 Stunden nach der letzten Änderung des Codes bewertet.
Programme müssen offline arbeiten. Wenn festgestellt wird, dass ein Programm betrügt, erhält es automatisch eine Punktzahl von
-1
und wird nicht weiter gewertet. (Wie würde jemand damit enden, dass seine Programme betrügen?)Wenn Ihr Programm eine ungültige Ausgabe erzeugt, wird dies sofort als Verlust für das Spiel gewertet
Wenn Sie nach 1 Minute keine Ausgabe erstellen, wird dies sofort als Verlust für das Spiel gewertet. Bei Bedarf auf Geschwindigkeit optimieren. Ich möchte nicht eine Stunde warten müssen, um ein Programm von einem anderen zu testen.
Jedes Programm wird zweimal für jedes
n
in dem Bereich[3,6]
und jedesd
in dem Bereich[2,5]
einmal alsX
und einmal als gegen die anderen Programme ausgeführtO
. Dies ist eine Runde.Für jedes Spiel, das ein Programm gewinnt, erreicht es
+3
seine Punktzahl. Wenn das Programm unentschieden ist (1 Sieg und 1 Niederlage in einer einzigen Runde oder Unentschieden für beide Spiele), wird es ausgeglichen+1
. Wenn das Programm verloren geht, dann wird es+0
(dh keine Änderung).Das Programm mit der höchsten Punktzahl gewinnt. Sollte es ein Unentschieden geben, gewinnt das Programm mit der geringsten Anzahl verlorener Partien (von den unentschieden ausgetragenen Teilnehmern).
Hinweis: Abhängig von der Anzahl der Antworten benötige ich möglicherweise Hilfe beim Ausführen der Tests.
Viel Glück! Und mögen die Simulationen jemals zu Ihren Gunsten ablaufen!
quelle
Antworten:
Python 3
Dies ist einfach ein zufälliges ai. Es wählt zufällig einen Zug aus den noch verfügbaren Zügen aus.
quelle
Python 2.7
Dies ist eine in Bearbeitung befindliche Einreichung, die ich zur Verfügung stelle, um anderen Antwortenden ein Skelett / eine Inspiration zu geben. Es funktioniert, indem jede mögliche Gewinnlinie aufgelistet und dann eine Heuristik angewendet wird, um diese Linie danach zu bewerten, wie wertvoll sie ist. Derzeit ist die Heuristik leer (Super-Secret-Arbeiten). Ich habe auch die Behandlung von Win- und Clash-Fehlern hinzugefügt.
Hinweise zum Problem
Wie viele Gewinnlinien gibt es? Betrachten Sie den eindimensionalen Fall. Es gibt 2 Eckpunkte, 1 Kante und 1 Linie. In 2 Dimensionen haben wir 4 Scheitelpunkte, die durch 2 Linien verbunden sind, und 4 Kanten, die durch 2 * n Linien verbunden sind. In 3 Dimensionen haben wir 8 Scheitelpunkte, die durch 4 Linien verbunden sind, 12 Kanten, die durch 6 * n Linien verbunden sind, und 6 Flächen, die durch
3*n^2
Linien verbunden sind.Nennen wir einen Scheitelpunkt im Allgemeinen eine 0-Facette, eine Kante eine 1-Facette usw. Dann
N(i)
bezeichnen wir die Anzahl der i-Facetten,d
die Anzahl der Dimensionen undn
die Seitenlänge. Dann ist die Anzahl der Gewinnlinien0.5*sum(N(i)*n^i,i=0..d-1)
.Per Wikipedia
N(i)=2^(d-i)*d!/(i!*(n-1)!)
lautet die endgültige Formel also:sum(2^(d-i-1) n^i d! / (i! * (n-i)!),i=0..d-1)
welches wolfram | alpha nicht besonders mag. Das wird ziemlich schnell sehr groß, so dass ich nicht erwarte, dass mein Programm eine überschaubare Laufzeit für d> 8 hat.
Einige Ergebnisse (Entschuldigung für die Formatierung:
I / O
Im Moment muss die Eingabe wie folgt erfolgen:
tictactoe.py <ret> n,d <ret> move;move <ret>
- Beachten Sie die mehreren Zeilen und kein Finale;
.Die Ausgabe sieht
(x_1,x_2,x_3...)
zum Beispiel so aus:tictactoe.py <ret> 6,5 <ret> <ret>
=>0, 0, 0, 0, 0
tictactoe.py <ret> 6,5 <ret> 0,0,0,0,0;0,0,0,0,5 <ret>
=>0, 0, 0, 5, 0
Bearbeiten: Für E / A Logik hinzugefügt. Ich glaube, das ist jetzt bereit zu markieren
Beachten Sie, dass dieser Kommentar ursprünglich ein Platzhalter war, den ich gelöscht und wieder hergestellt habe.
quelle
Python 2
Der größte Teil des Codes ist genau derselbe wie die zufällige KI von Quincunx . Anstatt einen Zug zufällig auszuwählen, wählt er den ersten verfügbaren Zug lexikographisch aus (dh (0,0, ... 0), dann (0,0, ... 1), dann (0,0, ... 2). , etc.).
Dies ist eine ziemlich blöde Strategie, aber sie schlägt fast immer das Spielen nach dem Zufallsprinzip.
quelle