(Existem perguntas relacionadas sobre arquivos de areia infinitos e a localização de elementos de identidade de arquivos de areia .)
Dada uma matriz de números inteiros não negativos, retorne uma matriz das mesmas dimensões, mas tombou :
- Se a matriz não contiver valores maiores que 4, retorne-a.
- Cada "célula" maior que 3 é reduzida em 4 e todas as células vizinhas diretamente (acima, abaixo, esquerda e direita) são incrementadas, se existirem.
- GOTO 1.
Exemplos:
0 1 0 0 2 0
2 4 0 -> 3 0 1
0 0 3 0 1 3
1 2 3 2 3 4 2 5 1 4 1 2 0 3 3 0 3 3 0 3 3
4 5 6 -> 2 4 4 -> 4 2 3 -> 0 5 4 -> 3 2 1 -> 3 3 1 -> 3 3 2
7 8 9 5 7 7 2 6 5 4 3 2 0 5 3 1 1 4 1 2 0
(Você só precisa retornar o resultado final. O caminho em que você o alcança pode diferir do mostrado aqui: não importa em que ordem você executa as operações de tombamento, todos eles levam ao mesmo resultado.)
Para uma explicação mais profunda e alguma motivação, consulte este vídeo do Numberphile ou o artigo da Wikipedia sobre o modelo de pilha de areia abeliana .
Regras:
- Você pode receber entrada e saída de qualquer uma das maneiras padrão
- As brechas são proibidas
- Entrada e saída podem ser:
- uma lista aninhada:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- uma lista simples:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
e a forma - algum tipo de matriz nativa
- uma string, por exemplo
1 2 3\n4 5 6\n7 8 9
- ou qualquer outra coisa que funcione no seu idioma.
- uma lista aninhada:
- Entrada e saída devem estar na mesma forma
- A entrada pode conter números maiores que os mostrados aqui, mas o tamanho pode estar limitado pelos limites do seu idioma (equivalentes MAXINT, se aplicável)
- A matriz pode ter qualquer formato (por exemplo, 1x1, 2x2, 3x3, 4x4, 2x7, 11x3, ...)
- Você não precisa lidar com o caso em que a forma é 0xN ou Nx0.
Casos de teste
[[2, 5, 4], [8, 6, 4], [1, 2, 3]] -> [[3, 3, 0], [1, 2, 2], [1, 3, 2]]
[[0, 0, 2], [1, 3, 3], [0, 0, 0]] -> [[0, 0, 2], [1, 3, 3], [0, 0, 0]]
[[9, 9, 9], [9, 9, 9], [9, 9, 9]] -> [[1, 3, 1], [3, 1, 3], [1, 3, 1]]
[[4, 5], [2, 3]] -> [[2, 3], [0, 1]]
[[2, 3, 5], [2, 2, 0]] -> [[3, 0, 2], [2, 3, 1]]
[[7]] -> [[3]]
Este é o codegolf , o código mais curto (por idioma) vence.
code-golf
array-manipulation
cellular-automata
L3viathan
fonte
fonte
Respostas:
MATL , 17 bytes
Experimente no MATL Online! Ou verifique todos os casos de teste .
Explicação
O programa itera quantas vezes for a soma da entrada. Esse é um limite superior frouxo no número necessário de iterações.
Para cada iteração,
3
são detectadas entradas na matriz de pilha de areia excedentes , fornecendo uma matriz de1
e0
, que é convoluída com a máscara de 4 vizinhos. As entradas que excedem3
a matriz de pilha de areia são reduzidas4
e o resultado da convolução é adicionado.Nas últimas iterações, nas quais a matriz de pilha de areia não possui números excedentes
3
, os zeros são subtraídos e adicionados a ela, portanto, não são afetados.fonte
Mathematica, 65 bytes
Explicação
Transforme a entrada repetidamente, derrubando todas as pilhas maiores que 3. Esse processo para automaticamente quando a transformação falha na alteração da matriz (ou seja, quando não existem mais pilhas grandes). Na expressão a seguir, a matriz é chamada
s
.Crie uma matriz que tenha um
1
sempre que a matriz atual tiver um4
ou maior e um zero caso contrário. Esta é essencialmente uma máscara que indica quais pilhas precisam ser derrubadas. Ligue para a máscarax
.Primeiro, calculamos o número de areia que é adicionada a cada pilha devido a pilhas vizinhas tombadas. Isso é feito com uma convolução da seguinte matriz
x
:Essencialmente, ele adiciona um à célula atual para cada um de seus vizinhos von-Neumann na máscara.
Adicionamos o resultado anterior
s
e subtraímos quatro vezes a máscara para reduzir as pilhas derrubadas.fonte
Oitava, 65 bytes
Isso não parece muito bom, devo estar perdendo alguns truques ...
fonte
input(0)
?>> version ans = 4.0.1
JavaScript (ES6),
10195 bytesPega a largura da matriz
w
e uma matriz de valoresa
na sintaxe de curry(w)(a)
. Retorna uma matriz de valores.Formatado e comentado
Casos de teste
Mostrar snippet de código
fonte
JavaScript (ES6),
118114104 bytesGuardado 2 bytes graças a @Neil
fonte
(i-=x)|y-j?i*i+
ajuda?a.find(...b.find(...c>3&&a.map(...)))&&f(a)
..map
não faz mutação ...f=a=>a.find((b,x)=>b.find((c,y)=>c>3&&a.map(b=>b.map((_,j)=>b[j]+=x|(j-=y)?x*x+j*j==1:-4)&x--)))&&f(a)
C ++,
261258250 bytesPega a entrada como referência a um vetor de vetores e a modifica diretamente.
Experimente online!
fonte