Einführung
Diese Herausforderung ähnelt den Problemen von Project Euler . Ich habe es mir ausgedacht, weil ich ein täuschend einfaches Brettspiel gespielt habe und keine effiziente Lösung finden konnte, um eine einfache Frage zu seiner Mechanik zu beantworten.
Quarto ist eine lustige Variante von 4 in einer Reihe. Es wird auf einem 4 x 4-Brett mit 16 Einzelstücken gespielt (es werden keine Stücke dupliziert). In jeder Runde legt jeder Spieler 1 Stück auf das Brett. Jedes Stück hat 4 binäre Eigenschaften (kurz / groß, schwarz / weiß, quadratisch / kreisförmig, hohl / massiv). Das Ziel ist es, vier in einer Reihe, entweder horizontal, vertikal oder entlang der 2 Diagonalen, für eine der vier Eigenschaften zu machen! Also 4 schwarze Stücke, 4 weiße Stücke, 4 große Stücke, 4 kurze Stücke, 4 quadratische Stücke, 4 kreisförmige Stücke, 4 hohle Stücke oder 4 feste Stücke.
Das Bild oben zeigt ein fertiges Spiel, es gibt vier in einer Reihe wegen 4 quadratischer Teile.
Herausforderung
In Quarto können einige Spiele unentschieden enden.
Die Gesamtzahl der möglichen Endpositionen beträgt 16!
etwa 20 Billionen.
Wie viele dieser Endpositionen sind Unentschieden?
Regeln
Die Lösung muss ein Programm sein, das die Gesamtzahl der gezeichneten Endpositionen berechnet und ausgibt. Die richtige Antwort ist
414298141056
Sie dürfen nur Informationen zu den Spielregeln verwenden, die manuell abgeleitet wurden (kein computergestützter Beweis).
Mathematische Vereinfachungen des Problems sind zulässig, müssen jedoch in Ihrer Lösung (manuell) erklärt und bewiesen werden.
Der Gewinner ist derjenige mit der optimalen Lösung in Bezug auf die CPU-Laufzeit.
Um den Gewinner zu ermitteln, werde ich jede einzelne Lösung mit einer gemeldeten Laufzeit von weniger als 30 m auf einem MacBook Pro 2,5 GHz Intel Core i7 mit 16 GB RAM ausführen .
Keine Bonuspunkte für die Entwicklung einer Lösung, die auch mit anderen Boardgrößen funktioniert. Auch wenn das schön wäre.
Falls zutreffend, muss Ihr Programm innerhalb von 1 Minute auf der oben genannten Hardware kompiliert werden (um Missbrauch der Compileroptimierung zu vermeiden).
Standardlücken sind nicht zulässig
Einsendungen
Bitte posten:
- Der Code oder ein Github / Bitbucket-Link zum Code.
- Die Ausgabe des Codes.
- Ihre lokal gemessene Laufzeit
- Eine Erklärung Ihres Ansatzes.
Frist
Einsendeschluss ist der 1. März, also noch viel Zeit.
Antworten:
C: 414298141056 Ziehungen in ca.
52,5 Minuten gefunden.Nur einfache Tiefensuche mit einer symmetriebewussten Transpositionstabelle. Wir verwenden die Symmetrie der Attribute unter Permutation und die 8-fache Dieder-Symmetrie der Platine.
Gemessene Punktzahl (@wvdz):
Punktzahl (Benutzer + System): 1: 35,727 Sekunden
quelle
-O3 -march=native
und habe 1m48s auf meiner Maschine. (CC @wvdz)Java, 414298141056 Draws, 23m42.272s
Ich hoffe, es ist nicht verpönt, eine Lösung für die eigene Herausforderung zu veröffentlichen, aber der Grund, warum ich diese Herausforderung überhaupt veröffentlicht habe, war, dass es mich verrückt machte, dass ich selbst keine effiziente Lösung finden konnte. Mein bester Versuch würde Tage dauern.
Nachdem ich die Antwort von user1502040 studiert hatte , gelang es mir tatsächlich, meinen Code so zu ändern, dass er innerhalb einer angemessenen Zeit ausgeführt wurde. Meine Lösung unterscheidet sich immer noch erheblich, aber ich habe einige Ideen gestohlen:
Der Hauptunterschied zwischen dieser Lösung und der von user1502040 besteht darin, dass ich keine Zobrist-Tabelle verwende, sondern eine kanonische Darstellung einer Karte , bei der jede Karte 48 mögliche Transpositionen über die Eigenschaften aufweist (2 * 4!). Ich drehe oder transponiere nicht das ganze Brett, sondern nur die Eigenschaften der Teile.
Dies ist das Beste, was ich mir vorstellen kann. Ideen für offensichtliche oder weniger offensichtliche Optimierungen sind herzlich willkommen!
Gemessene Punktzahl:
Punktzahl (Benutzer + System): 23m42.272s
quelle