Isenção de responsabilidade: a história contada nesta pergunta é totalmente fictícia e inventada apenas com o objetivo de fornecer uma introdução.
Sou um fazendeiro malvado e, para aumentar o preço do trigo na minha região, decidi queimar os campos de todos os fazendeiros à minha volta. Eu realmente gostaria de ver os campos pegando fogo (para que eu possa usar minha risada maligna e esfregar minhas mãos com alegria), mas também não quero ser pego assistindo, então preciso que você simule o campo sendo incinerado para mim.
Sua tarefa:
Escreva um programa ou função que tome como entrada um campo e retorne os estágios dele até que todo o campo fique cinza. Uma seção específica do campo em chamas é representada por um número inteiro que representa a intensidade da chama. Um incêndio começa em "1" e passa para "2" e depois "3" e assim por diante. Quando o fogo atinge "4", ele captura as áreas adjacentes diretamente (não na diagonal) que são inflamáveis. Quando atinge "8", queima na próxima iteração e se transforma em cinza, representada por um "A". Quando uma área ainda não foi tocada pelo fogo, ela é representada por um "0". Por exemplo, se o campo estiver assim:
100
000
Seu programa deve gerar o seguinte:
100
000
200
000
300
000
410
100
520
200
630
300
741
410
852
520
A63
630
A74
741
A85
852
AA6
A63
AA7
A74
AA8
A85
AAA
AA6
AAA
AA7
AAA
AA8
AAA
AAA
Se desejar, você pode substituir os símbolos acima por qualquer conjunto de símbolos que escolher, desde que sejam consistentes e distintos um do outro.
Entrada:
A posição inicial do campo, de qualquer forma padrão, como uma sequência delimitada por linhas novas, como acima.
Saída:
O campo em cada iteração à medida que é gravado, como uma matriz ou como uma sequência delimitada por algum caractere.
Casos de teste:
0301
000A
555
|
v
0301
000A
555
1412
010A
666
2523
020A
777
3634
030A
888
4745
141A
AAA
5856
252A
AAA
6A67
363A
AAA
7A78
474A
AAA
8A8A
585A
AAA
AAAA
6A6A
AAA
AAAA
7A7A
AAA
AAAA
8A8A
AAA
AAAA
AAAA
AAA
Pontuação:
Isso é código-golfe , a menor pontuação em bytes ganha!
fonte
Respostas:
APL (Dyalog) , 52 bytes *
Assume o
⎕IO←0
padrão em muitos sistemas. Toma campo usando 0 para slots vazios, 1 para campo não queima, 2 para fogo novo, 5 para espalhar fogo e 10 para cinzas. A entrada deve ter pelo menos 3 × 3, o que não é um problema, pois linhas e colunas adicionais podem ser preenchidas com zeros (espaços no formato do OP).Experimente online!
Meu formato dificulta a verificação da correção, então aqui está uma versão com pré e pós-processamento adicionados para traduzir de e para o formato do OP.
⍣{
…}
Repita até:⍺
a próxima geração≡
é idêntico a⎕←⍵
a geração atual, gerada{
…}⌺3 3
Substitua cada célula pelo resultado dessa função aplicada ao bairro de Moore:,⍵
desviar (achatar) o argumento; fornece lista de nove elementosr←
atribuir a r4⊃
escolha o quarto elemento; o centro, ou seja, o valor original da célulac←
atribuir a c1=
é igual a isso?:
Se sim, então:⍳2
primeiro a Ɩ ntegers; 0 19⍴
r eshape no comprimento nove; 0 1 0 1 0 1 0 1 0r/⍨
use isso para filtrar r (isso obtém apenas os vizinhos ortogonais)4∊
quatro é um membro disso? (ou seja, haverá cinco na próxima geração?)1+
Adicione um; 1 se não pegou fogo ou 2 se pegou fogo⋄
caso contrário (ou seja, o valor atual é 0 ou ≥ 2)×c
o signum de cc+
c mais que (isto é, aumentar em um se estiver pegando fogo)10⌊
mínimo de dez e que (como as cinzas não queimam)* No Dyalog Classic, use em
⎕U233A
vez de⌺
.fonte
fire '0A000\n0A0A0\n0A0A0\n000A1'
funciona perfeitamente no formatado, mas não consigo obter um equivalente para trabalhar com o primeiro link. Provavelmente estou fazendo algo errado. Isso não funciona para mim:f ↑(0 0 0)(0 1 0)(0 0 0)
Python 3 , 232 bytes
Experimente online!
-3 bytes graças ao officialaimm, mesclando o outro lambda em
f
(parece confuso, mas economiza bytes e é com isso que nos preocupamos)-8 bytes graças ao Sr. Xoder
-26 bytes graças a ovs
-6 bytes graças a ppperry
fonte
JavaScript (ES6),
217210207204193192190 bytesEconomizou 2 bytes graças à sugestão de @ Shaggy de usar
9
comoA
.Usa em
9
vez deA
. Entrada como uma matriz 2D de números inteiros. Saída como uma matriz de tais matrizes.fonte
9
vez deA
?Simulando o mundo (em Emoji) , 1407 bytes?
Você não gosta de usar uma explicação explorável como linguagem de programação? A desvantagem disso é que geralmente não há um programa muito bem definido; portanto, neste caso, estou usando o JSON que ele exporta. (se você tiver alguma idéia melhor, me avise)
Experimente aqui ou aqui:
fonte
Retina ,
1039688 bytesExperimente online!Usa
9
para cinzas; isso pode ser alterado a um custo de 4 bytes usandoT`1-8`2-8A
. Editar: salvou 6 bytes graças a @MartinEnder. Explicação:Adicione um separador para que as saídas não se colidam. (Também ajuda na correspondência abaixo.)
Não imprima o estado final (que é o mesmo que o estado anterior que já foi impresso). Repita até que o passe não mude de estado. Imprima o estado atual antes de cada passagem.
Avance a intensidade de todo o fogo.
Campos apagados claros, conforme apropriado. Sub-explicação:
Meça o número da coluna desse campo apagado.
Corresponder ao campo apagado.
Procure um campo adequado à direita.
Procure um campo adequado na mesma coluna (usando um grupo de equilíbrio) na linha abaixo. Observe que, se a entrada puder ser garantida retangular, isso poderá ser simplificado para
|.*¶(?>(?<-1>.)*)4
para uma economia de 3 bytes.Procure um campo adequado à esquerda. (Como estamos olhando do lado direito do campo, também vemos o campo apagado.)
Procure um campo adequado na mesma coluna na linha acima. Como essa é uma correspondência retroativa e, portanto, da direita para a esquerda, a condição do grupo de balanceamento deve aparecer antes das colunas correspondentes ao grupo de balanceamento.
fonte
Perl 5 , 365 bytes
Experimente online!
Usa '9' em vez de 'A' para indicar um local queimado.
Explicado
fonte
Haskell , 162 bytes
Experimente online! Uso:
h
pega um campo como uma lista de linhas e retorna uma lista de campos. Um campo não queimado é indicado por@
e cinza por9
, os diferentes incêndios são os dígitos1
para8
.f
gerencia a propagação do fogo da esquerda para a direita, substituindo todos os@
campos não queimados que são adequados para um3
campo em chamas0
.i
incrementa cada dígito desde que seja menor que9
.g
aplicaf
- se a cada linha, depois reverte a linha, aplicaf
- se novamente e reverte para trás. Em seguida, a lista de linhas é transposta e novamente em cada linha e seu inversof
é aplicado.h
aplicag
- se à entrada até que ela não seja mais alterada e colete os resultados.fonte
_
. Se isso não for aceitável, receio ter que excluir a resposta, porque ela está centrada no uso detranspose
e não vejo uma maneira de corrigi-la facilmente sem a introdução de toneladas de bytes.C (GCC) ,
308305299297295291 bytesEste programa define uma função que recebe duas entradas, um ponteiro para uma matriz de seqüências precedidas por seu comprimento, conforme permitido por este padrão de E / S. Saídas para STDOUT com uma nova linha à direita.
Experimente online!
fonte
80
.A
s, mas aparentemente eu assumi errado. De qualquer forma, obrigado pela informação. Está consertado agora.Oitava,
7269 bytesA entrada é tomada como uma matriz 2D de números e pontos vazios marcados com
Inf
.'A'
foi substituído por9
. Resultados intermediários (como matriz de números) impressos implicitamente.Experimente online!
Explicação:
Em um loop, a função
imdilate
(dilatação morfológica da imagem) do pacote de imagens é usada para simular a propagação do fogo.fonte
[0 Inf 0 0 0;0 Inf 0 Inf 0;0 Inf 0 Inf 0;0 0 0 Inf 1]
- Muito bomPython 2 , 325 bytes
f
recebe a entrada como uma matriz 2D de números inteiros e pontos vazios marcados com''
.'A'
foi substituído por9
. A função gera um gerador de todos os campos ao longo do tempo no mesmo formato.Experimente online!
fonte
Oitava , 212 bytes
Para executar, especifique uma matriz de caracteres como:
... então faça:
Explicação do código a seguir ...
Experimente online!
Nota: Tentei executar esse código com tio.run , mas não obtive nenhuma saída. Eu tive que usar outro serviço.
fonte
PHP,
226 212 210 209 185177 bytesrecebe entrada com uma nova linha à direita de um arquivo chamado
m
;9
para cinzas.Corra com
-nr
ou experimente online .primeira abordagem: PHP 7.0, 209 bytes
leva de entrada com uma nova linha de fuga de um arquivo chamado
m
.Corra com
-nr
ou experimente online .Notas da versão do PHP (para abordagem antiga)
$c-4|
por$g[$y+$p=[1,0,-1][$a]][$q+=$x]!="0"||$g[$y+$p][$q]=1;
[1,0,-1][$a]
por$a%2*~-($a&2)
a&$c
por""<$c
,+$c
por0<$c
e$c-4
com$c!=4
fonte
Oitava,
419312bytesExperimente online!
Esta é a minha versão que funciona, então agora eu ainda preciso jogar golfe. Eu acho que pode ser muito mais curto se eu encontrar uma maneira de encontrar os índices dos 4 em uma matriz, mas não sei como.
PS: A é um 9 no meu código.
fonte
endif
endfor
eendwhile
você pode escreverend
Estêncil (modo
∊
) , 22 bytesExperimente online!
Assim como na entrada de teste, use números inteiros separados por espaços para
0
-8
,' '
para blank e'A'
forA
. Lembre-se de adicionar espaços em branco à direita também.fonte