Si tenemos una lista, digamos la lista [9, 2, 4, 4, 5, 5, 7]
, podemos hacer un promedio móvil a través de ella.
Tomando una ventana de, digamos, 3 elementos, cada elemento es reemplazado por una ventana como esta:, [[9], [9, 2], [9, 2, 4], [2, 4, 4], [4, 4, 5], [4, 5, 5], [5, 5, 7]]
y luego tomando promedios, obtenemos [9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667]
.
Bastante simple hasta ahora. Pero una cosa que puede notar sobre esto es que tomar un promedio móvil "suaviza" la lista. Entonces esto plantea la pregunta: ¿cuántas veces se tiene que tomar un promedio móvil para hacer que la lista sea "lo suficientemente suave"?
Tu tarea
Dada una lista de flotantes, un tamaño de ventana entero y un flotante, genera cuántas veces se tiene que tomar el promedio móvil para obtener la desviación estándar menor que ese flotante. Para aquellos que no saben, la desviación estándar mide cuán poco uniforme es un conjunto de datos y puede calcularse mediante la siguiente fórmula:
Por ejemplo, usando nuestra lista anterior y un stddev máximo de .5
, obtenemos 8
iteraciones que se ven así:
[9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667]
[9.0, 7.25, 6.5, 4.6111111111111116, 4.2222222222222223, 4.1111111111111107, 4.8888888888888893]
[9.0, 8.125, 7.583333333333333, 6.1203703703703702, 5.1111111111111107, 4.3148148148148149, 4.4074074074074074]
[9.0, 8.5625, 8.2361111111111107, 7.2762345679012341, 6.2716049382716044, 5.1820987654320989, 4.6111111111111107]
[9.0, 8.78125, 8.5995370370370363, 8.024948559670781, 7.2613168724279831, 6.2433127572016458, 5.3549382716049374]
[9.0, 8.890625, 8.7935956790123466, 8.4685785322359397, 7.9619341563786001, 7.1765260631001366, 6.2865226337448554]
[9.0, 8.9453125, 8.8947402263374489, 8.7175997370827627, 8.4080361225422955, 7.8690129172382264, 7.141660951074531]
[9.0, 8.97265625, 8.9466842421124824, 8.8525508211400705, 8.6734586953208357, 8.3315495922877609, 7.8062366636183507]
y terminar con un stdev de 0.40872556490459366
. Acabas de salir 8
.
Pero hay una trampa:
¡La respuesta no tiene que ser no negativa! Si la lista inicial ya satisface el stddev máximo, debe ver cuántas iteraciones puede "retroceder" y deshacer el promedio móvil y aún así la lista satisface el stddev máximo. Como estamos truncando las ventanas para los n
puntos de datos iniciales y no los descartamos, hay suficientes datos para revertir un promedio móvil.
Por ejemplo, si comenzamos con la lista [9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627]
(tomada de nuestro ejemplo anterior con 3 promedios móviles más hechos) y el mismo tamaño de ventana y el máximo estándar, obtendrá la salida -3
porque puede invertir el promedio móvil en la mayoría de las 3
veces.
Cualquier formato de E / S razonable está bien.
Este es el código de golf, ¡el código más corto en bytes gana!
Casos de prueba
[9, 2, 4, 4, 5, 5, 7], 3, .5 -> 8
[9, 2, 4, 4, 5, 5, 7], 3, .25 -> 9
[9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627], 3, .5 -> -3
[1000, 2, 4, 4, 5, 5, 7], 7, .25 -> 13
[1000.0, 999.98477172851563, 999.96956668760447, 999.95438464397, 999.90890377378616, 999.83353739825293, 999.69923168916694], 4, 7 -> -6
fuente
Respuestas:
Wolfram - 236
Bastante torpe en este momento, pero al menos funciona.
fuente
f[x_,w_,c_]:=Module[{l=Length,d=Sqrt@CentralMoment[#,2]&,n,a,b,t,r},n=Length@x;a=Normalize/@LowerTriangularize@Array[Boole[Abs[#1-#2]<w]&,{n,n}]^2;{b,t,r}=If[d@x>c,{a,d@#>c&,l@#-1&},{Inverse@a,d@#<c&,-l@#+2&}];r@NestWhileList[b.#&,x,t]]