Introdução
Regras do quebra-cabeça:
O quebra-cabeça Binário (também conhecido como Takuzu ou Subiku) é muito simples de entender e possui apenas algumas regras:
Como o nome do jogo é binário, é bastante óbvio, mas você só pode preencher zeros e uns.
- Não mais que dois do mesmo dígito podem ser vertical ou horizontalmente adjacentes um ao outro
- Cada linha e cada coluna deve conter uma quantidade igual de zeros e uns (isso significa implicitamente que todo jogo binário sempre terá dimensões iguais).
- Pode não haver linhas duplicadas nem colunas duplicadas (com exatamente a mesma ordem de zeros e uns).
Você pode jogar o jogo em www.binarypuzzle.com, se quiser.
Táticas:
De acordo com a regra 1, sempre podemos preencher um dígito se:
- Já existem dois do mesmo dígito vertical ou horizontalmente adjacentes um ao outro; nesse caso, podemos preencher o dígito oposto em ambos os lados. Ou seja, .11...
→ 0110..
.
- Existem dois dígitos iguais na vertical ou na horizontal, com apenas um espaço entre eles. Ou seja, .1.1..
→.101..
De acordo com a regra 1, quando restam três lacunas e não podemos ter três adjacentes do mesmo dígito, podemos preencher uma das lacunas. Ou seja, .0.1.0
→ 10.1.0
(Ainda temos que preencher dois, e não podemos ter três adjacentes no meio, portanto a primeira lacuna deve ser a 1
.)
De acordo com a regra 2, sempre podemos preencher as lacunas restantes em uma linha ou coluna se metade delas já estiver preenchida com o dígito oposto. Ou seja, .1.011
→010011
De acordo com a regra 3, sempre podemos preencher os dígitos opostos se restarem apenas dois para resolver em uma linha igualmente ordenada. Ou seja, 101100 & 1..100
→101100 & 110100
De acordo com a regra 3, às vezes podemos preencher uma lacuna quando restam três lacunas em uma linha igualmente ordenada. Ou seja, 010011 & .1.01.
→ 010011 & .1.010
(Aqui não podemos preencher um 1
no final, porque isso significa que precisamos preencher zeros nas outras duas lacunas, tornando as duas linhas iguais em ordem.)
Exemplo:
Começamos com a seguinte grade 6x6 com alguns e zeros preenchidos (e os pontos são lacunas que ainda precisamos preencher):
.1....
.10.0.
1.11..
.1....
...1.0
......
Devido às regras 1 e 2, podemos preencher estes dígitos:
.1.01.
.1010.
101100
010011
.0.1.0
.010..
Devido à regra 1, podemos preencher um 1 na linha 5, coluna 1:
.1.01.
.1010.
101100
010011
10.1.0
.010..
De acordo com a regra 3, podemos preencher um 0 na linha 1, coluna 6 (ao observar a linha 4):
.1.010
.1010.
101100
010011
10.1.0
.010..
Agora podemos continuar preenchendo lacunas com dígitos devido às regras 1 e 2:
.1.010
010101
101100
010011
10.1.0
.010.1
Agora podemos concluir a linha 5 devido à regra 3 (ao olhar para a linha 3):
.1.010
010101
101100
010011
100110
.010.1
E então podemos terminar o quebra-cabeça devido às regras 1 e 2:
011010
010101
101100
010011
100110
101001
Desafio:
O desafio é simples: dada a grade inicial, produza o quebra-cabeça resolvido.
NOTA: Você não precisa implementar as regras acima. É claro que você pode, e isso deve lhe dar dicas sobre como implementar esse desafio, mas forçar brutalmente a solução com as regras em mente é ótimo.
A solução é sua, mas o desafio é produzir o quebra-cabeça resolvido.
Regras do desafio:
- O formato de entrada e saída da grade é flexível, mas indique o que você usa. (Ou seja, matriz de bytes 2D; String com novas linhas; etc.)
- Isso acima também se aplica aos caracteres usados. No exemplo que eu usei
01.
, mas se você quiser, pode usarABx
. Por favor, indique qual formato de entrada / saída e caracteres que você usou. - Você pode assumir que apenas os seguintes tamanhos de grade serão usados
6x6
:;8x8
;10x10
;12x12
;14x14
;16x16
.
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código.
- Além disso, adicione uma explicação, se necessário.
Casos de teste:
Os pontos são adicionados apenas para facilitar a leitura, fique à vontade para usar espaços ou qualquer outra coisa que você preferir para lacunas. O formato de saída e é flexível.
Input:
1..0..
..00.1
.00..1
......
00.1..
.1..00
Output:
101010
010011
100101
011010
001101
110100
Input:
.1....
.10.0.
1.11..
.1....
...1.0
......
Output:
011010
010101
101100
010011
100110
101001
Input:
.......1..
.00..0..1.
.0..1..0.0
..1...1...
1.1......1
.......1..
.0..1...0.
....11...0
.0.0..1..0
0...0...1.
Output:
0110010101
1001100110
1001101010
0110011001
1010100101
0101010110
1001101001
0110110100
1010011010
0101001011