Kopfgelder
Nr. 1 ( ausgezeichnet )
Ich werde 50 Wiederholungen für die erste gültige Antwort geben
Nr. 2 ( ausgezeichnet )
Ich werde weitere 100 Wiederholungen einwerfen, um die kürzeste gültige Antwort zu erhalten.
Nr. 3 ( offen für Einreichungen )
Ich werde 200 Wiederholungen für die erste mit einer deutlich kürzeren gültigen Antwort einwerfen. Signifikant sind höchstens 45% der aktuell kürzesten Antwort ( 564 Bytes x 0,45 = maximal 254 Bytes ).
Das Spiel
Erinnerst du dich an den Klassiker " Nine Men's Morris " oder einfach " Mill "? Es gibt eine Variante namens Three Men's Morris, die einem veränderlichen Tic-Tac-Toe ähnelt.
Regeln
Dies ist die leere Tafel des Spiels:
a b c
1 [ ]–[ ]–[ ]
| \ | / |
2 [ ]–[ ]–[ ]
| / | \ |
3 [ ]–[ ]–[ ]
[ ]
ist ein Feld und |–/\
repräsentiert Routen zwischen diesen Feldern.
Das Spiel wird von zwei Spielern gespielt 1
und 2
den jedem Platz 3 Token auf dem Brett. Das ist eigentlich schon passiert und wir sind im Spiel. Das Spiel ist gewonnen, wenn ein Spieler mill
eine vertikale oder horizontale Reihe der 3 Spielsteine des Spielers bilden kann .
Spielmarken können auf dem Spielfeld entlang der Verbindungslinien verschoben werden. Dabei gilt folgende Regel:
Zu jeder benachbarten leeren Position (dh von einer Kantenposition zur Mitte oder von der Mitte zu einer Kantenposition oder von einer Kantenposition zu einer benachbarten Kantenposition
Ein Spieler muss einen Zug machen, es sei denn, es gibt keine angrenzende leere Position. In diesem Fall wird der Zug übersprungen.
Die Herausforderung
Du bist ein Spieler 1
und dein Zug ist der nächste. Schreiben Sie ein Programm oder eine Funktion, die bestimmt, ob:
- Sie können einen Gewinn mit 2 oder weniger Zügen erzwingen ( definitiver Gewinn )
- Sie können mit 2 oder weniger Zügen gewinnen, wenn Ihr Gegner einen Fehler macht ( möglicher Gewinn )
- Sie können nicht mit 2 oder weniger Zügen gewinnen, weil Sie mehr Züge benötigen oder weil erzwungene Züge Ihren Gegner zum Sieg führen ( unmöglich zu gewinnen ).
Bedarf
- Auch wenn Sie definitiv gewinnen, wenn Sie Ihren Gegner zu Tode langweilen, muss Ihr Programm in endlicher Zeit abgeschlossen sein.
- Sie können ein Programm oder eine Funktion schreiben.
Eingang
Die Spieler werden von 1
und vertreten 2
. 0
definiert ein freies Feld. Sie können Eingaben als Matrix oder Array übernehmen.
Auf jeden Fall
A B C D
2 1 0 | 2 1 0 | 1 0 1 | 1 2 2
2 1 2 | 0 1 0 | 1 0 2 | 2 1 O
0 0 1 | 2 2 1 | 0 2 2 | O O 1
A: [2,1,0,2,1,2,0,0,1]
B: [2,1,0,0,1,0,2,2,1]
C: [1,0,1,1,0,2,0,2,2]
D: [1,2,2,2,1,0,0,0,1]
Möglich
A B C
1 0 1 | 1 0 1 | 1 2 2
1 2 2 | 1 2 0 | 0 0 1
2 0 0 | 2 0 2 | 2 1 0
A: [1,0,1,1,2,2,2,0,0]
B: [1,0,1,1,2,0,2,0,2]
C: [1,2,2,0,0,1,2,1,0]
Unmöglich
A B
1 0 0 | 1 2 0
1 2 2 | 2 1 0
2 0 1 | 1 2 0
A: [1,0,0,1,2,2,2,0,1]
B: [1,2,0,2,1,0,1,2,0]
Ausgabe
Ihr Programm sollte einen Smiley ausgeben / zurückgeben:
- Definitiver Gewinn:
:)
- Möglicher Gewinn:
:|
- Unmöglich zu gewinnen:
:(
Beispiele
Definitiver Gewinn in zwei Zügen:
[2][1][ ] 1. [2][1][ ]
[2][1][2] -> [2][1][2]
[ ][ ][1] [ ][1][ ]
[2][1][ ] 1. [2][1][ ] [ ][1][ ] 2. [ ][ ][1]
[ ][1][ ] -> [ ][ ][1] -> [2][ ][1] -> [2][ ][1]
[2][2][1] [2][2][1] [2][2][1] [2][2][1]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][ ][2] -> [1][ ][2] -> [1][ ][2] -> [ ][ ][2]
[ ][2][2] [ ][2][2] [2][ ][2] [2][ ][2]
Möglicher Gewinn in zwei Zügen:
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][ ][1] 1. [ ][1][1] [ ][1][1] 2. [1][1][1]
[1][2][ ] -> [1][2][ ] -> [1][2][2] -> [ ][2][2]
[2][ ][2] [2][ ][2] [2][ ][ ] [2][ ][ ]
[1][2][2] 1. [ ][2][2] [2][ ][2] 2. [1][2][2]
[ ][ ][1] -> [1][ ][1] -> [1][ ][1] -> [1][1][1]
[2][1][ ] [2][1][ ] [2][1][ ] [2][ ][ ]
In zwei Zügen nicht zu gewinnen:
[1][ ][ ]
[1][2][2]
[2][ ][1]
Bonus
Falls ein definitiver Gewinn möglich ist und Ihr Programm die Züge eines Weges zum Erfolg ausgibt, wie zum Beispiel a1:a2
(1 Zug) oder a1:a2,a3:b2
(2 Züge), können Sie 30% Ihrer Byteanzahl abziehen .
Das ist Code Golf - also gewinnt die kürzeste Antwort in Bytes. Standardlücken sind nicht zulässig.
Vielen Dank an Peter Taylor, der einige Fehler behoben und die Formulierung in der Sandbox verbessert hat .
quelle
[1,0,0,2,1,0,2,2,1]
kann sich Spieler 2 nicht bewegen - ist dies ein Gewinn für Spieler 1?Antworten:
Haskell,
580564441 BytesSo weit kann ich jetzt noch Golf spielen. Nicht sicher, ob die anderen Sprachen es schlagen können.
Rufen Sie
m
eine Liste von Listen wie[[2,1,0],[2,1,2],[0,0,1]]
(Definite A) auf.Testcode:
mapM_ m al
kehrt zurück:quelle
C # -
739663 BytesKomplettes Programm, liest Eingaben von argv und scheint zu funktionieren. Führen Sie es wie
Wenn diese Eingabemethode nicht akzeptabel ist, werde ich sie gerne ändern (nie wie bei Verwendung von argv).
Ich war nicht geneigt, dies gestern zu posten, weil ich nicht viel Golf spielen konnte (ich hatte nicht so viel Zeit und könnte aus dem Training geraten sein), aber da es noch keine Antwort gab, habe ich Ich werde es trotzdem posten, ich erwarte mit Sicherheit kein Kopfgeld. Ich würde es lieber jemandem überlassen, der sich vor dem Posten ein bisschen mehr Mühe gibt!
Bearbeiten: Ersetzte alle Bools durch Ints, was bedeutete, dass ich Linq besser nutzen konnte, und schaffte es, beide foreach-Schleifen zusammenzubrechen, was zu großen Einsparungen führte. Ich bin etwas erstaunt, dass der
h
Zähler funktioniert ... ++ ist so ein subtiles Dienstprogramm.Das Programm ist sehr einfach, es untersucht nur alle möglichen Züge (speichert den Board-Status in einem String []). Es durchläuft alle unsere möglichen Züge (die daraus resultierenden Bretter) und zählt die Anzahl der Antworten unseres Gegners, die wir erfolgreich schlagen können (
G
) (dh diejenigen, die wir gewinnen, und er nicht). Es zählt auch die Anzahl der möglichen Antworten (h
). Wenn wir eines gewinnen können, ist es möglich, und wir addieren 1 zu der Summe. Wenn wir alle gewinnen können, ist es eine bestimmte Summe, und wir addieren 2 zu der Summe. Das Maximum some ist daher unser bestmögliches Ergebnis, und wir indizieren die Zeichenfolge "(|))", um die entsprechende Fläche zurückzugeben. Beachten Sie, dass wir das zusätzliche ")" benötigen, da die Summe 2 oder 3 sein kann, wenn es sich um eine bestimmte handelt (es ist möglich, dass wir keine Antworten schlagen können, die bereits auf Anhieb gewonnen wurden, daher ist die mögliche Überprüfung ein bisschen irreführend).Das Programm prüft auf einen Sieg, indem es eine Zeichenfolge aus dem Spielplan erzeugt, dh durch Leerzeichen getrennte Zeilen und Spalten, und sucht in dieser Zeichenfolge nach einer Zeichenfolge mit 3 Zeichen des Spielers (z. B. "201 201 021 220 002 111" ist a gewinnen für uns)
Hier ist mein Testskript:
Welche Ausgänge
quelle
PowerShell
576550 BytesIch werde mich nicht so leicht abschrecken lassen - wenn ich C # nicht unter 631 Bytes bekomme, muss ich stattdessen eine andere Sprache verwenden! Ich hoffe, dass Leif Willerts seine Antwort um 5 Bytes verkürzt, weil ich entschieden habe, dass ich PowerShell nicht sonderlich mag. Vielleicht muss ich es nur objektiv in Byte-Zahlen betrachten ...
Dies ist ein Skript, mit dem Sie es ausführen
. .\mill.ps1 "201102021"
. Es ist ziemlich gut eine Kopie meiner C # -Antwort, nur in einer Sprache, mit der ich wenig Erfahrung habe. Ich habe mir nicht allzu viel Mühe gegeben, um Golf zu spielen, weil es in erster Linie so lange gedauert hat, bis ich meine Arbeit aufgenommen habe, und weil es schon einigermaßen kompakt ist.Bearbeiten: konnte diese
[Math]::Floor
Anrufe nicht einfach dort belassenWenn Sie eine Beschreibung der Funktionsweise haben, ist die C # -Antwort genau das Richtige für Sie. Die Semikolons stimmen möglicherweise nicht perfekt mit dem einzeiligen Befehl überein. Ich bin mir noch nicht sicher, wo sie benötigt werden und wo nicht. Ich habe sie nicht zurückkopiert, als ich das Ganze in eine Zeile geschrieben habe.
Testskript (PowerShell):
Ausgabe davon:
quelle
Python 3,
566557 BytesIch werde sehen müssen, ob ich weiter Golf spielen kann oder ob ich den 30% -Bonus bekomme, aber nach langem Hin und Her ist hier meine Antwort.
Ungolfed:
quelle