Tarea
Dada una lista de enteros L y otro número entero s , el objetivo es calcular las sumas en columna de todos los segmentos de L de longitud (potencialmente superpuestos) , mientras se relacionan sus posiciones con respecto a L (ver más abajo).
Definiciones
Los s -Longitud rebanadas (superpuestas) de la lista L son todas las subsecuencias contiguos (sin envoltura) de L que son de longitud s .
Para pertenecer a las posiciones de los cortes s con relación a L , puede imaginarse construyendo una "escalera", donde cada corte s i tiene un desplazamiento de las posiciones i desde el principio.
Especificaciones
- s es un número entero mayor que 1 y estrictamente menor que la longitud de L .
- L siempre contendrá al menos 3 elementos.
- Puede competir en cualquier lenguaje de programación y puede tomar entradas y proporcionar salidas a través de cualquier método estándar , mientras toma nota de que estas lagunas están prohibidas por defecto. Este es el código de golf , por lo que gana el envío más corto (en bytes) para cada idioma .
Ejemplos y casos de prueba
Aquí hay un ejemplo trabajado:
[1, 2, 3, 4, 5, 6, 7, 8, 9], 3
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
[6, 7, 8]
[7, 8, 9]
-------------------------------- (+) | column-wise summation
[1, 4, 9, 12, 15, 18, 21, 16, 9]
Y algunos casos de prueba más:
[1, 3, 12, 100, 23], 4 -> [1, 6, 24, 200, 23]
[3, -6, -9, 19, 2, 0], 2 -> [3, -12, -18, 38, 4, 0]
[5, 6, 7, 8, 2, -4, 7], 3 -> [5, 12, 21, 24, 6, -8, 7]
[1, 2, 3, 4, 5, 6, 7, 8, 9], 3 -> [1, 4, 9, 12, 15, 18, 21, 16, 9]
[1, 1, 1, 1, 1, 1, 1], 6 -> [1, 2, 2, 2, 2, 2, 1]
[1, 2, 3, 4, 5, 6, 7, 8, 9], 6 -> [1, 4, 9, 16, 20, 24, 21, 16, 9]
code-golf
array-manipulation
subsequence
Sr. Xcoder
fuente
fuente
s
es más grande queL/2
. Tal vez agregue algunos casos de prueba más donde ese es el caso[1, 1, 1, 1, 1, 1, 1], 6 ->
[1, 2, 2, 2, 2, 2, 1] `o[1, 2, 3, 4, 5, 6, 7, 8, 9], 6 -> [1, 4, 9, 16, 20, 24, 21, 16, 9]
?Respuestas:
J ,
11, 98 bytes-1 byte gracias a millas!
¿Cómo funciona?
El argumento izquierdo es s, el derecho - L
]\
- divide L en sublistas con longitud s/.
- extrae las diagonales oblicuas (anti-diagonales)+/
- los suma[:
- hace un tenedor de los verbos anterioresAquí hay un ejemplo de sesión J para el primer caso de prueba:
Pruébalo en línea!
fuente
/.
, en oposición a la diagonal principal que va de arriba a la izquierda a abajo a la derecha.,/\
con]\
Haskell ,
5956 bytesPruébalo en línea!
Define una función
(#)
que toma una listas
y un númeron
como argumentos.Esto se basa en la observación de que para
s = [1, 2, 3, 4, 5, 6, 7, 8, 9]
yn = 3
es lo mismo que
Para generar esta lista inicialmente creciente, luego constante y finalmente decreciente, podemos comenzar con
que rinde
[1, 2, 3, 4, 5, 4, 3, 2, 1]
. Agregarn
como restricción adicional a laminimum
expresión produce la[1, 2, 3, 3, 3, 3, 3, 2, 1]
respuesta de lista correcta paran = 3
, aunque paran = 6
(o en general cualquieran > lengths s/2
) la restricción adicionallength s + 1 - n
es necesaria:o más corto:
Para la multiplicación por pares
[1..length s]
se comprime cons
, y debido a quezip
trunca la lista más larga a la longitud de la más corta,[1..]
se puede usar la lista infinita :fuente
JavaScript (ES6),
656258 bytesGuardado 4 bytes gracias a @Shaggy
Toma entrada en la sintaxis de curry
(a)(n)
.Casos de prueba
Mostrar fragmento de código
fuente
a=>n=>a.map((v,i)=>v*Math.min(++i,n,a.length+1-(n>i?n:i)))
Funciona para 58 bytes?Java 8, 83 bytes
Ese primer caso de prueba (y los dos últimos que he agregado) me fastidió varias veces, pero finalmente funciona ahora ...: D
Modifica la matriz de entrada en lugar de devolver una nueva.
Explicación:
Pruébalo en línea.
fuente
05AB1E , 12 bytes
Pruébalo en línea!
fuente
MATL , 8 bytes
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
Considere las entradas
[1, 3, 12, 100, 23]
y4
.fuente
APL (Dyalog Unicode) ,
1914 bytes SBCS-5 gracias a ngn.
Función infija tácita anónima que toma s como argumento izquierdo y L como argumento derecho. Asume
⎕IO
( I ndex O rigin) para ser0
como es por defecto en muchos sistemas.Pruébalo en línea!
Explicación con caso de ejemplo
[1,3,12,100,23]
(
...)
aplique la siguiente función tácita anónima:,/
ventanas superpuestas de ese tamaño;[[1,3,12],[3,12,100],[12,100,23]]
(
… De forma)\
acumulativa, aplique este tácito la siguiente función tácita anónima:⊢
el argumento correcto (la mayoría)0,
con un cero a la izquierdaLa reducción acumulativa significa que insertamos la función en cada "espacio" entre términos sucesivos, trabajando de derecha a izquierda. Para cada "espacio", la función descartará el argumento izquierdo pero agregará un cero adicional. Efectivamente, esto agrega tantos ceros a cada término como haya "espacios" a su izquierda, por lo que el primer término obtiene cero espacios, el segundo obtiene uno y el tercero obtiene dos:
[[1,3,12],[0,3,12,100],[0,0,12,100,23]]
↑
subir el rango combinando las listas en una única matriz, rellenando con ceros;┌ ┐
│1 3 12 0 0│
│0 3 12 100 0│
│0 0 12 100 23│
└ ┘
∘
luego+⌿
suma verticalmente;[1,6,36,200,23]
fuente
⊢,⍨¨0⍴⍨¨⍳∘≢
->{0,⍵}\
+⌿∘↑((0,⊢)\,/)
más elegante.2{(⊃⌽⍺),⊃⍵}/⊢
->2{⊃¨(⌽⍺)⍵}/⊢
Jalea , 6 bytes
Pruébalo en línea!
Cómo funciona
fuente
Japt , 13 bytes
¡Tomó demasiado tiempo hacer que esto funcionara cuando
s
>L/2
!Intentalo
Explicación
fuente
s > L/2
! " Tenía exactamente la misma. Los otros casos de prueba son fáciles, ¡pero el primero (y los dos que he agregado al final) fueron molestos! .. ¡+1 de mi parte!Wolfram Language (Mathematica) , 42 bytes
Pruébalo en línea!
fuente
Julia , 41 bytes
Pruébalo en línea!
\
operador.a[L=end]
es una alternativa más corta aL=length(a)
.fuente
Japt ,
1312 bytes-1 byte gracias a @ETHproductions
Pruébalo en línea!
fuente
R ,
5251 bytesPruébalo en línea!
Esto es equivalente a la respuesta de Laikoni .
seq(l)
produce los índices1...length(l)
desde entonceslength(l)>1
(de lo contrario produciría1...l[1]
). ¡Lo guardo como, guardox
su reverso comoy
, y tomo el primer elemento dey
(length(l)
) para portar cuidadosamente la respuesta de Laikoni y guardar un byte!Respuesta original, 52 bytes.
Pruébalo en línea!
La salida se
l
elementwise multiplica por el mínimo des
, el índice de 1 a base de del elementox
,length(l)-x+1
ylength(L)-s+1
.Esto también es equivalente a la respuesta de Laikoni, usando en
L-x
lugar derev(x)
como es más corto.fuente
APL + WIN, 25 bytes
Solicita la entrada de pantalla de L seguido de s
Explicación:
fuente
K (oK) , 30 bytes
Solución:
Pruébalo en línea!
Ejemplo:
Explicación:
No creo que pueda competir con J en este caso. Genere una lista de ceros para agregar y agregar a la lista de la ventana deslizante, luego resuma:
El desglose es el siguiente ... aunque esto todavía se siente torpe.
fuente
Casco , 4 bytes
Pruébalo en línea!
Utiliza la idea de la respuesta J de Galen Ivanov .
Explicación
fuente
C (gcc) , 100 bytes
Pruébalo en línea!
fuente
Python 2 ,
6866 bytes-2 bytes gracias a Laikoni
Pruébalo en línea!
fuente
max(i,n-1)
en lugar de[i,n-1][n>i]
.Perl 5 , 63 bytes
Pruébalo en línea!
fuente
C (gcc) ,
838179 bytesBásicamente, hay tres "fases" en la manipulación de la lista: aumento, sostenimiento y enfriamiento. A medida que avanzamos en la lista, aumentaremos nuestro factor hasta que alcancemos un máximo. Si una serie completa de sectores puede caber en la lista, este máximo será el mismo que la longitud de los sectores. De lo contrario, será igual a la cantidad de cortes que quepan. En el otro extremo, disminuiremos el factor nuevamente, para aterrizar en 1 en el último elemento.
La duración de las fases de aceleración y enfriamiento que refuerzan esta meseta es uno menos que ese factor máximo.
Con suerte, los bucles sin golf antes de combinarlos lo aclaran (R = duración de la fase de aceleración):
Tres bucles es demasiado, por lo que decidir el factor basado en r nos da un bucle (usando s para R para guardar algunos bytes):
Pruébalo en línea!
fuente
Perl,
4544 bytesIncluye +4 para
-ai
También tenga en cuenta que este código da 2 advertencias perl en el inicio. Puede suprimirlos a costa de un golpe agregando laX
opciónIndique la longitud de la máscara después de la
-i
opción y la matriz en una línea en STDIN:Solo el código:
fuente
Ruby , 62 bytes
Pruébalo en línea!
Esencialmente un puerto de la respuesta de JavaScript de Arnauld , excepto que la necesidad
with_index
es mucho más dolorosa.En el tiempo que tardé en decidir enviar esto, aproveché esta versión de 70 bytes, que está más cerca del algoritmo de Dennis .
fuente
Clojure, 72 bytes
fuente
Pyt , 106 bytes
Toma L en la primera línea como una matriz y toma s en la segunda línea
Explicación:
Pruébalo en línea!
fuente
Python + numpy, 64 bytes
Llame a esto con l como la lista y N como la longitud.
fuente