Mein Versuch, diese Frage zu stellen , aber mit einem objektiveren Lösungskriterium.
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu erstellen, die ein gelöstes Sudoku-Raster S
im Format Ihrer Wahl verwendet und versucht, mit möglichst wenigen Hinweisen ein Problemraster zu generieren, S
dessen Lösung eindeutig ist. (Es spielt keine Rolle, nach welcher Methode S
die eindeutige Lösung, einschließlich Brute Force, vorliegt, solange die Lösung nachweislich eindeutig ist.)
Ihr Programm wird bewertet, indem Sie es durch einen Satz von 100.000 Lösungsrastern in dieser Datei (7,82 MB Download) laufen lassen und die Anzahl der Hinweise in allen 100.000 Problemrastern addieren, die Ihre Lösung erzeugt.
Die Sudoku-Lösungen in der obigen Testdatei werden als 81-stellige Zeichenfolge von links nach rechts und von oben nach unten ausgedrückt. Der Code, der erforderlich ist, um die Eingabe in der Testdatei in eine verwendbare Lösung umzuwandeln, wird nicht für die Byteanzahl Ihrer Lösung berücksichtigt.
Wie bei meiner Flood Paint- Herausforderung muss Ihr Programm tatsächlich eine gültige Ausgabe für alle 100.000 Puzzlespiele liefern, um als gültige Lösung zu gelten. Das Programm, das die wenigsten Gesamthinweise für alle 100.000 Testfälle ausgibt, ist der Gewinner, wobei ein kürzerer Code ein Unentschieden löst.
Aktueller Anzeiger:
Antworten:
C - 2,361,024,
2,509,949HinweiseEntfernen Sie Hinweise ab der letzten Zelle, wenn ein Brute-Force-Löser nur eine eindeutige Lösung findet.
Zweiter Versuch: Verwenden Sie die Heuristik, um zu entscheiden, in welcher Reihenfolge Hinweise entfernt werden sollen, anstatt vom letzten zu beginnen. Dadurch wird der Code viel langsamer ausgeführt (20 Minuten anstelle von 2 Minuten, um das Ergebnis zu berechnen). Ich könnte den Löser schneller machen, um mit verschiedenen Heuristiken zu experimentieren, aber im Moment reicht es.
quelle
Python - 7.200.000 Hinweise
Wie üblich ist hier eine Referenzlösung für den letzten Platz:
Wenn Sie die untere Zahlenreihe entfernen, bleibt das Rätsel nachweislich in allen Fällen lösbar, da in jeder Spalte immer noch 8 von 9 Zahlen gefüllt sind und jede Zahl in der unteren Reihe einfach die neunte Zahl in der Spalte ist.
Wenn es ein ernsthafter Anwärter schafft, legal schlechter als dieser zu punkten, werde ich erstaunt sein.
quelle
Python 2 - 6.000.000 Hinweise
Eine einfache Lösung, die die 3 häufigsten Methoden zum Lösen dieser Rätsel verwendet:
Diese Funktion erzeugt Hinweisformate wie dieses:
Dies kann immer gelöst werden. Die 4 3x3 Teile werden zuerst gelöst, dann die 8 Spalten, dann die 9 Zeilen.
quelle
PHP - 2.580.210 Hinweise
Dadurch werden zuerst die letzte Zeile und Spalte sowie die rechte untere Ecke aller Kästchen entfernt. Anschließend wird versucht, jede Zelle zu löschen und die Karte nach jeder Änderung einem einfachen Solver zu unterziehen, um sicherzustellen, dass die Karte immer noch eindeutig lösbar ist.
Ein Großteil des folgenden Codes wurde von einer meiner alten Antworten geändert .
printBoard
verwendet 0s für leere Zellen.quelle