]> gitweb.factorcode.org Git - factor.git/commitdiff
project-euler.{073,085}: speed up and reduce memory consumption
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sat, 12 Sep 2009 06:30:46 +0000 (01:30 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Sat, 12 Sep 2009 06:30:46 +0000 (01:30 -0500)
extra/project-euler/073/073.factor
extra/project-euler/085/085.factor

index c7e88057226c21b4a632361fb78a65be8dc8c93a..8ab0b171904a2018028cca711e23847fe9fca93b 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (c) 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel locals make math project-euler.common sequences ;
+USING: kernel locals math project-euler.common sequences ;
 IN: project-euler.073
 
 ! http://projecteuler.net/index.php?section=problems&id=73
@@ -32,19 +32,19 @@ IN: project-euler.073
 
 <PRIVATE
 
-:: (euler073) ( limit lo hi -- )
+:: (euler073) ( counter limit lo hi -- counter' )
     [let | m [ lo hi mediant ] |
         m denominator limit <= [
-            m ,
+            counter 1 +
             limit lo m (euler073)
             limit m hi (euler073)
-        ] when
+        ] [ counter ] if
     ] ;
 
 PRIVATE>
 
 : euler073 ( -- answer )
-    [ 10000 1/3 1/2 (euler073) ] { } make length ;
+    0 10000 1/3 1/2 (euler073) ;
 
 ! [ euler073 ] 10 ave-time
 ! 20506 ms ave run time - 937.07 SD (10 trials)
index bd09203da568a65a3190aacc7fd9d2ef4e0ba921..6c70f65bf7ad7ecf810dfbb1de1e613f9afb73f1 100644 (file)
@@ -1,6 +1,7 @@
 ! Copyright (c) 2009 Guillaume Nargeot.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays kernel math math.ranges project-euler.common sequences ;
+USING: accessors kernel math math.ranges project-euler.common
+sequences locals ;
 IN: project-euler.085
 
 ! http://projecteuler.net/index.php?section=problems&id=85
@@ -23,28 +24,31 @@ IN: project-euler.085
 <PRIVATE
 
 : distance ( m -- n )
-    2000000 - abs ;
+    2000000 - abs ; inline
 
 : rectangles-count ( a b -- n )
-    2dup [ 1 + ] bi@ * * * 4 / ;
+    2dup [ 1 + ] bi@ * * * 4 /i ; inline
 
-: unique-products ( a b -- seq )
-    tuck [a,b] [
-        over dupd [a,b] [ 2array ] with map
-    ] map concat nip ;
+:: each-unique-product ( a b quot: ( i j -- ) -- )
+    a b [a,b] [| i |
+        i b [a,b] [| j |
+            i j quot call
+        ] each
+    ] each ; inline
 
-: max-by-last ( seq seq -- seq )
-    [ [ last ] bi@ < ] most ;
+TUPLE: result { area read-only } { distance read-only } ;
 
-: array2 ( seq -- a b )
-    [ first ] [ last ] bi ;
+C: <result> result
 
-: convert ( seq -- seq )
-    array2 [ * ] [ rectangles-count distance ] 2bi 2array ;
+: min-by-distance ( seq seq -- seq )
+    [ [ distance>> ] bi@ < ] most ; inline
+
+: compute-result ( i j -- pair )
+    [ * ] [ rectangles-count distance ] 2bi <result> ; inline
 
 : area-of-nearest ( -- n )
-    1 2000 unique-products
-    [ convert ] [ max-by-last ] map-reduce first ;
+    T{ result f 0 2000000 } 1 2000
+    [ compute-result min-by-distance ] each-unique-product area>> ;
 
 PRIVATE>