如果我们有一个列表,比如说list [9, 2, 4, 4, 5, 5, 7]
,我们可以在其中进行移动平均。
假设一个有3个元素的窗口,每个元素都被这样的窗口所代替:[[9], [9, 2], [9, 2, 4], [2, 4, 4], [4, 4, 5], [4, 5, 5], [5, 5, 7]]
,然后取平均值,得到[9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667]
。
到目前为止非常简单。但您可以注意到的一件事是,移动平均线可以“平滑”列表。因此,这就引出了一个问题:必须使移动平均值多少次才能使列表“足够平滑”?
你的任务
给定一个浮点数列表,一个整数窗口大小和一个浮点数,输出必须获取移动平均值才能获得小于该浮点数的标准偏差的次数。对于那些不知道的数据,标准差用于衡量一组数据的不平滑程度,可以通过以下公式计算得出:
例如,使用前面的列表和max stddev .5
,我们得到如下所示的8
迭代:
[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]
并以stdev结尾0.40872556490459366
。您只是输出8
。
但是有一个陷阱:
答案不一定非要!如果初始列表已满足最大stddev,则必须查看可以“倒退”多少次迭代并撤消移动平均值,并且列表仍满足最大stddev。由于我们正在截断初始n
数据点的窗口,而不是删除那些窗口,因此有足够的数据来反转移动平均值。
例如,如果我们从列表开始[9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627]
(取自前面的示例,对它进行了3个移动平均),并且窗口大小和最大stddev相同,则将输出,-3
因为您最多可以反转移动平均3
。
任何合理的I / O格式都可以。
这是代码高尔夫球,因此以字节为单位的最短代码胜出!
测试用例
[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