! http://phildawes.net/blog/2009/03/30/factor-makes-you-write-better-code/ IN: sma USING: kernel sequences math arrays math.ranges math.order ; : partial-sums ( seq -- newseq ) 0 [ + ] accumulate swap suffix 1 tail ; : differences ( seq seq -- newseq ) [ - ] 2map ; : prepad ( seq n elt -- newseq ) prepend ; : sliding-partial-sums ( seq n -- newseq ) dupd 0 prepad differences 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 [ / ] 2map ;