Como amanhã é dia 4 de maio, aqui está uma pequena postagem com tema de Guerra nas Estrelas para prepará-lo mentalmente para todas as piadas ruins que virão amanhã.
BACKSTORY
Durante uma sessão do senado galáctico, todos os senadores estão sentados em uma n*n
grade. Um surto repentino de gripe JarJar (que dura para sempre e faz com que os infectados falem como JarJar Binks) faz com que alguns senadores sejam infectados.
Aqui está um exemplo com uma 6*6
grade onde X
estão os senadores infectados, a lista correspondente é [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[0,5]]
:
Depois disso, a infecção começa a se espalhar passo a passo. Dois senadores são adjacentes se eles compartilham uma borda inteira na grade (ou seja, superior, inferior, direita, esquerda), o que significa que excluímos diagonais.
Podemos concluir que um senador pode estar adjacente a 2,3 ou 4 outros senadores e reivindicar as seguintes regras para a infecção:
- Um senador que foi infectado permanece infectado para sempre
- Um senador é infectado em uma etapa se estiver adjacente a 2 ou mais senadores infectados na etapa anterior
Aqui está um exemplo com a grade anterior, que mostra os 2 primeiros passos da infecção:
Após os próximos passos, todo o Senado será infectado
SUA TAREFA
Seu código não precisa manipular entradas inválidas, como uma lista maior n*n
ou coordenadas que não são distintas.
Seu código terá como entrada uma lista de pares de números inteiros (ou uma grade binária ou qualquer outro formato adequado ao seu idioma) e um número inteiro n
(que pode ser desnecessário se você usar outro formato que não uma lista), por exemplo:
8 [[1,2],[1,1],[7,4],[2,7],[4,3]]
n sendo o lado da grade, o que significa que a grade será uma grade * n, e a lista de pares de números inteiros sendo as coordenadas das células dos senadores infectados inicialmente.
O canto inferior esquerdo da grade é [0,0] e o canto superior direito é [n-1, n-1]. O canto superior esquerdo é [0, n-1].
Seu código deve gerar um número inteiro:
-1
ou um valor falso ou um erro se a grade inteira nunca for totalmente infectada ou o número mínimo de etapas necessárias para infectar a grade inteira
Casos de teste
6 [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]] => 7
4 [[1,1][0,3][1,0][3,0][3,3]] => 9
Lembre-se de que isso é código-golfe ; portanto, a resposta mais curta em bytes vence!
n
? Existe um valor máximo?CellularAutomaton
...Respostas:
MATL,
2928 bytesA entrada está na forma de uma matriz 2D de 1 e 0
Experimente no MATL Online
Explicação
fonte
tn:"tlY6Z+1>Z|t?x@D.]]N?xl_
? (Eu não testei muito). Se todos os elementos forem 1 em algum momento, exiba o índice do loop imediatamente e exclua a pilha. No final do loop, se a pilha não estiver vazia, exclua e empurre-1
APL (Dyalog 16.0), 54 caracteres ou 60 bytes
Pega a matriz fechada como argumento, retorna o número da etapa que completa a infecção, ou seja, 1 = já está totalmente infectado. 0 = não se espalha totalmente, que é apenas 1 + os números do OP.
54 caracteres (Unicode):
60 bytes (clássico):
⌺
é equivalente a⎕U233A
Execução dos exemplos:
Os passos são os seguintes:
fonte
Pitão , 49 bytes
Conjunto de teste .
Usa indexação 1 para a saída.
fonte
Python, 231 bytes
Isso gera um erro se não for possível.
Experimente online!
fonte
0/0
salva dois bytes deraise
. Talvez1/(g!=h)
funcionaria? (o todo tambémwhile
pode ser incorporado).q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0
salva 12. Você pode remover o espaço entre (a)1
efor
(b)]
efor
também.JavaScript (ES6), 132 bytes
Onde
\n
representa o caractere literal de nova linha. Toma de entrada como uma série de0
s e1
s em uma matriz delimitado por nova linha. RetornaNaN
se a grade nunca será totalmente infectada.fonte