Inspirado por una pregunta en Stack Overflow .
Dada una matriz no xentera de enteros y un entero positivo n, calcule la suma de cada bloque deslizante de longitud a lo nlargo de la matriz x, llenando circularmente los valores faltantes a la izquierda con los valores de la derecha de la siguiente manera:
- el primer bloque contiene la primera entrada de
x, precedida porn-1entradas desplazadas circularmente; - el segundo bloque tiene las entradas primera y segunda
x, precedidas porn-2entradas desplazadas circularmente; y así.
La matriz de salida ytiene el mismo tamaño que x. Es posible nexceder la longitud de x, y luego los valores de xse reutilizan circularmente varias veces .
Ejemplos
Ejemplo 1 (los valores se reutilizan solo una vez)
x = [2, 4, -3, 0, -4]
n = 3
dar como salida
y = [-2, 2, 3, 1, -7]
dónde
-2es la suma del bloque[0, -4, 2](los dos primeros valores provienen del desplazamiento circular)2es la suma de[-4, 2, 4](el primer valor proviene del desplazamiento circular)3es la suma de[2, 4, -3](ya no es necesario un desplazamiento circular)1es la suma de[4, -3, 0]-7es la suma de[-3, 0, -4].
Ejemplo 2 (los valores se reutilizan varias veces)
x = [1, 2]
n = 5
dar
y = [7, 8]
dónde
7es la suma del bloque[1, 2, 1, 2, 1](los primeros cuatro valores se han reutilizado circularmente)8es la suma del bloque[2, 1, 2, 1, 2](los primeros tres valores se han reutilizado circularmente)
Reglas adicionales
- El algoritmo debería funcionar para matrices de tamaño arbitrario y para valores enteros arbitrarios. Es aceptable si el programa está limitado por el tipo de datos o las restricciones de memoria; pero se deben manejar los valores enteros positivos y negativos.
- La entrada / salida se puede tomar / producir por cualquier medio razonable .
- Se permiten programas o funciones , en cualquier lenguaje de programación . Las lagunas estándar están prohibidas.
- El código más corto en bytes gana.
Casos de prueba
x, n, -> y
[2, 4, -3, 0, -4], 3 -> [-2, 2, 3, 1, -7]
[1, 2], 5 -> [7, 8]
[2], 7 -> [14]
[-5, 4, 0, 1, 0, -10, -4], 4 -> [-19, -15, -5, 0, 5, -9, -13]
[-5, 4, 0, 1, 0, -10, -4], 1 -> [-5, 4, 0, 1, 0, -10, -4]
[-2, -1, 0, 1, 2, 3], 5 -> [4, 3, 2, 1, 0, 5]
[-10, 0, 10], 4 -> [-10, 0, 10]
code-golf
math
arithmetic
array-manipulation
integer
Luis Mendo
fuente
fuente

Respuestas:
Jalea , 5 bytes
Pruébalo en línea!
Cómo funciona
fuente
MATL,
111097 bytes¡3 bytes guardados gracias a @Luis!
La primera entrada es el tamaño de la ventana y la segunda entrada es la matriz
Pruébalo en MATL Online
Explicación
fuente
Mathematica, 29 bytes
O la misma longitud:
fuente
CJam (16 bytes)
Conjunto de pruebas en línea . Este es un bloque anónimo (función) que toma la matriz y la longitud en la pila y deja una matriz en la pila.
Disección
fuente
Haskell, 57 bytes
Pruébalo en línea!
Solo un poco de bucle de índice y acceso a la lista de entrada en los módulos modulan la longitud de la lista.
fuente
Haskell ,
696564 bytesPruébalo en línea! Ejemplo de uso:
[2, 4, -3, 0, -4] # 3.El uso de entradas
nexitosas en lugar de las anteriores podría ser5046 bytes (deshacerse del reverso al principio y al final):Pruébalo en línea!
fuente
Japt , 12 bytes
Pruébalo en línea!
TIO no es compatible con el
Ë, por lo que el enlace TIO no funcionará. En cambio, inténtalo aquí .fuente
Pyth ,
1816 bytes¡ Ahorré 2 bytes gracias a @FryAmTheEggman !
Pruébelo aquí o verifique todos los casos de prueba.
¡Se corrigieron todos los defectos a un costo de -6 bytes ! Muchas gracias a Luis por hacerme entender la tarea en el chat.
Explicación (por actualizar)
fuente
Java 8, 102 bytes
Lambda (al curry) de
int[]a lambda deIntegeraint[]. Asignar aFunction<int[], Function<Integer, int[]>>.Pruébalo en línea
Lambda sin golf
(j % l + l) % lcalcula un resto no negativo para cualquieraj. Tomado de aquí .fuente
C, 91 bytes
Pruébalo en línea!
fuente
Octava, 53 bytes
Pruébalo en línea!
imfilterfunción con la opcióncircularcalcula la convolución circular en el centro de la ventana, por lo que el resultado debe desplazarse.fuente
05AB1E , 10 bytes
Pruébalo en línea!
Explicación
fuente
Perl 6 ,
4239 bytesPruébalo en línea!
Mi primera entrada de Perl 6. Probablemente se puede mejorar.
fuente
->\a,\b{[«+»] map {a.rotate(-$_)},^b}Tenga en cuenta que no lo hace en este caso, pero lo haría si hubiera otra instancia$ben el código.Kotlin ,
141140138 bytesSolo un primer intento
Sumisión
Embellecido
TryItOnline
Ediciones
fuente
Röda , 52 bytes
Pruébalo en línea!
Explicación:
fuente
JavaScript ES6
8078 bytes2 bytes guardados gracias a Neil
Uso:
fuente
,Naspecto es innecesario para mí ...Perl 5 , 66 + 1 (-a) = 67 bytes
Pruébalo en línea!
fuente
Python 2 ,
6961 bytes- 8 bytes Muchas gracias @muru
Pruébalo en línea!
Explicación:
Primero debemos asegurarnos de que haya suficientes números a la izquierda de la lista original, esto se logra por
x*n+xparte.Por ejemplo
[2,4,-3,0,4],5:Luego revertiremos la lista:
A continuación obtenemos los bloques correspondientes para cada elemento por
[len(x)+~i:][:n]. El segmento será inverso, es decir, 2 ganará un bloque:[2,-4,0,-3,4]que es inverso al esperado[4,-3,0,-4,2], pero necesitamos la suma después de todo. Entonces, esto funciona. :)fuente
x[-n+1:]+x*ndebería darle la lista con suficiente relleno a cada lado, sin tener que invertir (lambda x,n:[sum((x[-n+1:]+x*n)[i:i+n])for i in range(len(x))])R ,
1019389 bytesPruébalo en línea!
fuente
K (oK) , 18 bytes
Solución:
Pruébalo en línea!
Ejemplos:
Explicación:
Estaba a punto de publicar un 31 bytes solución entonces recordé que oK tiene un built-in para las ventanas correderas ...
Prima:
La solución de 31 bytes que también funciona en K4 :
fuente