From 87489795463ee1cd018e2825fa2e76b10fe4d1b4 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Thu, 3 Jan 2008 12:21:45 -0500 Subject: [PATCH] Solution to Project Euler problem 25 --- extra/project-euler/002/002.factor | 6 +-- extra/project-euler/025/025.factor | 57 ++++++++++++++++++++++++ extra/project-euler/project-euler.factor | 1 + 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 extra/project-euler/025/025.factor diff --git a/extra/project-euler/002/002.factor b/extra/project-euler/002/002.factor index 386d847e27..4449968642 100644 --- a/extra/project-euler/002/002.factor +++ b/extra/project-euler/002/002.factor @@ -20,13 +20,13 @@ IN: project-euler.002 ! -------- : last2 ( seq -- elt last ) - reverse first2 swap ; + 2 tail* first2 ; -: fib-up-to ( n -- seq ) +: fib-upto ( n -- seq ) { 0 } 1 [ pick dupd < ] [ add dup last2 + ] [ ] while drop nip ; : euler002 ( -- answer ) - 1000000 fib-up-to [ even? ] subset sum ; + 1000000 fib-upto [ even? ] subset sum ; ! [ euler002 ] 100 ave-time ! 0 ms run / 0 ms GC ave time - 100 trials diff --git a/extra/project-euler/025/025.factor b/extra/project-euler/025/025.factor new file mode 100644 index 0000000000..2da1ee6b57 --- /dev/null +++ b/extra/project-euler/025/025.factor @@ -0,0 +1,57 @@ +! Copyright (c) 2007 Aaron Schaefer. +! See http://factorcode.org/license.txt for BSD license. +USING: kernel math math.parser memoize sequences ; +IN: project-euler.025 + +! http://projecteuler.net/index.php?section=problems&id=25 + +! DESCRIPTION +! ----------- + +! The Fibonacci sequence is defined by the recurrence relation: + +! Fn = Fn-1 + Fn-2, where F1 = 1 and F2 = 1. + +! Hence the first 12 terms will be: + +! F1 = 1 +! F2 = 1 +! F3 = 2 +! F4 = 3 +! F5 = 5 +! F6 = 8 +! F7 = 13 +! F8 = 21 +! F9 = 34 +! F10 = 55 +! F11 = 89 +! F12 = 144 + +! The 12th term, F12, is the first term to contain three digits. + +! What is the first term in the Fibonacci sequence to contain 1000 digits? + + +! SOLUTION +! -------- + +MEMO: fib ( m -- n ) + dup 1 > [ 1 - dup fib swap 1 - fib + ] when ; + +string length > [ 1+ (digit-fib) ] [ nip ] if ; + +: digit-fib ( n -- term ) + 1 (digit-fib) ; + +PRIVATE> + +: euler025 ( -- answer ) + 1000 digit-fib ; + +! [ euler025 ] 10 ave-time +! 5237 ms run / 72 ms GC ave time - 10 trials + +MAIN: euler025 diff --git a/extra/project-euler/project-euler.factor b/extra/project-euler/project-euler.factor index a796ad39a1..25db0db26f 100644 --- a/extra/project-euler/project-euler.factor +++ b/extra/project-euler/project-euler.factor @@ -8,6 +8,7 @@ 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.067 project-euler.134 ; IN: project-euler