In Spiel 15 wählen zwei Spieler abwechselnd Zahlen von 1 bis 9 aus (ohne eine Zahl auszuwählen, die einer der Spieler bereits ausgewählt hat). Ein Spieler gewinnt, wenn er drei Zahlen hat, die sich zu 15 addieren. Wenn alle Zahlen ausgewählt wurden und keine Kombination der beiden Zahlen 15 ergibt, ist das Spiel ein Unentschieden.
Ihre Aufgabe ist es, eine Funktion zu erstellen, die den Status eines 15er-Spiels annimmt (in einer beliebigen Form dargestellt) und die Zahl zurückgibt, die als nächstes bewegt werden soll. Diese fungiert als KI, um das Spiel mit einem anderen Spieler zu spielen. Sie können davon ausgehen, dass die Position legal ist (kein Spieler hat mehr als eine Zahl mehr als der andere Spieler, und kein Spieler hat bereits drei Zahlen, die sich zu 15 addieren).
Die KI muss perfekt sein - das heißt, wenn sie eine Gewinnposition erhält, muss sie einen Gewinn erzwingen, und wenn sie eine Position ohne Verlust erhält (eine Position, in der ihr Gegner keine Gewinnstrategie hat), darf sie ihre nicht zulassen Gegner, um ihm eine verlorene Position zu geben (was möglich ist, da 15 ein gelöstes Spiel ist).
Der kürzeste Code gewinnt.
(Hinweis: Ich akzeptiere die derzeit kürzeste Antwort und ändere sie, wenn eine kürzere Antwort angezeigt wird.)
Antworten:
GolfScript (
129 86 81 8575 Zeichen)Erwartetes Eingabeformat:
[[int int ...][int int ...]]
Dabei ist die erste Liste meine Nummer und die zweite Liste die Nummer meines Gegners. Fügen Sie für interaktive Tests~N
am Ende des Skripts eine Zeichenfolge in diesem Format hinzu: zHeuristik:
5
ist die einzige Zahl, die auf vier Arten zum Gewinnen beitragen kann. Schnappen Sie sie sich, falls verfügbar.Testrahmen:
quelle
[5][3]
(sollte entweder 4 oder 8 zurückgeben).9
- aber dann scheinen Sie die Regeln geändert zu haben.4
oder8
?7
sollte funktionieren,9
ist also akzeptabel.Ruby,
330 315341 ZeichenIch werde die Details vorerst zurückhalten, aber sagen wir, dass es auf dem optimalen Algorithmus für ein ähnliches Problem basiert, das ebenfalls gelöst wurde und dessen optimaler Algorithmus hier genauso gut funktioniert hat.
Es wurden Annahmen getroffen - dies wählt schlechte Züge in Situationen aus, die von diesem Algorithmus nicht erzeugt werden können, wenn er gegen einen anderen Spieler spielt, sondern nur von zwei Spielern gegeneinander.Eingabe: Ein Array aus zwei Arrays mit einstelligen Zeichenfolgen. Jedes Array repräsentiert die Werte eines Spielers - der erste ist die KI, der zweite ist der Gegner.
Ausgabe: entweder eine Zahl oder eine einstellige Zeichenfolge. Sie sind semantisch äquivalent. Die Normalisierung auf Zeichenfolgen würde 8 Zeichen kosten.
Drei weitere Zeichen können gespeichert werden, wenn wir die vom Anrufer angegebene Reihenfolge der Zahlen annehmen. Ändern Sie den regulären Ausdruck in L5 in
/^285$/
oder/^258$/
abhängig von der Reihenfolge, die aus dem Spiel hervorgeht(opponent)5-(ai)2-(opponent)8
.quelle
5
zum Anfang Ihrer Präferenzreihenfolge wechseln.GolfScript (
90 8584 Zeichen)Dies verfolgt einen völlig anderen Ansatz, ist jedoch möglicherweise anfällig für Optimierungen, um die heuristische zu übertreffen. Hier führen wir eine vollständige Spielbaumanalyse durch, unglaublich langsam. (Nein, ich meine es ernst. Es dauert mehrere Stunden , um den vollständigen Test auszuführen, hauptsächlich aufgrund dessen,
`{...}+
was den aktuellen Status zur Schleife für den nächsten Zug hinzufügt.) Beachten Sie, dass der schwierige Teil darin besteht, einen Gewinnstatus zu identifizieren (derzeit ein Drittel des Codes).Es gibt einige hässliche Hacks in den nicht rekursiven Abschnitten. Insbesondere wenn die Position als verlierend identifiziert wird, nehmen wir unsere Positionen als
[value move]
Array, wobei wir uns darauf verlassen, dass die Bewegung irrelevant ist und der Wert nicht Null ist.quelle