Para simular uma invasão de zumbis, comece com uma grade #
e representando o mapa:
## ##
### #
## ##
# ###
# ####
#
representa terra.representa água.
Os zumbis começam em um ponto no mapa ...
## ##
### #
## %#
# ###
# ####
... e espalhar. %
denota terra infectada por zumbis.
No entanto, zumbis não sabem nadar . Eles podem se mover pela terra da mesma maneira que um rei se move no xadrez - um quadrado em qualquer direção diagonal ou ortogonal:
!!!
!%!
!!!
No final da simulação, algumas terras serão infectadas com zumbis:
%% ##
%%% #
%% %%
% %%%
# %%%%
Sua tarefa é simular a invasão de zumbis. Escreva um programa (ou função) que tenha como entrada uma string representando o estado inicial da grade e dois números representando as coordenadas do zumbi inicial. O programa deve gerar (ou retornar) o estado final da invasão.
Especificações
- Seu programa pode imprimir uma nova linha opcional à direita.
- Você pode supor que a entrada esteja no formato correto (preenchido com espaços), com uma nova linha à direita opcional.
- Você pode assumir que o zumbi inicial começará em terra e não morrerá imediatamente.
- Isso é código-golfe , então a resposta mais curta (em bytes) vence.
- -100% de bônus se o seu código também puder resolver o Problema da Parada para máquinas de Turing arbitrárias.
- Seu programa deve lidar com larguras de placa de até 50 caracteres.
code-golf
ascii-art
simulation
Esolanging Fruit
fonte
fonte
Respostas:
APL (Dyalog) , 44 bytes
Experimente online!
Assume
⎕IO←0
.Argumento esquerdo: linha indexada em 0
r
de%, coluna indexada em 0c
de%:r c
argumento correto: matriz de caracteres
fonte
Kotlin,
283218 bytesLambda sem nome (com uma função aninhada, heh).
Golfe
Ungolfed
Economizou alguns bytes alternando para uma solução recursiva.
fonte
JavaScript (ES6), 144 bytes
Onde
\n
representa o caractere literal de nova linha. Leva coordenadas indexadas em 0.fonte
Befunge,
324323 bytesExperimente online!
Explicação
Implementar isso no Befunge foi um pouco complicado, porque estamos limitados a 80x25 caracteres de "memória", que devem ser compartilhados com o próprio código-fonte. O truque para ajustar um mapa de 50x50 nessa área era achatar o mapa 2D em uma matriz 1D com dois locais de mapa por byte. Esse array 1D é então agrupado em um array 2D novamente, para que possa caber na largura de 80 caracteres do campo de jogo Befunge.
O algoritmo de infecção começa convertendo as coordenadas iniciais em um deslocamento na matriz 1D que ele pressiona na pilha. O loop principal pega um valor da pilha e procura o estado do mapa para esse deslocamento. Se for terreno não infectado, será marcado como infectado e oito novas compensações serão colocadas na pilha (representando o terreno em toda a posição atual). Esse processo continua até que a pilha esteja vazia.
Para evitar ter que verificar valores fora do intervalo, o mapa é armazenado com uma borda de água de um caractere em torno de todas as bordas.
fonte
Pip , 59 bytes
Uma função que utiliza uma cadeia de linhas múltiplas, a linha do zumbi inicial (indexado 0) e a coluna do zumbi inicial (indexado 0). Experimente online!
Quão?
Como o Pip possui indexação cíclica (geralmente uma coisa boa, mas ruim para esse problema porque não queremos que as bordas do mapa sejam agrupadas), optei por uma solução de substituição de regex.
Ya@?n
localiza o índice da primeira nova linha (ou seja, a largura da grade) e o puxay
.(ac+b+b*Ya@?n):'%
depois de fazer o acima, calcula(width + 1) * row + col
, ou sejac+b+b*y
, e define o caractere nesse índice como%
.L2*#a
loops2*len(a)
vezes, o que nos fornece iterações suficientes para que o flood flood se propague completamente e garante que a contagem de iterações seja uniforme (isso é importante)..`#(.?.?.{`.y-1.`})?%`
constrói uma regex que corresponde a#
seguida por a%
, com 0, largura-1, largura ou largura + 1 caracteres no meio. (No.
início.
, o regex corresponde a novas linhas.) Esse regex corresponde a qualquer uma das seguintes configurações:aR ... '%.@>_
substitui correspondências dessa regex pelo caractere%
anexado a.
todos, exceto o primeiro caractere@>
da correspondência_
; em suma, substituindo o#
por%
.a:RV ...
reverte isso e o atribui de volta aa
. Nós revertemos porque o regex corresponde apenas#
antes%
na string, não depois; mas quando a string é invertida, after se torna before e podemos combiná-la na próxima iteração. É também por isso que o número de iterações deve ser uniforme.Após a conclusão do loop, simplesmente retornamos o valor modificado de
a
.fonte
TSQL, 267 bytes
Golfe:
Ungolfed:
Experimente
fonte
PHP,
209189188183 bytespode ser jogável
Correr com
php -r '<code>' '<grid>' <y> <x>
fonte
J, 152 bytes
Não muito bem treinada, tenho certeza de que há uma maneira de remover essas últimas estruturas de controle.
Implementa um algoritmo de preenchimento de inundação. A função g formata a entrada em uma matriz de caracteres antes de aplicar f.
Observe que as coordenadas são um pouco estranhas:
é o canto superior esquerdo. Aumentando a primeira coordenada:
Move a posição para baixo na direção y.
Além disso, as coordenadas são normais.
Exemplo:
fonte