Mi intento de plantear esta pregunta , pero con un criterio de resolución más objetivo.
Su tarea es construir un programa o función que tome una cuadrícula de Sudoku resuelta S
en el formato que elija e intente generar una cuadrícula de problemas con la menor cantidad de pistas posible que tenga S
como solución única. (No importa qué método S
sea la solución única, incluida la fuerza bruta, siempre que la solución sea demostrablemente única).
Su programa se puntuará ejecutándolo a través de un conjunto de 100,000 cuadrículas de solución que se encuentran en este archivo (7,82 MB de descarga) y sumando el número de pistas en las 100,000 cuadrículas problemáticas que produce su solución.
Las soluciones de Sudoku en el archivo de prueba anterior se expresan como una cadena de 81 caracteres, de izquierda a derecha, luego de arriba a abajo. El código requerido para convertir la entrada en el archivo de prueba en una solución utilizable no contará para el recuento de bytes de su solución.
Como en mi desafío Flood Paint , su programa debe producir una salida válida para que todos los 100,000 rompecabezas se consideren una solución válida. El programa que genera la menor cantidad de pistas totales para los 100,000 casos de prueba es el ganador, con un código más corto que rompe un empate.
Marcador actual:
Respuestas:
C - 2,361,024
2,509,949pistasElimine las pistas a partir de la última celda si un solucionador de fuerza bruta encuentra solo una solución única.
Segundo intento: use la heurística para decidir en qué orden eliminar las pistas en lugar de comenzar desde el último. Esto hace que el código se ejecute mucho más lento (20 minutos en lugar de 2 para calcular el resultado). Podría hacer que el solucionador sea más rápido, experimentar con diferentes heurísticas, pero por ahora funcionará.
fuente
Python - 7,200,000 pistas
Como de costumbre, aquí hay una solución de referencia de último lugar:
La eliminación de la fila inferior de números probablemente deja el rompecabezas solucionable en todos los casos, ya que cada columna todavía tiene 8 de 9 números llenos, y cada número en la fila inferior es simplemente el noveno número que queda en la columna.
Si algún contendiente serio logra anotar legalmente peor que este, me sorprenderé.
fuente
Python 2 - 6,000,000 pistas
Una solución simple que utiliza los 3 métodos comunes para resolver estos acertijos:
Esta función produce formatos de pista como este:
Esto siempre se puede resolver. Primero se resuelven las 4 partes de 3x3, luego las 8 columnas, luego las 9 filas.
fuente
PHP - 2,580,210 pistas
Esto primero elimina la última fila y columna, y la esquina inferior derecha de cada cuadro. Luego, trata de limpiar cada celda, ejecutando la placa a través de un solucionador simple después de cada cambio para garantizar que la placa aún pueda resolverse sin ambigüedades.
Gran parte del código a continuación fue modificado de una de mis respuestas anteriores .
printBoard
usa 0s para celdas vacías.fuente