Hier ist ein interessantes Problem, an das ich neulich gedacht habe, bei dem Codebits nicht nur in einer Eigenschaft des Codes mit anderen Codebits konkurrieren, sondern auch ein Spiel gegen diese anderen Codebits spielen.
Ihre Aufgabe ist es, ein Programm zu erstellen, das den aktuellen Status eines Go-Boards übernimmt und festlegt, welche Bewegung ausgeführt oder bestanden werden soll.
Ihr Programm akzeptiert Folgendes als Eingabe:
19 Zeilen mit jeweils 19 Zeichen, die die derzeit auf dem Go-Brett befindlichen Teile darstellen. Ein Zeichen von steht
0
für ein leeres Quadrat,1
ist schwarz und2
weiß.Zwei Zahlen, die die Anzahl der Gefangenenstücke darstellen, die jeder Spieler hat (schwarz, dann weiß).
Eine Zahl, die angibt, wer an der Reihe ist, sich zu bewegen (schwarz oder weiß). Wie oben
1
ist schwarz und2
ist weiß.
und geben Sie eine der folgenden Optionen aus:
Ein Koordinatenpaar,
a b
das die Koordinaten darstellt, um die bewegt werden soll.1 1
ist das Quadrat oben links, und die erste und die zweite Zahl stehen für die Bewegung nach unten bzw. rechts.Die Zeichenfolge
pass
, die eine zu übergebende Bewegung darstellt.
Beispielsweise kann das Programm die folgende Eingabe erhalten:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000000000000000000
0001210000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
0 0 1
Dies ist ein Spiel, bei dem nur wenige Züge gespielt wurden.
Dann könnte das Programm ausgeben 6 5
, was bedeutet, "einen schwarzen Stein auf den Punkt 6 von oben und 5 von links setzen". Dies würde den weißen Stein bei einfangen 7 5
. Der Status des Boards würde sich dann ändern zu:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000100000000000000
0001010000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
1 0 2
(Beachten Sie, dass ein weißer Stein zwar gefangen genommen wurde, aber als Gefangener für Schwarz gilt.)
Ihr Code muss zusätzlich die folgenden Eigenschaften erfüllen:
Wenn Ihr Programm denselben Eingabestatus erhält, muss es immer dieselbe Ausgabe erzeugen. Dies ist der Determinismus der Go AI. Es darf keine zufällige Komponente haben.
Ihr Programm darf nicht länger als ungefähr 60 Sekunden dauern, um zu bestimmen, welche Bewegung ausgeführt werden soll. Diese Regel wird aufgrund von Schwankungen der Rechenleistung nicht strikt angewendet, muss jedoch in angemessener Zeit ausgeführt werden.
Der Quellcode Ihres Programms darf insgesamt 1 Megabyte (1.048.576 Byte) nicht überschreiten.
Ihr Programm muss immer legale Schritte unternehmen. Ihr Programm kann keine Bewegung ausführen, bei der bereits ein Stein vorhanden ist, und es kann kein Teil platziert werden, das dazu führen würde, dass eine Gruppe eigener Steine erfasst wird. (Eine Ausnahme von den Regeln für die Zwecke dieser Herausforderung besteht darin, dass ein Programm eine Position erstellen darf, die ursprünglich dort war. Da nur die aktuelle Position eines Bretts angegeben wird, kann nicht erwartet werden, dass gespeichert wird, welche Züge ausgeführt wurden Vor.)
Ihre Einsendung wird dann in einem All-Play-All-Turnier gegen alle anderen Einsendungen gespielt, in einem Go-Spiel, bei dem der Status des Bretts als leer beginnt und jedes Programm abwechselnd die Position des Bretts erhält und einen Zug macht .
Jedes Einreichungspaar spielt zwei Runden - eine Runde, wobei jeder Spieler schwarz ist. Da die AIs in diesem Problem vollständig deterministisch sind, führen zwei derselben AIs, die zusammen spielen, immer dazu, dass genau dasselbe Spiel gespielt wird.
Die Bedingungen für einen Sieg sind als solche:
Wenn Ihr Programm bis zum Ende des Spiels abgespielt wird, werden die chinesischen Bewertungsregeln von Go verwendet, um den Gewinner zu ermitteln. Es wird kein Komi angewendet.
Wenn Ihr Programm so weit abgespielt wird, dass ein früherer Zustand erreicht ist, wodurch eine Endlosschleife verursacht wird, werden die beiden Programme als gebunden deklariert.
Ihre Einsendung wird danach bewertet, wie viele Punkte sie gegen andere Einsendungen erzielt. Ein Sieg ist 1 Punkt wert und ein Unentschieden einen halben Punkt. Die Einreichung mit den meisten Punkten ist der Gesamtsieger.
Dies ist eine King-of-the-Hill-Herausforderung, bei der jeder jederzeit einen neuen Eintrag veröffentlichen kann. In diesem Fall wird die Rangliste regelmäßig neu bewertet.
quelle
Antworten:
Hier ist mein Beitrag, um diese Herausforderung auf den Weg zu bringen. Python-Code:
Nach Ihren Regeln ist das Spielen von "Pass" immer eine gültige (wenn auch schlechte) Strategie.
quelle
Java: Wählen Sie einen Punkt, einen beliebigen Punkt
Wählt einfach Punkte auf der Tafel aus, um die Gültigkeit zu testen. Es verwendet das PRNG, aber mit einem festgelegten Startwert ist das deterministisch. Je nachdem, wie viele Runden vergangen sind, werden unterschiedliche Abschnitte des PRNG-Zyklus verwendet.
Für jede Kandidatenposition wird überprüft, ob es sich um einen gültigen Zug handelt (nicht jedoch um einen intelligenten Zug). Wenn dies nicht der Fall ist, geht es weiter zum nächsten Kandidaten. Wenn es nach 1000 Versuchen keinen gültigen Zug findet, ist es erfolgreich.
quelle
Einige Scala:
Nach dem Lesen von Wikipedia denke ich, dass dies die aktuelle Lösung übertreffen wird.
quelle
1 1
undpass
) gedruckt werden .1 1
, da das Programm jedes Mal neu ausgeführt wird, wenn sich die Karte ändert.Java
Wählt den ersten leeren Raum. Gewinnt gegen eine der AIs zum Zeitpunkt der Veröffentlichung.
quelle
1 1
würde sie von Weiß (jetzt leer) gefangen genommen und könnte in der nächsten Runde nicht von Schwarz gespielt werden.