]> gitweb.factorcode.org Git - factor.git/commitdiff
Solution to Project Euler problem 25
authorAaron Schaefer <aaron@elasticdog.com>
Thu, 3 Jan 2008 17:21:45 +0000 (12:21 -0500)
committerAaron Schaefer <aaron@elasticdog.com>
Thu, 3 Jan 2008 17:21:45 +0000 (12:21 -0500)
extra/project-euler/002/002.factor
extra/project-euler/025/025.factor [new file with mode: 0644]
extra/project-euler/project-euler.factor

index 386d847e27fa74613dd99253b3d0ece0c0859d71..4449968642c73cd44d0d61d174fae0593dea054d 100644 (file)
@@ -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 (file)
index 0000000..2da1ee6
--- /dev/null
@@ -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 ;
+
+<PRIVATE
+
+: (digit-fib) ( n term -- term )
+    2dup fib number>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
index a796ad39a14e3653aa45d4f6b26282ed0ff00dbd..25db0db26fd13f62e36b981ae2d2286da5e55f55 100644 (file)
@@ -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