Implémentez le solveur Sudoku le plus court en utilisant la devinette. Depuis que j'ai reçu quelques demandes, j'ai ajouté ceci comme une question alternative pour ceux qui souhaitent implémenter un solveur de sudoku par force brute.
Puzzle Sudoku:
| 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
Répondre:
| 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
Règles:
- Supposons que tous les labyrinthes ne peuvent être résolus que par logique.
- Toutes les entrées comporteront 81 caractères. Les caractères manquants seront 0.
- Générez la solution sous forme de chaîne unique.
- La "grille" peut être stockée en interne comme vous le souhaitez.
- La solution doit utiliser une solution de devinette par force brute.
- Les solutions doivent être résolues dans un délai raisonnable.
Exemple d'E / S:
>sudoku.py "030001000006000050500000983080006302000050000903800060714000009020000800000400030"
832591674496387251571264983185746392267953418943812765714638529329175846658429137
code-golf
game
puzzle-solver
sudoku
snmcdonald
la source
la source
Réponses:
k (72 octets)
Le mérite en revient à Arthur Whitney, créateur de la langue k.
la source
Python, 188 octets
Il s'agit d'une autre version raccourcie de ma soumission gagnante pour CodeSprint Sudoku , modifiée pour l'entrée en ligne de commande au lieu de stdin (selon l'OP):
Si vous utilisez Python 2,
'%d'%5**18
peut être remplacé par`5**18`
pour économiser 3 octets.Pour le faire fonctionner plus rapidement, vous pouvez le remplacer
'%d'%5**18
par n'importe quelle permutation de'123456789'
au coût de 1 octet.Si vous souhaitez qu'il accepte l'entrée sur stdin à la place, vous pouvez le remplacer
import sys;f(sys.argv[1])
parf(raw_input())
, le ramenant à 177 octets .EDIT: voici un lien vers une procédure pas à pas plus détaillée.
la source
Python, 197 caractères
la source
Réponse en D:
Avec l'exemple d'entrée, cela prend .033s sur mon Phenom II X6 1090T lorsqu'il est compilé avec
dmd -w
(c'est-à-dire sans optimisations), et il prend .011s lorsqu'il est compilé avecdmd -w -O -inline -release
(c'est-à-dire avec optimisations).la source
J, 103
durée d'exécution prévue: O (milliards de milliards d'années)
la source
Perl, 120 octets
Oh, je me souviens avoir joué au golf en 2008 ... Et en fait, cela a cessé de fonctionner en Perl 5.12 car le paramètre implicite de @_ by split a été supprimé. Essayez donc ceci uniquement sur un perl suffisamment ancien.
Exécutez avec l'entrée sur STDIN:
sudoku.pl
:la source
Perl, 235 caractères
Il s'agit d'une version golfée de quelque chose que j'ai publié il y a de nombreuses années sur la liste de diffusion Fun With Perl : une expression rationnelle de résolution de sudoku.
Fondamentalement, il modifie l'entrée en 81 lignes, chacune contenant tous les nombres qui pourraient apparaître dans le carré correspondant. Il construit ensuite une expression rationnelle pour correspondre à un nombre de chaque ligne, en utilisant des références arrières et des assertions d'anticipation négatives pour rejeter les solutions qui violent les contraintes de ligne, de colonne ou de région. Ensuite, il fait correspondre la chaîne avec l'expression rationnelle, laissant le moteur d'expression rationnelle de Perl faire le travail difficile d'essai et de retour en arrière.
Étonnamment, il est possible de créer une seule expression rationnelle qui fonctionne pour n'importe quelle entrée, comme le fait mon programme d'origine. Malheureusement, c'est assez lent, j'ai donc basé le code de golf ici sur la version hardcoded-givens ( trouvée plus loin dans le thread FWP ), qui peaufine l'expression rationnelle pour rejeter tôt toutes les solutions dont il sait qu'elles violeront plus tard une contrainte. Cela le rend raisonnablement rapide pour les sudokus de niveau facile à modéré, bien que ceux particulièrement difficiles puissent encore prendre un temps assez long à résoudre.
Exécutez le code avec
perl -M5.010
pour activer la fonction Perl 5.10+say
. L'entrée doit être donnée sur l'entrée standard, et la solution sera imprimée sur la sortie standard; exemple:la source
Café-script 1 ligne
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
Voici la version plus grande avec un exemple d'utilisation :
la source
solve
, en supprimant beaucoup d'espace (je sais que c'est important, mais dans de nombreux endroits, il pourrait être supprimé), en utilisant des symboles au lieu de mots (comme!=
au lieu deisnt
), en utilisant l'indentation au lieu d'unthen
mot-clé, en remplaçant[0...9]
par[0..8]
.Clojure - 480 octets
La taille a explosé, mais au moins c'est un joli chiffre. Je pense que cela pourrait être beaucoup amélioré en utilisant uniquement le vecteur 1D. Quoi qu'il en soit, le cas de test prend un peu moins de quatre secondes sur mon ordinateur portable. J'ai pensé qu'il serait approprié de définir une fonction, car c'est un langage fonctionnel après tout.
Exemples:
Une version légèrement non golfée (et plus jolie):
la source
PowerShell ,
244242218215 octetsEssayez-le en ligne!
Le script trouve toutes les solutions pour un sudoku.
Déroulé:
Cas de test:
la source
D (322 caractères)
Pour chaque carré non résolu, il crée un tableau d'options disponibles, puis passe en boucle dessus.
avec espace:
la source
Perl (195 caractères)
Tout le mérite revient au créateur ici , et l'explication peut également être trouvée là-bas.
la source
J, 94 octets
Fonctionne exactement de la même manière que la version K, à savoir avec un BFS (il doit donc afficher toutes les solutions). Il imprime des espaces entre les chiffres de sortie, mais le programme K aussi. Je ne compte pas «s =:» car il s'agit simplement de nommer la fonction (tout comme je ne compterais pas le nom de fichier dans une autre langue).
la source