Desafío:
Dado un tablero de Sudoku en la entrada estándar, encuentre el número mínimo de números agregados para que el tablero sea único.
Detalles / Reglas:
La entrada tiene el siguiente formato (todo el espacio en blanco es significativo)
516|827|943 278|394|615 349|615|872 ---+---+--- 98 |4 2|156 465|189|237 12 |5 6|489 ---+---+--- 892|743|561 634|951|728 751|268|394
La salida está formateada con un número por línea, formateada como
(x,y):z
: x e y comienzan desde uno en la parte superior izquierda y aumentan hacia abajo y hacia la derecha; z es el número que se agregará.- En este caso, éstos serían todas las salidas válidas:
(3,4):3
,(3,4):7
,(5,4):3
,(5,4):7
,(3,6):3
,(3,6):7
,(5,6):3
, y(5,6):7
, como cualquiera de éstas permitiría a la junta que hay que resolver.
- En este caso, éstos serían todas las salidas válidas:
- Si se ingresa un tablero de Sudoku único / resuelto, el programa no debe imprimir nada, ni siquiera una nueva línea.
- El programa debería ejecutarse en menos de una hora para cualquier tablero (sugiero probar usando un tablero completamente en blanco, o un tablero con un número aleatorio en él ...).
Puntuación:
- Tome el tamaño total del código (en golf) en caracteres, incluidos todos los espacios en blanco ...
Bonificaciones:
Tamaño de código 1/2 : si el programa imprime un solo signo de exclamación y se detiene al tener un tablero sin soluciones ingresadas.
Tamaño de código 1/2 : si el programa imprime dos signos de exclamación y se detiene al ingresar un tablero con una contradicción interna (dos números iguales en la misma fila / columna / cuadrado).
Respuestas:
Brachylog , 245 bytes / 2 = 122.5
(Tenga en cuenta que debe usar la versión del idioma a partir de esta confirmación . Este código necesitaría algunos pequeños cambios para que funcione correctamente en las siguientes versiones de Brachylog)
Esto se imprime
"!!"
si la placa dada tiene contradicciones internas (esto lleva unos segundos en ese caso, sin embargo, en TIO, así que sea paciente).No estoy seguro de entender el primer bono correctamente, así que no lo estoy abordando.
Obviamente, esto no es competitivo ya que el lenguaje es mucho más reciente que el desafío, sin embargo, dado que no hay otras respuestas, no estoy seguro de que esto importe mucho ...
Explicación
Predicado principal:
Predicado 1: elimine todos los "
|
" en líneas, transforme el---+---+---
en-
para eliminarlos despuésPredicado 2: Convierta un carácter en un entero o, si está en blanco, en una variable entre 1 y 9.
Predicado 3: Imponga que todos los valores de la lista de celdas de entrada deben ser distintos
Predicado 4: aplique la restricción de distinción a los valores en bloques de 3 * 3
Predicado 5:
Predicado 6: Asigne valores que satisfagan las restricciones a un subconjunto de celdas en blanco, luego con esos valores solo hay una solución para el tablero.
Predicado 7: transforma el tablero de modo que cada celda ahora sea en
[V:X:Y]
lugar de soloV
(el valor).Predicado 8: transforma una línea tal que cada celda es ahora
[V:X]
.Predicado 9: recupera los valores de las celdas
Predicado 10: agregue la longitud de un subconjunto al comienzo
Predicado 11: Imprimir una celda
fuente