Bei dieser Herausforderung geht es um das Spiel Tic Tac Toe, das jedoch auf einem Torus gespielt wird.
Spielanleitung
Um das erforderliche Spielbrett zu erstellen, beginnen Sie mit einem regulären Tic Tac Toe-Spielbrett. Falten Sie es zuerst zu einem Zylinder, indem Sie die linke und die rechte Kante verbinden. Dann falten Sie es in einen Torus, indem Sie die Ober- und Unterkante verbinden. Hier ist eine einfache Visualisierung eines solchen Spielbretts mit ein paar gespielten Zügen (Fertigkeiten von Sick Paint!).
Die Regeln für Tic Tac Toe auf einem Torus sind die gleichen wie für Tic Tac Toe. Jeder Spieler platziert abwechselnd Xs und Os. Der erste mit 3 gleichen Symbolen in einer Reihe, einer Spalte oder einer Diagonale gewinnt.
Da sich ein Torus nur schwer visualisieren lässt, projizieren wir die Tafel einfach wieder auf ein Papier. Jetzt können wir das Spiel als reguläres Tic Tac Toe spielen. Der einzige Unterschied ist, dass Sie auch mit 3 gleichen Symbolen in einer unterbrochenen Diagonale gewinnen können. Zum Beispiel gewinnt Spieler 1 (X) das folgende Brett. Sie können dies leicht erkennen, indem Sie die Ansicht auf dem Torus ein wenig ändern.
Wenn Sie interessiert sind, können Sie bei Torus Games Tic Tac Toe auf einem Torus spielen . Es gibt eine Windows-, Mac- und Android-Version.
Optimale Spiele
An dieser Herausforderung waren optimale Spiele interessiert. Ein optimales Spiel ist ein Spiel, bei dem beide Spieler eine optimale Strategie spielen. Auf einem normalen Tic Tac Toe-Brett enden optimale Spiele immer mit einem Unentschieden. Faszinierend auf einem Torus-Brett gewinnt immer der erste Spieler. Tatsächlich kann ein Spiel auf einem Torus-Brett niemals unentschieden enden (auch wenn die Spieler nicht optimal spielen).
Die optimale Strategie ist ganz einfach:
- Wenn Sie gewinnen können, indem Sie Ihr Symbol platzieren, tun Sie es.
- Wenn Ihr Gegner zwei Symbole in einer Zeile / Spalte / đIagonale hat, versuchen Sie ihn zu blockieren. Ansonsten mach was du willst.
- Ansonsten mach was du willst.
Jedes optimale Spiel besteht aus genau 7 Zügen und diese Züge können folgendermaßen beschrieben werden:
- Spieler 1 setzt irgendwo auf dem Brett ein X (9 Möglichkeiten)
- Spieler 2 setzt irgendwo auf dem Brett ein O (8 Möglichkeiten)
- Spieler 1 setzt irgendwo auf dem Brett ein X (7 Möglichkeiten)
- Der Zug von Spieler 2 kann erzwungen werden (1 Wahl). Andernfalls setzt er das O an eine beliebige Stelle (6 Wahlmöglichkeiten).
- Der Zug von Spieler 1 ist erzwungen (1 Wahl)
- Spieler 2 steckt in einer Gabelung (Spieler 1 kann auf zwei verschiedene Arten gewinnen), also muss Spieler 2 Spieler 1 auf eine Weise blockieren (2 Möglichkeiten)
- Spieler 1 setzt seinen letzten Zug und gewinnt (1 Wahl)
Es gibt 9 * 8 * 1 * 6 * 1 * 2 * 1 + 9 * 8 * 6 * 1 * 1 * 2 * 1 = 1728 verschiedene optimale Spiele auf unserem projizierten Brett. Hier sehen Sie ein typisches optimales Spiel:
Wenn wir jede Zelle des Bretts mit den Ziffern beschriften 0-8
, können wir dieses Spiel durch die Ziffern beschreiben 3518207
. Zuerst wird ein X in Zelle 3 (mittlere Zeile, linke Spalte) platziert, als ein O in Zelle 5 (mittlere Zeile, rechte Spalte), als ein X in Zelle 1 (obere Zeile, mittlere Spalte), ...
Mit dieser Ziffernschreibweise haben wir automatisch eine Bestellung generiert. Jetzt können wir alle 1728 optimalen Spiele sortieren und erhalten die Liste:
Game 0000: 0123845
Game 0001: 0123854
Game 0002: 0124735
Game 0003: 0124753
Game 0004: 0125634
...
Game 0674: 3518207
...
Game 1000: 5167423
Game 1001: 5167432
Game 1002: 5168304
...
Game 1726: 8765034
Game 1727: 8765043
Herausforderung
Diese Liste ist Teil Ihres Jobs. Sie erhalten eine Nummer k
zwischen 0 und 1727 und müssen die zurücksendenk
Spiel in der Ziffernschreibweise dieser sortierten Liste zurücksenden.
Schreiben Sie eine Funktion oder ein Programm, das die Zahl k
(Integer) erhält und das entsprechende Spiel berechnet. Sie können die Eingabe über STDIN, Befehlszeilenargument, Eingabeaufforderung oder Funktionsargument lesen und das Ergebnis (7 Stellen) in einem lesbaren Format (z. B. 0123845
oder ) ausgeben[0, 1, 2, 3, 8, 4, 5]
) oder es mit einer Zeichenfolge (lesbar für Menschen) oder einer Ganzzahl (mit allen Zeichen) zurückgeben Ziffern in Basis 10) oder in einem beliebigen Array- / Listenformat.
Der Herausforderungstyp ist Code-Golf. Daher gewinnt der kürzeste Code.
quelle
Antworten:
JavaScript (ES6), 266
308 317 334 341Eine Funktion, die eine Zeichenfolge zurückgibt. Edit Es wurde eine arithmetische Lösung für die Funktion M gefunden (endlich!)
Sehr naiv
, es kann auf viele Arten verkürzt werden. Es zählt einfach alle möglichen gesetzlichen Werte auf und gibt zurück, was sich an Stelle n befindet. Die M-Funktion gibt die Position zwischen zwei Zellen zurück. Dies ist der obligatorische Zug, um einen anderen Spieler zu blockieren.Mehr lesbar
quelle
Octave,
467 369 363 309297 Zeichen297
Die einzige relevante Änderung ist, dass wir niemals prüfen, ob der aktuelle Spieler gewinnen kann, sondern nur die Möglichkeit des Gegners, in der nächsten Runde zu gewinnen . Da der einzige Zug, den der Spieler 1 gewinnen kann, Zug 7 ist , ist dies der einzige Ort, an dem der Algorithmus ein Spiel erzeugen würde, das nicht optimal ist, aber es ist sehr einfach, eine solche Situation herauszufiltern. Wir überprüfen einfach jedes Spiel, das generiert wurde, wenn es von Spieler 1 gewonnen wurde. Andernfalls war der Zug in Runde 7 falsch, sodass wir dieses Spiel nicht zum optimalen Spieltisch hinzufügen.
(Genau die Hälfte der von dieser Regel erzeugten Spiele ist falsch, d. H. in der 7. Runde hat Spieler 1 immer zwei Möglichkeiten, Spieler zwei zu blockieren, aber nur eine bringt ihn dazu, sofort zu gewinnen.)
Verwenden:
Der ungolfed Code sieht so aus:
quelle