Minor tweak to project-euler

db4
Slava Pestov 2008-04-17 12:22:04 -05:00
parent 53c8299576
commit 625d4037fe
1 changed files with 17 additions and 9 deletions

View File

@ -1,15 +1,21 @@
! Copyright (c) 2008 Eric Mertens
! See http://factorcode.org/license.txt for BSD license.
USING: kernel math sequences locals ;
USING: kernel math sequences sequences.private locals hints ;
IN: project-euler.150
<PRIVATE
! sequence helper functions
: partial-sums ( seq -- seq )
: partial-sums ( seq -- sums )
0 [ + ] accumulate swap suffix ; inline
: (partial-sum-infimum) ( inf sum elt -- inf sum )
+ [ min ] keep ; inline
: partial-sum-infimum ( seq -- seq )
0 0 rot [ (partial-sum-infimum) ] each drop ; inline
: generate ( n quot -- seq )
[ drop ] swap compose map ; inline
@ -20,25 +26,27 @@ IN: project-euler.150
! triangle generator functions
: next ( t -- new-t s )
615949 * 797807 + 1 20 shift mod dup 1 19 shift - ; inline
615949 * 797807 + 20 2^ rem dup 19 2^ - ; inline
: sums-triangle ( -- seq )
0 1000 [ 1+ [ next ] generate partial-sums ] map nip ;
0 1000 [ 1+ [ next ] generate partial-sums ] map nip ;
PRIVATE>
PRIVATE> USING: arrays kernel.private ;
:: (euler150) ( m -- n )
[let | table [ sums-triangle ] |
m [| x |
x 1+ [| y |
m x - [| z |
x z + table nth
[ y z + 1+ swap nth ]
[ y swap nth ] bi -
] map partial-sums infimum
x z + table nth-unsafe
[ y z + 1+ swap nth-unsafe ]
[ y swap nth-unsafe ] bi -
] map partial-sum-infimum
] map-infimum
] map-infimum
] ;
HINTS: (euler150) fixnum ;
: euler150 ( -- n )
1000 (euler150) ;