Bir listemiz varsa, listeyi söyleyin, [9, 2, 4, 4, 5, 5, 7]
onun üzerinde hareketli bir ortalama yapabiliriz.
3 elemanlı bir pencere alarak, her bir elemanın yerini aşağıdaki gibi bir pencere alır: [[9], [9, 2], [9, 2, 4], [2, 4, 4], [4, 4, 5], [4, 5, 5], [5, 5, 7]]
ve sonra ortalamaları alırız [9.0, 5.5, 5.0, 3.3333333333333335, 4.333333333333333, 4.666666666666667, 5.666666666666667]
.
Şimdiye kadar oldukça basit. Ancak bu konuda fark edebileceğiniz bir şey, hareketli bir ortalama almanın listeyi "düzleştirdiği" dir. Bu şu soruyu akla getiriyor: listeyi "yeterince pürüzsüz" hale getirmek için kaç kez hareketli bir ortalama almak zorunda?
Senin görevin
Bir float listesi, bir tamsayı pencere boyutu ve bir float göz önüne alındığında, standart sapmayı o floattan daha az elde etmek için kaç kez hareketli ortalamayı almak zorunda olduğu çıktısı verilir. Bilmeyenler için standart sapma, bir veri kümesinin pürüzsüzlüğünü ölçer ve aşağıdaki formülle hesaplanabilir:
Örneğin, önceki listemizi ve maksimum stddev'ini kullanarak .5
, aşağıdaki 8
gibi yinelemeler elde ederiz:
[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]
ve stdev ile biter 0.40872556490459366
. Sadece çıktınız 8
.
Ama bir sorun var:
Cevabın negatif olması gerekmez! İlk liste zaten maksimum stddev'i karşılıyorsa, kaç tane yineleme "geriye gidebileceğinizi" ve hareketli ortalamayı geri alabileceğinizi görmeniz ve yine de listenin max stddev'i tatmin etmesini sağlamanız gerekir. İlk n
veri noktaları için pencereleri kesip bunları düşürmediğimiz için, hareketli bir ortalamayı tersine çevirmek için yeterli veri var.
Örneğin, listeyle [9.0, 8.99658203125, 8.9932148677634256, 8.9802599114806494, 8.9515728374598496, 8.8857883675880771, 8.7558358356689627]
(daha önceki 3 örneğimizden daha fazla hareketli ortalama yapılırken alınır) ve aynı pencere boyutu ve max stddev ile başlarsak, -3
hareketli ortalamayı çoğu 3
zaman tersine çevirebileceğiniz için çıktı alırsınız .
Makul I / O formatı iyidir.
Bu kod golf bayt en kısa kodu kazanır!
Test Durumları
[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