Optimize solution to Project Euler problem 28
parent
4cba26462d
commit
ccb8ad98ec
|
@ -25,35 +25,20 @@ IN: project-euler.028
|
||||||
! SOLUTION
|
! SOLUTION
|
||||||
! --------
|
! --------
|
||||||
|
|
||||||
! Noticed patterns in the diagnoal numbers starting from the origin going to
|
! For a square sized n by n, the sum of corners is 4n² - 6n + 6
|
||||||
! the corners and used these instead of generating the entire spiral:
|
|
||||||
! ne -> (2n + 1)² from 0 .. n
|
|
||||||
! se -> (4 * n²) - (10 * n) + 7 from 1 .. n
|
|
||||||
! sw -> (4 * n²) + 1 from 0 .. n
|
|
||||||
! nw -> (4 * n²) - (6 * n) + 3 from 1 .. n
|
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: ne ( m -- n )
|
: sum-corners ( n -- sum )
|
||||||
2 * 1+ sq ;
|
dup 1 = [ [ sq 4 * ] keep 6 * - 6 + ] unless ;
|
||||||
|
|
||||||
: se ( m -- n )
|
: sum-diags ( n -- sum )
|
||||||
[ sq 4 * ] keep 10 * - 7 + ;
|
1 swap 2 <range> [ sum-corners ] sigma ;
|
||||||
|
|
||||||
: sw ( m -- n )
|
|
||||||
sq 4 * 1+ ;
|
|
||||||
|
|
||||||
: nw ( m -- n )
|
|
||||||
[ sq 4 * ] keep 6 * - 3 + ;
|
|
||||||
|
|
||||||
: spiral-diags ( n -- sum )
|
|
||||||
1+ 2 / [ [ ne ] sigma ] keep [ [ sw ] sigma ] keep
|
|
||||||
[1,b] [ [ se ] sigma ] keep [ nw ] sigma 3 - [ + ] 3apply ;
|
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: euler028 ( -- answer )
|
: euler028 ( -- answer )
|
||||||
1001 spiral-diags ;
|
1001 sum-diags ;
|
||||||
|
|
||||||
! [ euler027 ] 100 ave-time
|
! [ euler027 ] 100 ave-time
|
||||||
! 0 ms run / 0 ms GC ave time - 100 trials
|
! 0 ms run / 0 ms GC ave time - 100 trials
|
||||||
|
|
Loading…
Reference in New Issue