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