Averages/Simple moving average: Difference between revisions

Content added Content deleted
(Added Kotlin)
(→‎{{header|zkl}}: re-write to match task description)
Line 4,212: Line 4,212:


=={{header|zkl}}==
=={{header|zkl}}==
<lang zkl>class [static] SMA{var P=3,ns=L(); // only one instance of this class
fcn init(n){
if(P<ns.append(n.toFloat()).len()) ns.del(0);
returnClass(ns.sum(0.0)/ns.len()); // return average, not Class
}
fcn reset(p){P=p;ns=L();} // to make examples easier
}</lang>
<lang zkl>zkl: T(1,2,3,4,5,5,4,3,2,1).apply(SMA)
L(1,1.5,2,3,4,4.66667,4.66667,4,3,2)

zkl: SMA.reset(5)
zkl: T(1,2,3,4,5,5,4,3,2,1).apply(SMA)
L(1,1.5,2,2.5,3,3.8,4.2,4.2,3.8,3)</lang>
Using a closure and creating a function
<lang zkl>fcn SMA(P){
<lang zkl>fcn SMA(P){
fcn(n,ns,P){ if(P<ns.append(n.toFloat()).len()) ns.del(0);
fcn(n,ns,P){
ns.sum(0.0)/ns.len()
sz:=ns.append(n.toFloat()).len();
}.fp1(L(),P)
if(P>sz) return(0);
if(P<sz) ns.del(0);
ns.sum(0.0)/P;
}.fp1(List.createLong(P+1),P) // pre-allocate a list of length P+1
}</lang>
}</lang>
fp1 creates a partial application fixing the (in this case) the second and third
<lang zkl>zkl: T(1,2,3,4,5,5,4,3,2,1).apply(SMA(3))
parameters
L(1,1.5,2,3,4,4.66667,4.66667,4,3,2)
<lang zkl>T(1,2,3,4,5,5,4,3,2,1).apply(SMA(3)).println();

zkl: T(1,2,3,4,5,5,4,3,2,1).apply(SMA(5))
T(1,2,3,4,5,5,4,3,2,1).apply(SMA(5)).println();</lang>
{{out}}
L(1,1.5,2,2.5,3,3.8,4.2,4.2,3.8,3)</lang>
<pre>
L(0,0,2,3,4,4.66667,4.66667,4,3,2)
L(0,0,0,0,3,3.8,4.2,4.2,3.8,3)
</pre>