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
fonte
Respostas:
Braquilog , 34 bytes
Experimente online!
Como é muito lento, o caso de teste no TIO é 4x4. Atualmente, estou executando o caso de teste 6x6 no meu computador para ver quanto tempo leva.
Isso leva uma lista de listas como entrada. Os valores desconhecidos devem ser indicados com variáveis, ou seja, com todas as letras maiúsculas (e todas devem ser diferentes, caso contrário, você indicaria que algumas células devem ter o mesmo valor)
Explicação
Nós restringimos os valores a serem inseridos
{0,1}
, depois tentamos instanciações das variáveis até que se respeite todas as três regras. É por isso que isso é tão lento (porque tentará todos eles até encontrar um; e, nesse caso, o Brachylog não é implementado suficientemente bem para que restrições possam ser impostas antes de tentar uma possível matriz).fonte
A
throughY
(com oZ
parâmetro output). Será que ela continue comAA
,AB
, etc?AA
é uma variável eKEVINCRUIJSSEN
também é uma variável.JavaScript (ES6),
274270 bytesRecebe a entrada como uma matriz 2D, onde as células vazias são marcadas com
2
. Imprime todas as soluções possíveis no console.Como funciona
A primeira parte do código usa a
M()
função para verificar a validade da placa atual, horizontal e verticalmente.Ele mapeia uma linha ou coluna completa para a sequência s . Este é realmente um array coagido a uma string, assim parece
"1,2,2,0,2,2"
.Usa:
/(0|1),\1,\1/
para detectar 3 ou mais dígitos idênticos consecutivos.Se o fórum for inválido, paramos imediatamente. Se o quadro for válido e completo, imprimi-lo no console. Caso contrário, a segunda parte das tentativas de código para substituir cada 2 quer com um de zero ou um um com chamadas recursivas:
Demo
Mostrar snippet de código
fonte
Geléia ,
5351 bytesRecebe uma lista de listas representando a grade, contendo
0
,1
e2
(os espaços). Retorna uma lista de listas de listas, cada lista de listas está no mesmo formato (embora sem2
s) e representa uma possível solução para a entrada.Experimente online! (isso não executará nenhum dos casos de teste da pergunta devido a limitações de memória - todas as 2grades do nSpaces são criadas como uma lista de listas de números inteiros - mas coloquei um caso relativamente robusto com uma única solução). O rodapé separa e formata as grades.
Método de força bruta pura - implementa as regras e as verifica para cada grade que pode ser formada substituindo qualquer um dos
2
s por1
s ou0
s.fonte