! http://phildawes.net/blog/2009/03/30/factor-makes-you-write-better-code/ IN: sma USING: arrays kernel math math.order math.ranges math.vectors sequences ; : partial-sums ( seq -- newseq ) 0 [ + ] accumulate swap suffix rest ; : sliding-partial-sums ( seq n -- newseq ) dupd 0 prepend v- partial-sums ; : plateau ( len n -- seq ) [ min [1,b] ] [ - 0 max ] [ nip ] 2tri append ; : sma ( seq n -- newseq ) [ sliding-partial-sums ] [ [ length ] dip plateau ] 2bi v/ ;