Solution to Project Euler problem 28

db4
Aaron Schaefer 2008-01-17 23:37:10 -05:00
parent a02ee715c1
commit 4cba26462d
3 changed files with 68 additions and 3 deletions

View File

@ -38,7 +38,10 @@ IN: project-euler.027
! b must be prime since n = 0 must return a prime
! a + b + 1 must be prime since n = 1 must return a prime
! a < b
! 1 - a + b must be prime as well, hence >= 2. Therefore:
! 1 - a + b >= 2
! b - a >= 1
! a < b
<PRIVATE

View File

@ -0,0 +1,61 @@
! Copyright (c) 2007 Aaron Schaefer.
! See http://factorcode.org/license.txt for BSD license.
USING: combinators.lib kernel math math.ranges ;
IN: project-euler.028
! http://projecteuler.net/index.php?section=problems&id=28
! DESCRIPTION
! -----------
! Starting with the number 1 and moving to the right in a clockwise direction a
! 5 by 5 spiral is formed as follows:
! 21 22 23 24 25
! 20 7 8 9 10
! 19 6 1 2 11
! 18 5 4 3 12
! 17 16 15 14 13
! It can be verified that the sum of both diagonals is 101.
! What is the sum of both diagonals in a 1001 by 1001 spiral formed in the same way?
! SOLUTION
! --------
! Noticed patterns in the diagnoal numbers starting from the origin going to
! 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
: ne ( m -- n )
2 * 1+ sq ;
: se ( m -- n )
[ sq 4 * ] keep 10 * - 7 + ;
: 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>
: euler028 ( -- answer )
1001 spiral-diags ;
! [ euler027 ] 100 ave-time
! 0 ms run / 0 ms GC ave time - 100 trials
MAIN: euler028

View File

@ -8,8 +8,9 @@ USING: definitions io io.files kernel math.parser sequences vocabs
project-euler.013 project-euler.014 project-euler.015 project-euler.016
project-euler.017 project-euler.018 project-euler.019 project-euler.020
project-euler.021 project-euler.022 project-euler.023 project-euler.024
project-euler.025 project-euler.026 project-euler.027 project-euler.067
project-euler.134 project-euler.169 project-euler.173 project-euler.175 ;
project-euler.025 project-euler.026 project-euler.027 project-euler.028
project-euler.067 project-euler.134 project-euler.169 project-euler.173
project-euler.175 ;
IN: project-euler
<PRIVATE