Vamos a definir una matriz de 9s como:
Definamos un número explosivo como un número en la posición que se puede descomponer en enteros iguales entre todos sus vecinos adyacentes (incluido él mismo) y el valor absoluto de cada porción es mayor que 0.
De la matriz anterior, explotemos el número en la posición (0 indexado)
A veces, el resultado de descomposición en un número racional mayor que 1. Esto es algo que debemos evitar al explotar números. En estos casos, el resto se asignará al número explotado.
Para demostrarlo, continuemos trabajando con nuestra matriz anterior. Esta vez estallaremos el número en la posición
Aquí tenemos 3 puertos y el número en sí. Aquí la ecuación es algo así como que nos dan 2 para cada uno y 2 como resto.
Además, a veces un número no será lo suficientemente grande como para descomponerse en partes iguales (donde el abs es mayor que 0) entre sus vecinos (| número racional | <1). En estos casos, necesitamos "tomar prestado" del número explotado para mantener la condición "mayor que 0" . Continuemos con nuestro ejemplo anterior y explotemos el número en la posición .
El desafío es, dada una lista de posiciones y una matriz finita no vacía de números naturales, devolver la forma explotada después de que cada número de la lista de posiciones haya sido explotado.
Casos de prueba
Entrada: initial matrix: [[3, 3, 3], [3, 3, 3], [3, 3, 3]], numbers: [[0,0],[0,1],[0,2]]
Salida: [[1, 0, 1], [5, 6, 5], [3, 3, 3]]
Entrada: Initial matrix: [[9, 8, 7], [8, 9, 7], [8, 7, 9]], numbers: [[0,0],[1,1],[2,2]]
Salida: [[4, 11, 8],[11, 5, 10],[9, 10, 4]]
Entrada: Initial matrix: [[0, 0], [0, 0]], numbers: [[0,0],[0,0],[0,0]]
Salida: [[-9, 3],[3, 3]]
Entrada: Initial Matrix: [[10, 20, 30],[30, 20, 10],[40, 50, 60]], numbers: [[0,2],[2,0],[1,1],[1,0]]
Salida: [[21, 38, 13], [9, 12, 21], [21, 71, 64]]
Entrada: Initial Matrix: [[1]], numbers: [[0,0]]
Salida: [[1]]
Entrada: Initial Matrix: [[1, 2, 3]], numbers: [[0,0], [0, 1]]
Salida: [[1, 1, 4]]
Notas
Aplican reglas de entrada / salida
Puede suponer que la matriz de entrada nunca estará vacía
Puedes asumir que las coordenadas siempre serán válidas
La entrada coord en casos de prueba se da como (fila, columna). Si necesita que sea (x, y) puede intercambiar los valores. Si es así, indíquelo en su respuesta
Respuestas:
C (CCG)
220216214212 bytescrédito a @ceilingcat por 2 bytes
Ejecútalo aquí
una versión un poco menos golfizada
El código de llamada con un ejemplo
y la salida
fuente
JavaScript (ES7),
126 125 123121 bytesGuardado 2 bytes gracias a @Shaggy
Toma entrada como
(matrix)(list)
. Salidas modificando la matriz.Pruébalo en línea!
¿Cómo?
En lugar de eso, usamos una función recursiva que ejecuta un flujo de operaciones más simple, repetido tantas veces como sea necesario:
El principal beneficio es que solo necesitamos un bucle sobre la matriz. El segundo beneficio es que no tenemos que calcular ningún cociente.
Ejemplo
Después del paso 1 de la primera iteración , tenemos:
Y después del paso 2 de la primera iteración :
Después del paso 1 de la segunda iteración , tenemos:
Y después del paso 2 de la segunda iteración :
Ahora incrementamos la celda de referencia dos veces ( paso 4 de ambas iteraciones ), lo que lleva al resultado final:
Comentado
fuente
(0)
con 2 backticks.R ,
163162161159155146 bytesPruébalo en línea!
Explicación
(Corresponde a una versión anterior del código)
fuente
Limpio ,
181167 bytesPruébalo en línea!
En forma de una función literal parcialmente aplicada.
Ampliado (primera versión):
fuente
Óxido - 295 bytes
Esto es bastante largo debido a que Rust requiere la indexación de enteros sin signo de los vectores, pero requiere que los enteros con signo resten lo que resulta en negativos. Sin embargo, creo que mi algoritmo es el "algoritmo más corto" hasta ahora. En realidad no hay necesidad de lidiar con la detección de bordes, fondo, etc.
Observe tres cosas: una, la suma de todas las celdas siempre es constante. Dos, esta es una situación de división / resto, por lo que podemos aplicar el pensamiento estilo algoritmo de Bresenham. Tres, la pregunta siempre agrega el mismo número a todas las celdas dentro de una cierta distancia de la celda de posición especial, antes de ocuparse de las cosas "adicionales" en la posición especial.
Algoritmo:
Almacene el valor original de la celda en la posición P en M.
Comenzar bucle:
Iterar sobre cada celda I en la matriz. Si la posición de la celda I está dentro de los 3 cuadrantes (distancia al cuadrado) de la posición P, reste 1 de la celda P y agregue 1 a la celda I. Cuente cuántas veces se hace esto en una iteración a través de la matriz.
Si el valor restante en la celda en la posición P es menor o igual que M / Count + M módulo Count, entonces rompa el ciclo. De lo contrario, realice el ciclo nuevamente.
La matriz resultante será la versión explosionada. Contar es básicamente una forma de contar vecinos sin tratar con bordes. El bucle es una manera de dividir las cosas de división / suma en una suma / resta única repetida de una. La verificación del módulo asegura que nos quedará el resto apropiado en la posición P para lidiar con 'explosiones' que no son divisibles entre vecinos. La estructura de bucle do / while permite que P <0 funcione correctamente.
Versión sin golf en Rust Playground
fuente
f
lo haría. Pero probablemente podría guardar aún más bytes, utilizando una función anónima:|p:(i8,i8),v:&mut Vec<Vec<i8>>|{...}
Java 10,
194193191190184182171 bytesPuerto iterativo de la respuesta JavaScript de @Arnauld .
-17 bytes gracias a @Arnauld .
Modifica la matriz de entrada en lugar de devolver una nueva para guardar bytes.
Pruébalo en línea.
Explicación:
fuente
m[y]
conm[y][x]
conundefined[x]
qué fallaría. De todos modos, su(x-X)**2+(y-Y)**2<3
cheque es bastante inteligente. Necesito recordar eso cuando alguna vez quiero verificar los valores en una matriz en un bloque de 3x3 (y dentro de los límites) a su alrededor. Creo que en realidad tengo algunas respuestas como esa, donde ahora uso un try-catch y, en un caso, try-finally ... Las miraré cuando tenga algo de tiempo.Lisp común , 498 bytes
Pruébalo en línea!
Use esta función como
(print (c #2A((3 3 3) (3 3 3) (3 3 3)) '((0 0)(0 1)(0 2))))
Versión mejor legible:
Ejemplo de salida:
fuente
Python 2 , 171 bytes
Pruébalo en línea!
fuente