Hintergrund
MENACE ( M achine E ducable N oughts A nd C rosses E ngine) ist ein rudimentärer flacher Algorithmus für maschinelles Lernen für das Spiel Noughts and Crosses, der in den 1960er Jahren vom britischen Informatiker Donald Michie entwickelt wurde. Es wurde ursprünglich mit 304 Streichholzschachteln implementiert, die jeweils mit einer Brettposition gekennzeichnet sind und farbige Perlen enthalten (wobei eine von neun Farben mögliche Bewegungen darstellt). Michie berechnete, dass diese 304 Streichholzschachteln für jede Kombination von Zügen auf dem Brett ausreichten.
Je mathematischer unter Ihnen, desto mehr können Sie feststellen, dass es tatsächlich 19.683 mögliche Kombinationen von Nullen, Kreuzen und Leerzeichen auf einer N & C-Tafel gibt. Er berechnete jedoch Möglichkeiten, um diese Zahl zu reduzieren (um den Algorithmus zu beschleunigen und wahrscheinlich Streichholzschachteln zu reduzieren!). Erstens entfernte er alle nicht möglichen Bewegungen, wie zum Beispiel:
-------
|X|0|X|
| |0| |
|X|X| |
-------
(zwei Nullen und vier Kreuze)
Als nächstes kompensierte er Rotationen. Wenn wir zum Beispiel auf der Streichholzschachtel sehen:
-------
| |0|0|
|X| |X|
| |0| |
-------
Wir können die gleiche Box für verwenden
-------
| |X| |
|0| |0|
| |X|0|
-------
Daher repräsentieren die oben genannten farbigen Perlen relative Positionen, nicht absolute. Wenn wir zum Beispiel sagen, dass eine rote Perle oben links bedeutet, schauen wir uns das Bild oben auf der Box an und sehen:
-------
| |0|0|
|X| |X|
| |0| |
-------
Wir würden also wissen, dass in dem Fall, dass dies das Brett ist, die rote Perle bedeuten würde:
-------
|R|0|0|
|X| |X|
| |0| |
-------
Aber wenn dies das Board ist:
-------
| |X| |
|0| |0|
| |X|0|
-------
die rote Perle würde bedeuten
-------
| |X|R|
|0| |0|
| |X|0|
-------
Diese Transformationen galten für Rotationen und Invertierungen (in alle Richtungen, einschließlich Diagonale). Auch hier müssen Sie jede Streichholzschachtel nur einmal auf diese Weise speichern: Erstellen Sie nicht für jede Transformation separate virtuelle Kisten!
Eine weitere Vereinfachung, die Michie vorgenommen hat, bestand darin, sicherzustellen, dass der Computer zuerst funktioniert. Auf diese Weise konnte er alle Bewegungen der ersten Ebene entfernen und etwa ein Fünftel der verbleibenden Kisten entfernen. Schließlich entfernte er alle Spielende-Boxen (da für diese Schritte keine weiteren "Inhalte" oder Züge erforderlich waren).
Nun zum Algorithmus selbst (es ist sehr einfach):
- Entscheiden Sie zunächst, welche Farben die Perlen darstellen. Sie benötigen 9 Farben, um jedes der Felder auf der Tafel darzustellen.
- Zu Beginn des Spiels enthält jede der 304 Streichholzschachteln Perlen. Während die Perlen eine zufällige Farbe haben (Duplikate sind also in Ordnung), sollten sie mögliche Bewegungen sein (wenn das Board-Statusbild in der Mitte rechts ein 'O' darstellt, können Sie die Perle, die die Mitte darstellt, nicht verwenden. richtig).
- Suchen Sie jedes Mal, wenn MENACE (X) an der Reihe ist, die Streichholzschachtel mit der aktuellen Brettposition (oder einer Transformation davon).
- Öffne die Streichholzschachtel und wähle zufällig eine beliebige Perle aus.
- Finden Sie heraus, wie der Board-Status geändert wurde, um zum Bild auf der Streichholzschachtel zu gelangen (z. B. um 90 Grad gegen den Uhrzeigersinn gedreht). Wenden Sie dann diese Transformation auf die Perle an (z. B. wird oben links links links).
- Platziere ein X in diesem Quadrat. Entfernen Sie die ausgewählte Perle aus der Streichholzschachtel. Wenn die Schachtel dadurch leer bleibt, legen Sie drei zufällige (mögliche) Perlen in die Schachtel und wählen Sie eine davon für den Zug aus.
- Wiederholen Sie 3-6, bis das Spiel beendet ist.
- Wenn MENACE das Spiel gewonnen hat, gehen Sie alle Streichholzschachteln durch, die MENACE genommen hat. Verfolgen Sie dann, welche Farbperle bei dieser Bewegung verwendet wurde. Legen Sie zwei dieser Perlenfarben in die Schachtel (so dass es die ursprüngliche Perle + eine weitere gibt, wodurch die Wahrscheinlichkeit erhöht wird, dass MENACE diese Bewegung beim nächsten Erreichen dieser Position ausführt).
- Wenn MENACE das Spiel verloren hat, tun Sie nichts ( ersetzen Sie nicht die herausgenommenen Perlen).
- Wenn MENACE das Spiel gezeichnet hat, ersetzen Sie die Perle, die es in jedem seiner Züge verwendet hat, aber fügen Sie keine zusätzliche hinzu, damit Sie das behalten, was Sie begonnen haben.
Dies lässt uns einen Algorithmus übrig, der sehr einfach, aber schwer zu implementieren ist. Dies bildet die Grundlage Ihrer Herausforderung.
Wenn Sie immer noch verwirrt sind, lesen Sie http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/ - das habe ich gelesen, als ich zum ersten Mal von diesem Algorithmus erfahren habe
Herausforderung
Spielen Sie eine Partie Tic-Tac-Toe mit dem Computer. Geben Sie bei jedem Schritt den Inhalt aller Streichholzschachteln aus.
Eingänge
- Zu Beginn des Programms eine Zahl, die angibt, wie viele Spiele Sie gegen MENACE spielen möchten
- Nach der ersten Runde von MENACE geben Sie Ihren Zug als zweistellige Zeichenfolge ein. Der erste Buchstabe ist "L", "R" oder "M" (links, rechts oder in der Mitte) und bezieht sich auf die Y-Achse. Dann geben Sie einen weiteren Buchstaben ein (wieder "L", "R" oder "M"), diesmal bezogen auf die X-Achse. Wiederholen Sie dies für alle Züge und Spiele.
Ausgänge
- Geben Sie zu Beginn jedes neuen Spiels "neues Spiel" aus.
- Geben Sie das Spielbrett nach jedem Zug des Spielers in einem angemessenen Format aus. Es muss nicht hübsch aussehen (z. B. ist ein Array von Arrays, die die Positionen der Platine darstellen, in Ordnung).
- Nach jedem Zug des Spielers sollte MENACE einen Zug machen. Gib das Board nach dem Umzug von MENACE aus
- Geben Sie nach jedem Spiel den Inhalt aller 304 Streichholzschachteln aus. Perlen können durch einen Buchstaben, einen Namen einer Farbe, ein Zeichen oder eine beliebige Zeichenfolge oder Ganzzahl dargestellt werden (keine Zeiger, anonyme Funktionen usw.).
Regeln
- Dies ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
- Ich muss in der Lage sein, Bewegungen einzugeben, nachdem ich die Antwort von MENACE gesehen habe. Nein, "Übergeben Sie alle Ihre Züge in diese Funktion und beobachten Sie, wie das Spiel abläuft".
- Das Brett muss zwischen den Spielen geräumt werden.
- Die Streichholzschachteln dürfen zwischen den Spielen nicht gelöscht werden (dies würde das maschinelle Lernen zurücksetzen).
- Sie müssen 304 Streichholzschachteln haben. Jeder kann diesen Algorithmus mit allen 19.683 Streichholzschachteln implementieren, aber das Lernen ist langsam (da viele Spiele erforderlich sind , um alle mit nützlichen Inhalten zu versehen).
- Die Ausgabe kann in jedem vernünftigen Format erfolgen, und die Eingabe kann gemäß den PPCG-Standards erfolgen (sofern dies der Regel 2 entspricht). Wenn Sie das Eingabeformat anpassen müssen (wie im Abschnitt ' Eingabe ' beschrieben), ist es in Ordnung, solange es sinnvoll ist.
- Ein Spiel endet, wenn ein Spieler gewinnt (indem er drei in einer Reihe diagonal, horizontal oder vertikal erhält) oder wenn es ein Unentschieden gibt (das Brett ist voll und es gibt keinen Gewinner).
- Während MENACE mögliche Bewegungen ausführen muss (und nur mögliche Perlen in jeder Streichholzschachtel haben muss), müssen Sie für die Herausforderung die Eingabe des Benutzers nicht validieren. Wenn sie etwas falsches eingeben, kann Ihr Programm alles tun (völlig verrückt werden, Fehler auslösen usw.) - Sie können davon ausgehen, dass die Eingabe korrekt ist.
quelle
[[0, 2, 6], [4, 8, 4, 3, 3], [7, 7, 7, 7, 7, 7, 7, 8], [1], ... [3, 3, 5, 4]]
.Antworten:
R 839 Bytes
Probieren Sie es online aus!
Eine ziemlich lange Antwort, aber dies war keine einfache Herausforderung. Die TIO-Verbindung hier schlägt fehl, da sie interaktive Eingaben erwartet. Hier ist eine Version , die gegen einen zweiten, zufälligen Spieler spielt, der nur zufällig einen Punkt auswählt. Die Ausgabe für diese zweite Version ist nur der Gewinner (1, 2 oder 0 für ein Unentschieden). Streichholzschachteln werden für alle Brettpositionen initialisiert, aber nur für die 304 gemäß Spezifikation verwendet. Sie werden als Kopien der Tafel mit negativen Zahlen implementiert, um die Anzahl der Perlen an jeder Position anzugeben. Ich habe mit einer Liste von Vektoren gemäß der ursprünglichen Spezifikation experimentiert, aber sie war weniger intuitiv.
Dies ist eine weniger Golfversion mit Kommentaren (aber immer noch kurzen Variablennamen). Beachten Sie, dass die Streichholzschachteln nicht ausgedruckt werden, da sie sehr lang sind. Es kann einen interaktiven Spieler 2, einen zufälligen Spieler 2 oder dieselbe Matchbox-Strategie für Spieler 2 implementieren.
quelle