USING: kernel locals math math.functions math.order math.ranges sequences project-euler.c\ ommon ; IN: sr : initial ( n -- x0 ) number-length [ 1 - 2 /i 10^ ] [ odd? 2 7 ? * ] bi ; inline : xn ( n xn-1 -- xn ) [ [ 1 - + ] keep /i ] keep + 2/ ; inline : xns ( n x0 -- steps ) 0 swap [ tuck = not ] [ [ 2dup xn ] keep ] V{ } produce-as [ 2drop ] dip ; inline : find-mod ( n off m -- n' ) [ [ - ] [ /i ] bi* 1 + ] 2keep swap [ * ] [ + ] bi* ; inline : next-mod1 ( n m -- n' ) [ dup odd? [ drop 1 ] [ 1 + ] if ] keep 2 * find-mod ; inline : next-n ( n seq -- n' ) [ next-mod1 ] with map infimum ; inline : current ( n x0 -- n' length ) dupd xns [ next-n ] [ length ] bi ; inline :: compute ( high low -- total ) low initial :> x0 0 high low [| high low | low x0 current swap high min :> next next low - * + high next 2dup > ] loop 2drop ; inline : mean ( pow -- mean ) 10^ [ 10 * ] keep [ compute ] [ - / ] 2bi ; : euler255 ( -- n ) 13 mean 10 10^ [ * round ] [ / ] bi >float ;