Para simular una invasión zombie, comience con una cuadrícula de #
y representando el mapa:
## ##
### #
## ##
# ###
# ####
#
representa la tierrarepresenta el agua
Los zombies comienzan en un punto del mapa ...
## ##
### #
## %#
# ###
# ####
... y difundir. %
denota tierra infectada por zombies.
Sin embargo, los zombis no pueden nadar . Pueden moverse a través de la tierra de la misma manera que un rey se mueve en el ajedrez: un cuadrado en cualquier dirección diagonal u ortogonal:
!!!
!%!
!!!
Al final de la simulación, algunas tierras estarán infectadas con zombies:
%% ##
%%% #
%% %%
% %%%
# %%%%
Tu tarea es simular la invasión zombie. Escriba un programa (o función) que tome como entrada una cadena que represente el estado inicial de la cuadrícula y dos números que representen las coordenadas del zombi inicial. El programa debe generar (o devolver) el estado final de la invasión.
Especificaciones
- Su programa puede imprimir una nueva línea final opcional.
- Puede suponer que la entrada estará en el formato correcto (rellenado con espacios), con una nueva línea final opcional.
- Puedes asumir que el zombie inicial comenzará en tierra y no morirá de inmediato.
- Este es el código de golf , por lo que gana la respuesta más corta (en bytes).
- -100% de bonificación si su código también puede resolver el problema de detención para máquinas arbitrarias de Turing.
- Su programa debe manejar anchos de tablero de hasta 50 caracteres.
code-golf
ascii-art
simulation
Fruta Esolanging
fuente
fuente
Respuestas:
APL (Dyalog) , 44 bytes
Pruébalo en línea!
Asume
⎕IO←0
.Argumento izquierdo: fila indexada a 0
r
de%, columna indexada a 0c
de%:r c
Argumento derecho: matriz de caracteres
fuente
Kotlin
283218 bytesLambda sin nombre (con una función anidada, je).
Golfed
Sin golf
Ahorró bastantes bytes al cambiar a una solución recursiva.
fuente
JavaScript (ES6), 144 bytes
Donde
\n
representa el carácter de nueva línea literal. Toma coordenadas indexadas 0.fuente
Befunge,
324323bytesPruébalo en línea!
Explicación
Implementar esto en Befunge fue un poco complicado porque estamos limitados a 80x25 caracteres de "memoria" que deben compartirse con el código fuente en sí. El truco para ajustar un mapa de 50x50 en esa área era aplanar el mapa 2D en una matriz 1D con dos ubicaciones de mapa por byte. Esta matriz 1D luego se envuelve en una matriz 2D nuevamente para que pueda caber en el ancho de 80 caracteres del campo de juego Befunge.
El algoritmo de infección comienza convirtiendo las coordenadas iniciales en un desplazamiento en la matriz 1D que empuja a la pila. El bucle principal toma un valor de la pila y busca el estado del mapa para ese desplazamiento. Si es tierra no infectada, se marca como infectada, y se introducen ocho nuevas compensaciones en la pila (que representan la tierra alrededor de la posición actual). Este proceso continúa hasta que la pila esté vacía.
Para evitar tener que buscar valores fuera de rango, el mapa se almacena con un borde de agua de un carácter alrededor de todos los bordes.
fuente
Pip , 59 bytes
Una función que toma una cadena multilínea, la fila del zombie inicial (0 indexado) y la columna del zombie inicial (0 indexado). Pruébalo en línea!
¿Cómo?
Debido a que Pip tiene indexación cíclica (generalmente algo bueno, pero malo para este problema porque no queremos que los bordes del mapa se ajusten), opté por una solución de reemplazo de expresiones regulares.
Ya@?n
encuentra el índice de la primera línea nueva (es decir, el ancho de la cuadrícula) y lo extraey
.(ac+b+b*Ya@?n):'%
después de hacer lo anterior, calcula(width + 1) * row + col
, es decirc+b+b*y
, y establece el carácter en ese índice en%
.L2*#a
2*len(a)
tiempos de bucles , lo que nos proporciona suficientes iteraciones para que el relleno de inundación se propague completamente y asegura que el recuento de iteraciones sea uniforme (eso es importante)..`#(.?.?.{`.y-1.`})?%`
construye una expresión regular que coincide con un#
seguido de a%
, con 0, ancho-1, ancho o ancho + 1 caracteres en el medio. (El.
principio hace que.
la expresión regular coincida con las nuevas líneas). Esta expresión regular coincide con cualquiera de las siguientes configuraciones:aR ... '%.@>_
reemplaza las coincidencias de esta expresión regular con el carácter%
antepuesto a.
todos menos el primer carácter@>
de la coincidencia_
; en resumen, reemplazando el#
con%
.a:RV ...
invierte eso y lo asigna de nuevo aa
. Revertimos porque la expresión regular solo coincide#
antes%
en la cadena, no después; pero cuando la cadena se invierte, after se convierte en before y podemos hacerla coincidir en la próxima iteración. Esta es también la razón por la cual el número de iteraciones tiene que ser par.Una vez que se completa el ciclo, simplemente devolvemos el valor modificado de
a
.fuente
TSQL, 267 bytes
Golfizado:
Sin golf:
Pruébalo
fuente
PHP,
209189188183 bytespuede ser golfable
Corre con
php -r '<code>' '<grid>' <y> <x>
fuente
J, 152 bytes
No muy bien golfizado, estoy seguro de que hay una manera de eliminar esas últimas estructuras de control.
Implementa un algoritmo de relleno de inundación. La función g formatea la entrada en una matriz de caracteres antes de aplicar f.
Tenga en cuenta que las coordenadas son un poco raras:
Es la esquina superior izquierda. Aumentando la primera coordenada:
Mueve la posición hacia abajo en la dirección y.
Aparte de eso, las coordenadas son normales.
Ejemplo:
fuente