Inspirado por una pregunta en Stack Overflow .
Dada una matriz no x
entera de enteros y un entero positivo n
, calcule la suma de cada bloque deslizante de longitud a lo n
largo 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-1
entradas desplazadas circularmente; - el segundo bloque tiene las entradas primera y segunda
x
, precedidas porn-2
entradas desplazadas circularmente; y así.
La matriz de salida y
tiene el mismo tamaño que x
. Es posible n
exceder la longitud de x
, y luego los valores de x
se 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
-2
es la suma del bloque[0, -4, 2]
(los dos primeros valores provienen del desplazamiento circular)2
es la suma de[-4, 2, 4]
(el primer valor proviene del desplazamiento circular)3
es la suma de[2, 4, -3]
(ya no es necesario un desplazamiento circular)1
es la suma de[4, -3, 0]
-7
es 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
7
es la suma del bloque[1, 2, 1, 2, 1]
(los primeros cuatro valores se han reutilizado circularmente)8
es 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
n
exitosas 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 deInteger
aint[]
. Asignar aFunction<int[], Function<Integer, int[]>>
.Pruébalo en línea
Lambda sin golf
(j % l + l) % l
calcula 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!
imfilter
función con la opcióncircular
calcula 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$b
en 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
,N
aspecto 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+x
parte.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*n
deberí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