Inspirado em /puzzling/24334/to-catch-a-thief
Você recebe uma grade n
por n
( n
ela própria é uma entrada opcional) preenchida com 0
s e 1
s (ou qualquer outro caractere de sua escolha). Seu objetivo é tornar todas as células iguais ( 0
ou 1
). Você pode fazer uma série de movimentos, conforme definido abaixo (observe a diferença no link Puzzling SE):
- Selecione uma célula.
- Cada célula na mesma linha e coluna (exceto a própria célula) é alterada para o seu oposto.
0
para1
e1
para0
.
Emita o número mínimo de movimentos necessários para concluir a tarefa. Se insolúvel, imprima qualquer coisa, exceto um número inteiro não negativo. O menor código vence.
Dados de amostra
1 0 0
0 0 0
0 0 0
-1
1 1 1
1 1 1
1 1 1
0
1 0 1
0 1 0
1 0 1
1
1 1 1 1
0 0 0 0
0 0 0 0
1 1 1 1
2
0 1 0 1
1 0 1 0
1 0 1 0
0 1 0 1
2
code-golf
grid
puzzle-solver
path-finding
ghosts_in_the_code
fonte
fonte
1000
(reorganizado como um quadrado, não importa como).Respostas:
Matlab 171 bytes
A entrada deve ser uma matriz 2D, então você chamaria assim
c([1,1,1,1;0,0,0,0;0,0,0,0;1,1,1,1])
(ponto-e-vírgula inicia uma nova linha). Esta função apenas força todos os movimentos possíveis, então obtemos um tempo de execução deO(2^(n^2))
.Como é feito
Isso é feito escolhendo-se todas as formas possíveis de preencher outra matriz do mesmo tamanho com um e zero, basicamente contando em binário, em que cada entrada da matriz representa uma certa potência de 2.
Depois realizamos os movimentos nessas células que são 1, isso é feito pela soma (mod 2) de uma convolução bidimensional com um vetor de tamanho 1xn e nx1.
Finalmente, decidimos se esses movimentos realmente produziram o resultado desejado, calculando o desvio padrão em todas as entradas. O desvio padrão é apenas zeros se todas as entradas forem iguais. E sempre que encontramos o resultado desejado, comparamos com o número de movimentos das soluções anteriores. A função retornará
inf
se o problema especificado não for solucionável.Matemática?
Na verdade, vale a pena notar que todos esses movimentos juntos geram um grupo abeliano! Se alguém realmente conseguir classificar esses grupos, informe-me.
Versão Golfed:
Versão completa (com a saída dos movimentos reais.)
fonte
Perl 5, 498 bytes
Isso aceita 'n' e o resultado desejado e gera a contagem, ou 'X' se não houver.
Por exemplo:
dá
2
. Só funcionará quando n ^ 2 <= 64, entãon <= 8
. Embora seja bem lento, mesmo com n tão baixo quanto 5. Ele cria uma matriz de ^ 3 bits e classifica uma matriz de 2 ^ (n ^ 2) de antemão, porque por que não ?Eu desperdicei alguns feeds de linha aqui para facilitar a leitura :
fonte