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