Hintergrund
Hex ist ein abstraktes Strategiespiel für zwei Spieler, das auf einer K×K
Raute aus sechseckigen Kacheln gespielt wird. Zwei gegenüberliegende Seiten der Raute sind weiß gefärbt, und die anderen beiden schwarz, und die beiden Spieler, schwarz und weiß, wechseln sich ab, indem sie ein Zeichen ihrer Farbe auf ein unbesetztes Plättchen legen. Der Spieler, der es zuerst schafft, einen Pfad zwischen den gegenüberliegenden Seiten seiner Farbe zu konstruieren, ist der Gewinner. Es ist bekannt, dass das Spiel nicht unentschieden enden kann und dass der erste Spieler unabhängig von der Brettgröße eine Gewinnstrategie hat (Details finden Sie auf der Wikipedia-Seite).
Die Aufgabe
Bei dieser Herausforderung legen wir die Kartengröße fest K = 4
und stellen die Karte als das folgende Raster dar. Die dicken Linien kennzeichnen benachbarte Kacheln.
Ihre Aufgabe ist es, eine Gewinnstrategie für den ersten Spieler zu erstellen, die Sie entweder als Schwarz oder Weiß auswählen können. Dies bedeutet, dass Ihr Spiel unabhängig von den legalen Bewegungen des gegnerischen Spielers zu einem Sieg führen muss. Ihre Eingabe ist eine Spielposition (die Anordnung der Token auf dem Brett), und Ihre Ausgabe ist eine legale Bewegung in dem unten angegebenen Format. Wenn Sie selbst eine Gewinnstrategie finden möchten, lesen Sie diesen Spoiler nicht:
Umriss einer möglichen Gewinnstrategie, vorausgesetzt, Weiß steht an erster Stelle. Wählen Sie zuerst 5 aus. Wenn Sie danach einen Pfad von 5 zur unteren Reihe haben ODER Schwarz an einem beliebigen Punkt 0 oder 1 auswählt, wählen Sie die freie 0 oder 1 aus. Wenn Schwarz 9 oder 13 auswählt, wählen Sie 10 und dann welche von 14 oder 15 frei ist. Wenn Schwarz nicht 9, 13 oder 14 auswählt, wählen Sie 9 und als nächstes, was auch immer von 13 oder 14 frei ist. Wenn Schwarz 14 auswählt, antworten Sie mit 15. Wählen Sie anschließend 10 aus, wenn es frei ist. Wenn Schwarz 10 auswählt, antworten Sie mit 11. Wenn Schwarz dann 6 auswählt, antworten Sie mit 7 und als nächstes, je nachdem, welcher von 2 oder 3 frei ist. Wenn Schwarz nicht 6 auswählt, wählen Sie es aus, sodass Sie einen Pfad von 5 zur unteren Reihe haben.
Ein- und Ausgabe
Ihre Eingabe besteht aus einer Zeichenfolge mit 16 Zeichen WBE
, die für Weiß, Schwarz und Leer steht. Sie repräsentieren die Kacheln der Tafel, wie oben aufgezählt. Sie können die Eingabemethode (die auch Ihre Ausgabemethode bestimmt) wie folgt auswählen:
- Eingabe von STDIN, Ausgabe von STDOUT.
- Eingabe als ein Befehlszeilenargument, Ausgabe an STDOUT.
- Eingabe als 16 einstellige Befehlszeilenargumente, Ausgabe an STDOUT.
- Eingabe als Argument der benannten Funktion, Ausgabe als Rückgabewert.
Ihre Ausgabe stellt das Plättchen dar, auf das Sie Ihren nächsten Spielstein legen, da Sie an der Reihe sind, sich zu bewegen. Sie können aus folgenden Ausgabeformaten wählen:
- Ein auf Null basierender Index (wie im obigen Bild verwendet).
- Ein einbasierter Index.
- Die Eingabezeichenfolge mit einer
E
ersetzt durch die vonW
oderB
Sie wählten für Ihren Player.
Regeln
Ihre Strategie muss deterministisch sein. Sie müssen mit Ihrer Strategie nicht richtig mit Spielpositionen umgehen, die vom leeren Brett aus nicht erreichbar sind, oder mit Positionen, die für einen der beiden Spieler bereits gewonnen haben, und Sie können darauf abstürzen. Umgekehrt müssen Sie auf Boards, die mit Ihrer Strategie erreichbar sind, einen legalen Schritt zurückgeben.
Dies ist Code-Golf, also gewinnt die niedrigste Byteanzahl. Standardlücken sind nicht zulässig.
Testen
Ich habe einen Python 3-Controller zum Überprüfen von Einträgen geschrieben, da es äußerst mühsam wäre, dies von Hand zu tun. Sie finden es hier . Es unterstützt die ersten drei Eingabeformate und Python 3-Funktionen (Funktionen in anderen Sprachen müssen in Programme eingeschlossen werden), alle drei Ausgabeformate und beide Player. Wenn eine Strategie nicht gewinnt, wird ein verlorenes Spiel ausgegeben, das Sie gefunden haben, sodass Sie Ihr Programm optimieren können.
Incorrect response 'WWWWWWWWBBBBBBBB' to message 'WWWWWWWWBBBBBBBB'.
Ich hätte schon vor langer Zeit gewinnen sollen, oder irre ich mich?Antworten:
Marbelous, 973b
Dies ist eine naive Umsetzung der in der Frage angedeuteten Strategie. Es wird erwartet, dass die Karte als 16 Befehlszeilen- / Hauptplatinenparameter wie bereitgestellt wird,
hex.mbl B W E E E W E E E B E E E E E E
und es wird die nullindizierte Position der nächsten Bewegung von Weiß ausgegeben.Ich denke, ich kann wahrscheinlich etwa 200 Zeichen davon mit einer besseren Verzweigung und Eliminierung der Wiederverwendung von Code spielen.
quelle
Python 3, 100b
Die Strategie besteht darin, zuerst nach einem
B
an der Tafel zu suchen . Wenn es keine gibt, wird zurückgegeben-1
, was in Python dasselbe ist wielast index
. Auf einem leeren Brett befindet sich also mein erster Indexindex=-1
, an dem ich mich zu bewegen beginne.Wenn das Feld zu meiner Linken (
index-1
) frei ist, geht mein nächster Zug dorthin. Wenn es genommen wird, gehe ich nach links. Ich muss nie aufsteigen: Wenn ich das tue, verliere ich das Tempo und verliere das Spiel.Auf einer Vollpension (
E
nirgendwo) mache ich keine Bewegung.Das
print
scheint zunächst etwas seltsam: Ich muss das neue Board konstruieren (was ich durch Schneiden mache), aber dann muss ich 16 Zeichen ausschneiden. Dies ist ein Relikt, da ich mit negativen Indizes arbeite undb[i+1:]
daher das Lochbrett und den Rest, den ich erwarte, zurückgeben werde, was es wichtig macht, den Rest abzuschneiden. Ein anderer Weg wäre gewesen, mit positiven Indizes zu arbeiten, z. B. durch Nehmen(b.find('B')+16)%16
, aber es(+16)%16
ist ein Byte mehr als()[:16]
.Ungolfed:
Prüfung
Beim Ausführen der Hex-Controller-Testsuite ist ein seltsames Verhalten aufgetreten:
Ich denke, ich hätte entweder nach der 4. Runde gewinnen sollen oder mit demselben Board auf ein Vollboard zu antworten, sollte eine korrekte Antwort sein. Ich bin mir nicht sicher, was dort schief geht, bin nicht viel tiefer getaucht - ich wollte nur überprüfen, ob alle "Sonderfälle" abgedeckt sind. Aber da ich keine Situationen vertuschen muss, in denen jemand mit Raum 4 oder so beginnt, spielt es sowieso keine Rolle.
85b
Wenn ich mir jedoch erlaube, nicht nach einer Vollplatine zu suchen (dh das wegzulassen,
'E' in b
kann ich den Code weiter vereinfachen, um nur 85 Bytes zu verwenden:Dies führt jedoch zu Folgendem:
Dies könnte gezählt werden oder auch nicht, und da ich feststellte, dass es kein gültiger Schritt war, entschied ich mich für die längere, aber korrektere Antwort.
quelle