Desafio:
Dado um quadro de Sudoku na entrada padrão, encontre o número mínimo de números adicionados para tornar o quadro único.
Regras / Específicos:
A entrada está formatada da seguinte forma (todo o espaço em branco é 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
A saída é formatada com um número por linha, formatada como
(x,y):z
- x e y começam de um no canto superior esquerdo e aumentam para baixo e para a direita; z é o número a ser adicionado.- Neste caso, estes seriam todos saídas válidas:
(3,4):3
,(3,4):7
,(5,4):3
,(5,4):7
,(3,6):3
,(3,6):7
,(5,6):3
, e(5,6):7
, como qualquer um deles permitiria que a placa para ser resolvido.
- Neste caso, estes seriam todos saídas válidas:
- Se for inserido um quadro de Sudoku exclusivo / resolvido, o programa não deverá imprimir nada, nem mesmo uma nova linha.
- O programa deve ser executado em menos de uma hora para qualquer placa (sugiro testar usando uma placa totalmente em branco ou uma placa com um número aleatório ...).
Pontuação:
- Pegue seu tamanho total de código (em golf) em caracteres, incluindo todos os espaços em branco ...
Bônus:
1/2 tamanho do código : se o programa imprimir um único ponto de exclamação e parar após ter uma placa sem soluções inseridas.
1/2 tamanho do código : Se o programa imprimir dois pontos de exclamação e parar após inserir uma placa com uma contradição interna (dois números iguais na mesma linha / coluna / quadrado).
Respostas:
Braquilog , 245 bytes / 2 = 122,5
(Observe que você deve usar a versão do idioma a partir deste commit . Este código precisaria de algumas alterações para que funcione corretamente nas seguintes versões do Brachylog)
Isso é impresso
"!!"
se o quadro fornecido tiver contradições internas (isso leva alguns segundos, no entanto, no TIO, portanto, seja paciente).Não sei se entendi o primeiro bônus corretamente, por isso não estou tratando dele.
Obviamente, isso não é competitivo, já que o idioma é muito mais recente que o desafio, no entanto, como não há outras respostas, não tenho certeza se isso importa muito ...
Explicação
Predicado principal:
Predicado 1: remova tudo "
|
" nas linhas, transforme---+---+---
em-
para removê-las depoisPredicado 2: converta um caractere para um número inteiro ou, se estiver em branco, em uma variável entre 1 e 9.
Predicado 3: imponha que todos os valores da lista de entrada de células devam ser distintos
Predicado 4: aplique a restrição de distinção aos valores em 3 * 3 blocos
Predicado 5:
Predicado 6: Atribua valores que satisfaçam as restrições a um subconjunto das células em branco; então, com esses valores, haverá apenas uma solução para o quadro.
Predicado 7: transforma a placa de modo que cada célula seja agora e
[V:X:Y]
não apenasV
(o valor).Predicado 8: transforma uma linha de modo que cada célula esteja agora
[V:X]
.Predicado 9: recuperar os valores das células
Predicado 10: anexar o comprimento de um subconjunto no início dele
Predicado 11: Imprimir uma célula
fonte