Digamos que esta matriz es la cantidad de flexiones que he logrado cada día en los últimos 28 días:
[
20,20,20,30,30,30,30,
35,35,40,40,40,45,45,
50,50,50,50,50,50,50,
60,70,80,90,100,110,120
]
Como puede ver, ha tomado una fuerte tendencia al alza en la última semana, y esa es la parte de estos datos que más me interesa. Cuanto más en el pasado sea, menos quiero que esos datos aparezcan en mi promedio 'número de flexiones.
Con ese fin, quiero calcular un "promedio" donde cada semana valga más que la semana anterior.
Información de antecedentes, no es parte de este problema.
Promedio normal:
La suma de todos los valores / el número de valores
Por arriba:
1440/28 = 51.42857142857143
Peso promedio:
Divida la matriz en 4 grupos de 7 y comience una nueva matriz.
- Agregue el primer grupo a la matriz.
- Agregue el segundo grupo a la matriz dos veces.
- Agregue el tercer grupo a la matriz tres veces.
- Agregue el cuarto grupo a la matriz cuatro veces.
Suma toda la nueva matriz y divide por la longitud de la nueva matriz.
Por arriba:
Convierta la matriz a esto:
[
20,20,20,30,30,30,30, # first week once
35,35,40,40,40,45,45,
35,35,40,40,40,45,45, # second week twice
50,50,50,50,50,50,50,
50,50,50,50,50,50,50,
50,50,50,50,50,50,50, # third week thrice
60,70,80,90,100,110,120,
60,70,80,90,100,110,120,
60,70,80,90,100,110,120,
60,70,80,90,100,110,120 # Fourth week four times
]
Luego ejecute un promedio normal en esa matriz.
4310/70 = 61.57142857142857
Tenga en cuenta que es más alto que el valor promedio normal debido a la tendencia al alza en la última semana.
Las normas:
- La entrada es una matriz plana de 28 enteros no negativos.
- Cualquier idioma en el que te gustaría escribir.
- Salida de un número.
- Siempre me gusta ver enlaces TIO .
- Intenta resolver el problema en el menor número de bytes.
- El resultado debe ser un decimal exacto de al menos 4 decimales (ya sea truncado o redondeado a partir de los valores del caso de prueba está bien) o una fracción exacta.
Casos de prueba:
Caso 1: tendencia al alza
[
20,20,20,30,30,30,30,
35,35,40,40,40,45,45,
50,50,50,50,50,50,50,
60,70,80,90,100,110,120
]
Promedio normal: 51.42857142857143 Promedio ponderado: 61.57142857142857
Caso 2: Dejando atrás la calma
(Tuve una mala semana, pero fue hace un tiempo)
[
50,50,50,50,50,50,50,
10,10,10,10,10,10,10,
50,50,50,50,50,50,50,
50,50,50,50,50,50,50
]
Promedio normal: 40 Promedio ponderado: 42
Caso 3: Renunciar
Tuve una mala semana, está bajando mi promedio rápidamente.
[
50,50,50,50,50,50,50,
50,50,50,50,50,50,50,
50,50,50,50,50,50,50,
10,10,10,10,10,10,10
]
Promedio normal: 40 Promedio ponderado: 34
Caso 4: promediando
Bien, solo estoy jugando por aquí, pensé que podría ser el mismo valor para los promedios normales y ponderados, pero, por supuesto, no lo era.
[
60,60,60,60,60,60,60,
30,30,30,30,30,30,30,
20,20,20,20,20,20,20,
15,15,15,15,15,15,15
]
Promedio normal: 31.25 Promedio ponderado: 24.0
Problema de bonificación:
¿Qué combinación de 28 valores tendría el mismo promedio normal y promedio ponderado?
¡Feliz golf!
fuente
new_avg = α*weekly_sum + (1-α)*old_avg
para algunosα∈(0,1)
0
flexiones todos los días, por lo que mi promedio ponderado es el mismo que mi promedio normal.Respuestas:
Casco , 6 bytes
Pruébalo en línea!
Utiliza el truco que Dennis usó para superar mi presentación de Jelly. En lugar de repetir cada fragmento N veces, recupera los sufijos de la lista de fragmentos, que después del aplanamiento producirá el mismo resultado, excepto el orden.
fuente
Python 3 , 38 bytes
Pruébalo en línea!
fuente
05AB1E ,
87 bytesGuardado 1 byte gracias al Sr. Xcoder
Pruébalo en línea!
Explicación
fuente
Jalea , 7 bytes
Pruébalo en línea!
Cómo funciona
fuente
x"J$
es equivalente aṫJ
en este contexto. ¡Interesante!R + pryr,
3228 bytesy el mismo puntaje promedio semana tras semana daría como resultado la igualdad de los medios.
Pruébalo en línea!
Ahorro de 4 bytes mediante el uso del producto punto gracias a Giuseppe .
Pure R tendría dos bytes más usando
function
fuente
sum
function(s)weighted.mean(s,rep(1:4,e=7))
weighted.mean
. Me encanta cuando losR
outgolfsPython
.MATL , 10 bytes
Pruébalo en línea!
¡No he publicado una respuesta MATL en años! ¡Pensé que podría participar como parte de LOTM en mayo de 2018 !
Explicación:
fuente
K:7Y"*s70/
10 bytes también.Jalea , 9 bytes
Pruébalo en línea!
Cómo funciona
fuente
Haskell , 35 bytes
Bonificación: si
a,b,c,d
son las sumas semanales, el promedio normal es el mismo que el promedio ponderado si:Una solución es cuando la primera y la última semana tienen las mismas sumas, y de la misma manera la segunda y la tercera semana tienen la misma suma, pero hay infinitas soluciones si sus bíceps están a la altura. Ejemplo: [15,10,10,10,10,10,5,20,20,20,25,25,20,20,30,20,20,20,20,20,20,10,10,20 , 0,10,10,10]
Pruébalo en línea!
fuente
JavaScript (Node.js) , 49 bytes
Pruébalo en línea!
Solución no genérica
JavaScript (Node.js) ,
3936 bytesPruébalo en línea!
fuente
a=>a.reduce((s,x,i)=>(I+=d=-~(i/7),s+x*d),I=0)/I
. Y un consejo rápido: úselo<hr>
para crear una línea horizontal en reducción---
(necesita su propio párrafo)?Stax , 6 bytes
¡Ejecútelo y depúrelo en staxlang.xyz!
Desempaquetado (7 bytes) y explicación:
fuente
Stax ,
108 bytesEjecutar y depurarlo
Explicación (sin embalaje):
fuente
$
para aplanar si los elementos son todos enteros, verifique con OP ahora.Octava , 33 bytes
Pruébalo en línea!
fuente
Carbón , 14 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
fuente
K4 / K (oK) ,
191614 bytesSolución:
Pruébalo en línea!
Ejemplo:
Explicación:
La evaluación se realiza de derecha a izquierda. Divida 7 1s, 7 2s, 7 3s y 7 4s entre 70 divididos por la entrada; entonces resumir.
fuente
Excel: 33 bytes
(3 bytes guardados de la respuesta de @ wernisch ejecutando datos en 2 líneas de A1: N1 y A2: N2)
Disculpas por no incluir esto como un comentario. No tengo suficiente reputación para hacerlo.
fuente
Japt ,
1110 bytesIntentalo
Explicación
fuente
Triangularidad , 49 bytes.
Pruébalo en línea!
Explicación
fuente
Perl 5
-pa
, 28 bytesPruébalo en línea!
La entrada está separada por espacios en lugar de por comas.
fuente
$.
disponible como el multiplicador perfecto. No es necesario$i
APL + WIN, 13 bytes
Solicita matriz como un vector de enteros:
Explicación:
fuente
Java 8, 57 bytes
Pruébalo en línea.
Explicación:
fuente
J , 16 bytes
Explicación:
Pruébalo en línea!
fuente
Clojure,
4846 bytesEsto terminó siendo más corto que la combinación mapcat + subvec.
fuente
TI-Basic, 25 bytes
Solución alternativa, 39 bytes.
fuente
Ruby , 65 bytes
Pruébalo en línea!
fuente
size
propiedad. Pruébalo en línea!Excel,
3633 bytes-3 bytes gracias a @tsh.
Entrada en primera fila (
A1
aAB1
).fuente
A1:AB1
->1:1
?Julia 0.6 , 27 bytes
Pruébalo en línea!
La
repeat
llamada forma una matriz de columna de 28 valores, que contiene siete 1, luego siete 2, etc. Luego la transponemos'
, luego hacemos una matriz de multiplicación con la entrada (la multiplicación está implícita aquí). Dado que es una multiplicación matricial de una matriz 1x28 con una matriz 28x1, terminamos con un solo valor, que es la suma ponderada que necesitamos. Divide eso entre70
para obtener nuestra media ponderada.fuente