46 lines
871 B
Plaintext
46 lines
871 B
Plaintext
class MovingAverage
|
|
{
|
|
Int period
|
|
Int[] stream
|
|
|
|
new make (Int period)
|
|
{
|
|
this.period = period
|
|
stream = [,]
|
|
}
|
|
|
|
// add number to end of stream and remove numbers from start if
|
|
// stream is larger than period
|
|
public Void addNumber (Int number)
|
|
{
|
|
stream.add (number)
|
|
while (stream.size > period)
|
|
{
|
|
stream.removeAt (0)
|
|
}
|
|
}
|
|
|
|
// compute average of numbers in stream
|
|
public Float average ()
|
|
{
|
|
if (stream.isEmpty)
|
|
return 0.0f
|
|
else
|
|
1.0f * (Int)(stream.reduce(0, |a,b| { (Int) a + b })) / stream.size
|
|
}
|
|
}
|
|
|
|
class Main
|
|
{
|
|
public static Void main ()
|
|
{ // test by adding random numbers and printing average after each number
|
|
av := MovingAverage (5)
|
|
|
|
10.times |i|
|
|
{
|
|
echo ("After $i numbers list is ${av.stream} average is ${av.average}")
|
|
av.addNumber (Int.random(0..100))
|
|
}
|
|
}
|
|
}
|