Implementieren Sie den kürzesten Sudoku-Löser mit Raten. Da ich einige Anfragen erhalten habe, habe ich diese als alternative Frage für diejenigen hinzugefügt , die einen Brute-Force-Sudoku-Löser implementieren möchten.
Sudoku-Puzzle:
| 1 2 3 | 4 5 6 | 7 8 9
-+-----------------------
A| 3 | 1 |
B| 6 | | 5
C| 5 | | 9 8 3
-+-----------------------
D| 8 | 6 | 3 2
E| | 5 |
F| 9 3 | 8 | 6
-+-----------------------
G| 7 1 4 | | 9
H| 2 | | 8
I| | 4 | 3
Antworten:
| 1 2 3 | 4 5 6 | 7 8 9
-+-----------------------
A| 8 3 2 | 5 9 1 | 6 7 4
B| 4 9 6 | 3 8 7 | 2 5 1
C| 5 7 1 | 2 6 4 | 9 8 3
-+-----------------------
D| 1 8 5 | 7 4 6 | 3 9 2
E| 2 6 7 | 9 5 3 | 4 1 8
F| 9 4 3 | 8 1 2 | 7 6 5
-+-----------------------
G| 7 1 4 | 6 3 8 | 5 2 9
H| 3 2 9 | 1 7 5 | 8 4 6
I| 6 5 8 | 4 2 9 | 1 3 7
Regeln:
- Angenommen, alle Labyrinthe sind nur durch Logik lösbar.
- Alle Eingaben sind 81 Zeichen lang. Fehlende Zeichen sind 0.
- Die Lösung als einzelne Zeichenfolge ausgeben.
- Das "Gitter" kann nach Belieben intern gespeichert werden.
- Die Lösung muss eine Brute-Force-Rate-Lösung verwenden.
- Lösungen sollten innerhalb einer angemessenen Frist gelöst werden.
Beispiel I / O:
>sudoku.py "030001000006000050500000983080006302000050000903800060714000009020000800000400030"
832591674496387251571264983185746392267953418943812765714638529329175846658429137
code-golf
game
puzzle-solver
sudoku
snmcdonald
quelle
quelle
Antworten:
k (72 Bytes)
Das Verdienst geht an Arthur Whitney, den Schöpfer der k-Sprache.
quelle
Python, 188 Bytes
Dies ist eine weitere gekürzte Version meines Siegerbeitrags für CodeSprint Sudoku , der für die Befehlszeileneingabe anstelle von stdin (gemäß OP) geändert wurde:
Wenn Sie Python 2 verwenden,
'%d'%5**18
kann durch ersetzt werden`5**18`
, um 3 Bytes zu sparen.Damit es schneller läuft, können Sie es durch
'%d'%5**18
eine Permutation'123456789'
von 1 Byte ersetzen .Wenn Sie den Eingang auf der Standardeingabe anstatt anzunehmen möchten, können Sie ersetzen
import sys;f(sys.argv[1])
mitf(raw_input())
, es bringt nach unten 177 Bytes .BEARBEITEN: Hier ist ein Link zu einer detaillierteren Anleitung.
quelle
Python, 197 Zeichen
quelle
Antwort in D:
Mit der Beispieleingabe dauert es auf meinem Phenom II X6 1090T 0,033 Sekunden, wenn es mit kompiliert wird
dmd -w
(dh ohne Optimierungen) kompiliert wird , und 0,011 Sekunden, wenn es mitdmd -w -O -inline -release
(dh mit Optimierungen) kompiliert wird .quelle
J, 103
erwartete Laufzeit: O (Milliarden Jahre)
quelle
Perl, 120 Bytes
Oh, ich erinnere mich, dass ich das 2008 beim Golfen gemacht habe ... Und es hat tatsächlich aufgehört, in Perl 5.12 zu funktionieren, da die implizite Einstellung von @_ by split dann entfernt wurde. Versuchen Sie dies also nur auf einem ausreichend alten Perl.
Führen Sie mit der Eingabe auf STDIN aus:
sudoku.pl
:quelle
Perl, 235 Zeichen
Dies ist eine Golf-Version von etwas, das ich vor vielen Jahren in die Fun With Perl-Mailingliste aufgenommen habe : eine Regexp zur Sudoku-Lösung.
Grundsätzlich werden die Eingaben in 81 Zeilen aufgeteilt, von denen jede alle Zahlen enthält, die im entsprechenden Quadrat vorkommen können. Anschließend wird ein regulärer Ausdruck erstellt, der mit einer Zahl aus jeder Zeile übereinstimmt. Dabei werden Rückverweise und negative Lookahead-Aussagen verwendet, um Lösungen abzulehnen, die die Einschränkungen für Zeilen, Spalten oder Bereiche verletzen. Dann wird die Zeichenfolge mit dem regulären Ausdruck abgeglichen, sodass die reguläre Ausdrucks-Engine von Perl die harte Arbeit des Testens und Zurückverfolgens erledigt.
Erstaunlicherweise ist es möglich, einen einzelnen regulären Ausdruck zu erstellen, der für jede Eingabe funktioniert, wie es mein ursprüngliches Programm tut. Leider ist es ziemlich langsam, daher habe ich den Code hier auf der Grundlage der hartcodierten Version von Givens ( die später im FWP-Thread zu finden ist ) erstellt, mit der der reguläre Ausdruck optimiert wird, um Lösungen, von denen bekannt ist, dass sie später eine Einschränkung verletzen, frühzeitig abzulehnen. Dies macht es relativ schnell für einfache bis mittelschwere Sudokus, obwohl die Lösung besonders schwerer Sudokus noch einige Zeit in Anspruch nehmen kann.
Führen Sie den Code mit aus
perl -M5.010
, um die Perl 5.10+say
-Funktion zu aktivieren . Die Eingabe sollte auf der Standardeingabe erfolgen, und die Lösung wird auf der Standardausgabe gedruckt. Beispiel:quelle
1-Liner-Kaffee-Skript
solve = (s, c = 0) -> if c is 81 then s else if s[x = c/9|0][y = c%9] isnt 0 then solve s, c+1 else (([1..9].filter (g) -> ![0...9].some (i) -> g in [s[x][i], s[i][y], s[3*(x/3|0) + i/3|0][3*(y/3|0) + i%3]]).some (g) -> s[x][y] = g; solve s, c+1) or s[x][y] = 0
Hier ist die größere Version mit Beispielnutzung :
quelle
solve
, Entfernen vieler Leerzeichen (ich weiß, es ist bedeutend, aber an vielen Stellen könnte es entfernt werden), Verwenden von Symbolen anstelle von Wörtern (wie!=
anstelle vonisnt
), Verwenden von Einrückungen anstelle vonthen
Schlüsselwörtern, Ersetzen[0...9]
durch gekürzt werden[0..8]
.Clojure - 480 Bytes
Die Größe explodierte, aber zumindest ist es eine hübsche Zahl. Ich denke, es könnte viel verbessert werden, wenn man nur 1D-Vektor verwendet. Auf jeden Fall dauert der Testfall auf meinem Laptop etwas weniger als vier Sekunden. Ich dachte, es wäre angebracht, eine Funktion zu definieren, da es sich schließlich um eine funktionale Sprache handelt.
Beispiele:
Eine etwas ungolfedere (und schönere) Version:
quelle
PowerShell ,
244242218215 ByteProbieren Sie es online!
Das Skript findet alle Lösungen für ein Sudoku.
Abgerollt:
Testfälle:
quelle
D (322 Zeichen)
Für jedes ungelöste Quadrat erstellt es eine Reihe verfügbarer Optionen und durchläuft es dann in einer Schleife.
mit Leerzeichen:
quelle
Perl (195 Zeichen)
Alle Kredit geht an den Schöpfer hier , und die Erklärung kann auch dort zu finden.
quelle
J, 94 Bytes
Arbeitet genauso wie die K-Version, nämlich mit einem BFS (soll also alle Lösungen ausgeben). Es werden Leerzeichen zwischen den Ausgabestellen ausgegeben, aber auch das K-Programm. Ich zähle nicht "s =:", da dies nur die Funktion benennt (so als würde ich den Dateinamen nicht in einer anderen Sprache zählen).
quelle