]> gitweb.factorcode.org Git - factor.git/blobdiff - extra/project-euler/023/023.factor
factor: trim using lists
[factor.git] / extra / project-euler / 023 / 023.factor
index 0554f033f3531fa1c597be5bfd67bcf8abb38873..7d8961ec6d8adbdd959602d1b3b0d41d9165d253 100644 (file)
@@ -1,7 +1,7 @@
-! Copyright (c) 2007 Aaron Schaefer.
+! Copyright (c) 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: hashtables kernel math math.ranges project-euler.common sequences
-    sorting ;
+USING: kernel math ranges project-euler.common
+sequences sets ;
 IN: project-euler.023
 
 ! http://projecteuler.net/index.php?section=problems&id=23
@@ -31,27 +31,29 @@ IN: project-euler.023
 ! SOLUTION
 ! --------
 
-<PRIVATE
-
 ! The upper limit can be dropped to 20161 which reduces our search space
 ! and every even number > 46 can be expressed as a sum of two abundants
+
+<PRIVATE
+
 : source-023 ( -- seq )
-    46 [1,b] 47 20161 2 <range> append ;
+    46 [1..b] 47 20161 2 <range> append ;
 
-: abundants-below ( n -- seq )
-    [1,b] [ abundant? ] subset ;
+: abundants-upto ( n -- seq )
+    [1..b] [ abundant? ] filter ;
 
 : possible-sums ( seq -- seq )
-    dup { } -rot [
-        dupd [ + ] curry map rot append prune swap 1 tail
-    ] each drop natural-sort ;
+    HS{ } clone
+    [ dupd '[ _ [ + _ adjoin ] with each ] each ]
+    keep members ;
 
 PRIVATE>
 
 : euler023 ( -- answer )
-    20161 abundants-below possible-sums source-023 seq-diff sum ;
+    source-023
+    20161 abundants-upto possible-sums diff sum ;
 
 ! [ euler023 ] time
-! 52780 ms run / 3839 ms GC
+! 2.15542 seconds
 
-MAIN: euler023
+SOLUTION: euler023