Ihr Ziel ist es, einen perfekten Spieler für das Spiel Wythoffs Nim zu schreiben .
Regeln von Wythoffs Nim
Wythoffs Nim ist ein deterministisches Zwei-Spieler-Spiel, das mit zwei Stapeln identischer Spielsteine gespielt wird. Die Spieler wechseln sich ab, indem sie eine der folgenden Aktionen ausführen:
- Entfernen Sie eine oder mehrere Marken vom ersten Stapel
- Entfernen Sie eine oder mehrere Marken vom zweiten Stapel
- Entfernen Sie eine gleiche Anzahl von Zählmarken (eine oder mehrere) sowohl vom ersten als auch vom zweiten Stapel.
Natürlich können Stapel nicht negativ werden, aber sie können auf 0 gesetzt werden. Derjenige Spieler, der den letzten Zähler insgesamt entfernt, gewinnt das Spiel.
Für die Geometrischeren ist hier eine äquivalente Formulierung des Spiels, das Sie auf diesem Applet spielen können . Eine einzelne Dame beginnt auf einem Feld eines viertel-unendlichen Schachbretts, dessen Ecke sich unten links befindet. Die Spieler ziehen abwechselnd die Dame, die sich wie eine Schachkönigin bewegt, jedoch auf drei Richtungen beschränkt ist:
- Nieder
- Links
- Diagonal nach unten und links
Wer die Dame in die Ecke zieht, gewinnt.
Wenn Sie die Koordinaten der Dame (mit Ecke (0,0)
) mit den Größen der jeweiligen Stapel verknüpfen, können Sie leicht erkennen, dass beide Spiele gleich sind.
Perfektes Spiel
(Sie können dies überspringen, wenn Sie mit den Vorstellungen von perfektem Spiel und Gewinnzügen vertraut sind.)
Da Wythoffs Nim ein endliches und deterministisches Spiel ist, hat es eine Vorstellung von perfektem Spiel . Ein perfekter Spieler ist eine Strategie, die immer von einer theoretisch gewonnenen Position gewinnt, dh von einer Position, in der es eine Strategie gibt, die einen Sieg garantiert.
Um eine Gewinnstrategie zu sein, genügt es, sich immer auf eine theoretische Gewinnposition für den Spieler zu bewegen, der gerade umgezogen ist, und damit für den Spieler, der nicht weiter geht. Die ersten dieser Gewinnpositionen (auch als kalte Positionen bezeichnet ) sind (0,0), (1,2), (2,1), (3,5), (5,3)
. Im Wikipedia-Artikel finden Sie eine Erklärung eines Algorithmus zur Ermittlung einer Gewinnstrategie für Wythoffs Nim sowie eine Formel zur Generierung von Gewinnpositionen.
Programmanforderungen
Schreiben eines Programms oder einer Funktion nimmt eine Position als Eingabe ein und gibt einen Gewinnzug in Form der Position nach diesem Zug aus. Wenigste Bytes gewinnt.
Wenn kein Gewinnzug existiert, dh die Position ein theoretischer Verlust ist, sollte Ihr Programm dies anzeigen und verfallen.
Ihr Programm muss innerhalb eines angemessenen Zeitraums ausgeführt werden. Eine exponentielle rekursive Spielbaumsuche reicht also nicht aus. Wenn Sie eine Strategie vorberechnen und hart codieren möchten, ist das in Ordnung.
Eingang
Ein Paar (i,j)
nicht negativer Zahlen, die jeweils höchstens die Stapelgröße darstellen 99
. Dies können zwei Zahlen, ein Tupel, eine Liste oder ein beliebiger Container sein.
Ausgabe
Drucken oder geben Sie die Position nach Ihrem Umzug erneut als zwei Zahlen oder einen Container davon aus. Dies muss ein legaler Schritt zu einer Gewinnerposition sein. Wenn es mehrere solcher Züge gibt, ist jeder in Ordnung, aber nur einer.
Wenn es keinen Gewinnzug gibt, müssen Sie dies in der Ausgabe angeben. Jede Ausgabe wie False
, None
, 0, oder (-1,-1)
tun wird, solange es keine rechtliche Position ist, und ist für jeden Verlierer Eingang.
Beispiel läuft
f(5,0) = (0,0)
f(2,2) = (1,2) # Or (2,1) or (0,0)
f(1,2) = False
f(13,9) = (13,8) # Or (10,6)
f(10,6) = False
f(5,10) = (5,3)
f(25,30) = (8,13)