Ma tentative de poser cette question , mais avec un critère de résolution plus objectif.
Votre tâche consiste à créer un programme ou une fonction qui prend une grille de Sudoku résolue S
dans le format de votre choix et tente de générer une grille de problème avec le moins d'indices possible qui a S
pour solution unique. (Peu importe quelle méthode S
est la solution unique, y compris la force brute, tant que la solution est prouvée unique.)
Votre programme sera noté en l'exécutant à travers un ensemble de 100 000 grilles de solutions trouvées dans ce fichier (7,82 Mo de téléchargement) et en additionnant le nombre d'indices dans les 100 000 grilles de problèmes produites par votre solution.
Les solutions Sudoku du fichier de test ci-dessus sont exprimées sous la forme d'une chaîne de 81 caractères, de gauche à droite, puis de haut en bas. Le code requis pour transformer l'entrée du fichier de test en une solution utilisable ne comptera pas pour le nombre d'octets de votre solution.
Comme dans mon défi Flood Paint , votre programme doit réellement produire une sortie valide pour les 100 000 puzzles pour être considéré comme une solution valide. Le programme qui génère le moins d'indices au total pour les 100 000 cas de test est le gagnant, avec un code plus court qui rompt une égalité.
Tableau de bord actuel:
Réponses:
C - 2
3610242509949indicesSupprimez les indices à partir de la dernière cellule si un solveur de force brute ne trouve qu'une seule solution unique.
Deuxième essai: utilisez l'heuristique pour décider dans quel ordre supprimer les indices au lieu de partir du dernier. Cela rend le code exécuté beaucoup plus lentement (20 minutes au lieu de 2 pour calculer le résultat). Je pourrais rendre le solveur plus rapide, pour expérimenter différentes heuristiques, mais pour l'instant, cela suffira.
la source
Python - 7 200 000 indices
Comme d'habitude, voici une solution de référence de dernière place:
La suppression de la rangée inférieure de chiffres laisse prouvablement le casse-tête résolu dans tous les cas, car chaque colonne contient toujours 8 des 9 numéros, et chaque numéro de la rangée inférieure est simplement le neuvième numéro restant dans la colonne.
Si un concurrent sérieux réussit à obtenir légalement un score inférieur à celui-ci, je serai étonné.
la source
Python 2 - 6 000 000 d'indices
Une solution simple qui utilise les 3 méthodes courantes pour résoudre ces énigmes:
Cette fonction produit des formats d'indices comme celui-ci:
Cela peut toujours être résolu. Les 4 parties 3x3 sont résolues en premier, puis les 8 colonnes, puis les 9 lignes.
la source
PHP - 2 580 210 indices
Cela supprime d'abord la dernière ligne et colonne, et le coin inférieur droit de chaque boîte. Il essaie ensuite d'effacer chaque cellule, en exécutant la carte à travers un simple solveur après chaque changement pour garantir que la carte est toujours résolue sans ambiguïté.
Une grande partie du code ci-dessous a été modifié à partir de l' une de mes anciennes réponses .
printBoard
utilise 0 pour les cellules vides.la source