(Hay preguntas relacionadas sobre pilas de arena infinitas y la búsqueda de elementos de identidad de pilas de arena ).
Dada una matriz de enteros no negativos, devuelve una matriz de las mismas dimensiones, pero derribada :
- Si la matriz no contiene ningún valor mayor que 4, devuélvalo.
- Cada "celda" que es mayor que 3 se reduce en 4, y todas las celdas directamente vecinas (arriba, abajo, izquierda y derecha) se incrementan, si existen.
- GOTO 1.
Ejemplos:
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
(Solo necesita devolver el resultado final. La ruta en la que lo alcanza puede diferir de la que se muestra aquí: no importa en qué orden realice las operaciones de caída, todos conducen al mismo resultado).
Para una explicación más profunda y alguna motivación, vea este video de Numberphile o el artículo de Wikipedia sobre el modelo de pila de arena de Abelian .
Reglas:
- Puede tomar entrada y salida de cualquiera de las formas estándar
- Las lagunas están prohibidas
- La entrada y la salida pueden ser:
- una lista anidada:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- una lista simple:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
y la forma - algún tipo de matriz nativa
- una cadena, por ejemplo
1 2 3\n4 5 6\n7 8 9
- o cualquier otra cosa que funcione en tu idioma.
- una lista anidada:
- La entrada y la salida deben estar en la misma forma
- La entrada puede contener números más grandes que los que se muestran aquí, pero el tamaño puede estar limitado por los límites de su idioma (equivalentes MAXINT, si corresponde)
- La matriz puede tener cualquier forma (por ejemplo, 1x1, 2x2, 3x3, 4x4, 2x7, 11x3, ...)
- No necesita manejar el caso donde la forma es 0xN o Nx0.
Casos de prueba
[[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]]
Respuestas:
MATL , 17 bytes
¡Pruébalo en MATL Online! O verificar todos los casos de prueba .
Explicación
El programa itera tantas veces como la suma de la entrada. Este es un límite superior suelto en el número requerido de iteraciones.
Para cada iteración,
3
se detectan entradas en la matriz sandpile que exceden , dando una matriz de1
y0
, que está enredada con la máscara de 4 vecinos. Las entradas que exceden3
en la matriz sandpile se reducen4
y se agrega el resultado de la convolución.Para las últimas iteraciones, en las que la matriz sandpile no tiene ningún número superior
3
, los ceros se restan y se agregan a ella, por lo que no se ve afectada.fuente
Mathematica, 65 bytes
Explicación
Transforme repetidamente la entrada derribando todas las pilas mayores que 3. Este proceso se detiene automáticamente cuando la transformación no puede cambiar la matriz (es decir, cuando ya no existen pilas grandes). En la siguiente expresión se llama matriz
s
.Cree una matriz que tenga
1
siempre que la matriz actual tenga uno4
o más, y un cero en caso contrario. Esto es esencialmente una máscara que indica qué pilas deben ser derribadas. Llama a la máscarax
.Primero calculamos el número de arena que se agrega a cada pila debido a las pilas vecinas derribadas. Esto se hace con una convolución de la siguiente matriz sobre
x
:Esencialmente, agrega uno a la celda actual para cada uno de sus vecinos von-Neumann en la máscara.
Agregamos el resultado anterior
s
y luego le restamos cuatro veces la máscara para reducir las pilas derribadas.fuente
Octava, 65 bytes
Esto no parece muy bueno, debo estar perdiendo algunos trucos ...
fuente
input(0)
?>> version ans = 4.0.1
JavaScript (ES6),
10195 bytesToma el ancho de la matriz
w
y una matriz de valoresa
en la sintaxis de curry(w)(a)
. Devuelve una matriz de valores.Formateado y comentado
Casos de prueba
Mostrar fragmento de código
fuente
JavaScript (ES6),
118114104 bytesGuardado 2 bytes gracias a @Neil
fuente
(i-=x)|y-j?i*i+
ayuda?a.find(...b.find(...c>3&&a.map(...)))&&f(a)
..map
que no muta ...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 bytesToma la entrada como referencia a un vector de vectores y lo modifica directamente.
Pruébalo en línea!
fuente