]> gitweb.factorcode.org Git - factor.git/commitdiff
Solution to Project Euler problem 40
authorAaron Schaefer <aaron@elasticdog.com>
Sat, 2 Feb 2008 23:53:32 +0000 (18:53 -0500)
committerAaron Schaefer <aaron@elasticdog.com>
Sat, 2 Feb 2008 23:53:32 +0000 (18:53 -0500)
extra/project-euler/040/040.factor [new file with mode: 0644]
extra/project-euler/075/075.factor
extra/project-euler/project-euler.factor

diff --git a/extra/project-euler/040/040.factor b/extra/project-euler/040/040.factor
new file mode 100644 (file)
index 0000000..8984559
--- /dev/null
@@ -0,0 +1,51 @@
+! Copyright (c) 2008 Aaron Schaefer.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel math math.parser sequences strings ;
+IN: project-euler.040
+
+! http://projecteuler.net/index.php?section=problems&id=40
+
+! DESCRIPTION
+! -----------
+
+! An irrational decimal fraction is created by concatenating the positive
+! integers:
+
+!     0.123456789101112131415161718192021...
+
+! It can be seen that the 12th digit of the fractional part is 1.
+
+! If dn represents the nth digit of the fractional part, find the value of the
+! following expression.
+
+!     d1 × d10 × d100 × d1000 × d10000 × d100000 × d1000000
+
+
+! SOLUTION
+! --------
+
+<PRIVATE
+
+: (concat-upto) ( n limit str -- str )
+    2dup length > [
+        pick number>string over push-all rot 1+ -rot (concat-upto)
+    ] [
+        2nip
+    ] if ;
+
+: concat-upto ( n -- str )
+    SBUF" " clone 1 -rot (concat-upto) ;
+
+: nth-integer ( n str -- m )
+    [ 1- ] dip nth 1string 10 string>integer ;
+
+PRIVATE>
+
+: euler040 ( -- answer )
+    1000000 concat-upto { 1 10 100 1000 10000 100000 1000000 }
+    [ swap nth-integer ] with map product ;
+
+! [ euler040 ] 100 ave-time
+! 1002 ms run / 43 ms GC ave time - 100 trials
+
+MAIN: euler040
index f8ee9d50db0f03a62ed467622c843f604c4c0f1d..8399235c0dc5988e5a31f0f3deb10c769f8bc961 100644 (file)
@@ -39,8 +39,8 @@ IN: project-euler.075
 ! Basically, this makes an array of 1000000 zeros, recursively creates
 ! primitive triples using the three transforms and then increments the array at
 ! index [a+b+c] by one for each triple's sum AND its multiples under 1000000
-! (to account for non-primitive triples). The answer is just the number of
-! indexes that equal one.
+! (to account for non-primitive triples). The answer is just the total number
+! of indexes that are equal to one.
 
 SYMBOL: p-count
 
index f5766536ef7c0fb8c38a306eec0ce8806bdd5a4d..eb9d7d130057ec5034a7fc13ea561fecefca9566 100644 (file)
@@ -11,9 +11,9 @@ USING: definitions io io.files kernel math math.parser project-euler.ave-time
     project-euler.025 project-euler.026 project-euler.027 project-euler.028
     project-euler.029 project-euler.030 project-euler.031 project-euler.032
     project-euler.033 project-euler.034 project-euler.035 project-euler.036
-    project-euler.037 project-euler.038 project-euler.039 project-euler.067
-    project-euler.075 project-euler.134 project-euler.169 project-euler.173
-    project-euler.175 ;
+    project-euler.037 project-euler.038 project-euler.039 project-euler.040
+    project-euler.067 project-euler.075 project-euler.134 project-euler.169
+    project-euler.173 project-euler.175 ;
 IN: project-euler
 
 <PRIVATE