]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'master' of git://projects.elasticdog.com/git/factor
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Thu, 6 Nov 2008 08:00:08 +0000 (02:00 -0600)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Thu, 6 Nov 2008 08:00:08 +0000 (02:00 -0600)
145 files changed:
extra/math/analysis/analysis.factor
extra/math/text/english/english.factor
extra/project-euler/001/001-tests.factor [new file with mode: 0644]
extra/project-euler/002/002-tests.factor [new file with mode: 0644]
extra/project-euler/002/002.factor
extra/project-euler/003/003-tests.factor [new file with mode: 0644]
extra/project-euler/003/003.factor
extra/project-euler/004/004-tests.factor [new file with mode: 0644]
extra/project-euler/004/004.factor
extra/project-euler/005/005-tests.factor [new file with mode: 0644]
extra/project-euler/005/005.factor
extra/project-euler/006/006-tests.factor [new file with mode: 0644]
extra/project-euler/006/006.factor
extra/project-euler/007/007-tests.factor [new file with mode: 0644]
extra/project-euler/007/007.factor
extra/project-euler/008/008-tests.factor [new file with mode: 0644]
extra/project-euler/008/008.factor
extra/project-euler/009/009-tests.factor [new file with mode: 0644]
extra/project-euler/009/009.factor
extra/project-euler/010/010-tests.factor [new file with mode: 0644]
extra/project-euler/010/010.factor
extra/project-euler/011/011-tests.factor [new file with mode: 0644]
extra/project-euler/011/011.factor
extra/project-euler/012/012-tests.factor [new file with mode: 0644]
extra/project-euler/012/012.factor
extra/project-euler/013/013-tests.factor [new file with mode: 0644]
extra/project-euler/013/013.factor
extra/project-euler/014/014-tests.factor [new file with mode: 0644]
extra/project-euler/014/014.factor
extra/project-euler/015/015-tests.factor [new file with mode: 0644]
extra/project-euler/015/015.factor
extra/project-euler/016/016-tests.factor [new file with mode: 0644]
extra/project-euler/016/016.factor
extra/project-euler/017/017-tests.factor [new file with mode: 0644]
extra/project-euler/017/017.factor
extra/project-euler/018/018-tests.factor [new file with mode: 0644]
extra/project-euler/018/018.factor
extra/project-euler/019/019-tests.factor [new file with mode: 0644]
extra/project-euler/019/019.factor
extra/project-euler/020/020-tests.factor [new file with mode: 0644]
extra/project-euler/020/020.factor
extra/project-euler/021/021-tests.factor [new file with mode: 0644]
extra/project-euler/021/021.factor
extra/project-euler/022/022-tests.factor [new file with mode: 0644]
extra/project-euler/022/022.factor
extra/project-euler/023/023-tests.factor [new file with mode: 0644]
extra/project-euler/023/023.factor
extra/project-euler/024/024-tests.factor [new file with mode: 0644]
extra/project-euler/024/024.factor
extra/project-euler/025/025-tests.factor [new file with mode: 0644]
extra/project-euler/025/025.factor
extra/project-euler/026/026-tests.factor [new file with mode: 0644]
extra/project-euler/026/026.factor
extra/project-euler/027/027-tests.factor [new file with mode: 0644]
extra/project-euler/027/027.factor
extra/project-euler/028/028-tests.factor [new file with mode: 0644]
extra/project-euler/028/028.factor
extra/project-euler/029/029-tests.factor [new file with mode: 0644]
extra/project-euler/029/029.factor
extra/project-euler/030/030-tests.factor [new file with mode: 0644]
extra/project-euler/030/030.factor
extra/project-euler/031/031-tests.factor [new file with mode: 0644]
extra/project-euler/031/031.factor
extra/project-euler/032/032-tests.factor [new file with mode: 0644]
extra/project-euler/032/032.factor
extra/project-euler/033/033-tests.factor [new file with mode: 0644]
extra/project-euler/033/033.factor
extra/project-euler/034/034-tests.factor [new file with mode: 0644]
extra/project-euler/034/034.factor
extra/project-euler/035/035-tests.factor [new file with mode: 0644]
extra/project-euler/035/035.factor
extra/project-euler/036/036-tests.factor [new file with mode: 0644]
extra/project-euler/036/036.factor
extra/project-euler/037/037-tests.factor [new file with mode: 0644]
extra/project-euler/037/037.factor
extra/project-euler/038/038-tests.factor [new file with mode: 0644]
extra/project-euler/038/038.factor
extra/project-euler/039/039-tests.factor [new file with mode: 0644]
extra/project-euler/039/039.factor
extra/project-euler/040/040-tests.factor [new file with mode: 0644]
extra/project-euler/040/040.factor
extra/project-euler/041/041-tests.factor [new file with mode: 0644]
extra/project-euler/041/041.factor
extra/project-euler/042/042-tests.factor [new file with mode: 0644]
extra/project-euler/042/042.factor
extra/project-euler/043/043-tests.factor [new file with mode: 0644]
extra/project-euler/043/043.factor
extra/project-euler/044/044-tests.factor [new file with mode: 0644]
extra/project-euler/044/044.factor
extra/project-euler/045/045-tests.factor [new file with mode: 0644]
extra/project-euler/045/045.factor
extra/project-euler/046/046-tests.factor [new file with mode: 0644]
extra/project-euler/046/046.factor
extra/project-euler/047/047-tests.factor [new file with mode: 0644]
extra/project-euler/047/047.factor
extra/project-euler/048/048-tests.factor [new file with mode: 0644]
extra/project-euler/052/052-tests.factor [new file with mode: 0644]
extra/project-euler/052/052.factor
extra/project-euler/053/053-tests.factor [new file with mode: 0644]
extra/project-euler/053/053.factor
extra/project-euler/055/055-tests.factor [new file with mode: 0644]
extra/project-euler/055/055.factor
extra/project-euler/056/056-tests.factor [new file with mode: 0644]
extra/project-euler/056/056.factor
extra/project-euler/059/059-tests.factor [new file with mode: 0644]
extra/project-euler/059/059.factor
extra/project-euler/067/067-tests.factor [new file with mode: 0644]
extra/project-euler/067/067.factor
extra/project-euler/075/075-tests.factor [new file with mode: 0644]
extra/project-euler/075/075.factor
extra/project-euler/076/076-tests.factor [new file with mode: 0644]
extra/project-euler/076/076.factor
extra/project-euler/079/079-tests.factor [new file with mode: 0644]
extra/project-euler/079/079.factor
extra/project-euler/092/092-tests.factor [new file with mode: 0644]
extra/project-euler/092/092.factor
extra/project-euler/097/097-tests.factor [new file with mode: 0644]
extra/project-euler/097/097.factor
extra/project-euler/100/100-tests.factor [new file with mode: 0644]
extra/project-euler/100/100.factor
extra/project-euler/116/116-tests.factor [new file with mode: 0644]
extra/project-euler/116/116.factor
extra/project-euler/117/117-tests.factor [new file with mode: 0644]
extra/project-euler/117/117.factor
extra/project-euler/134/134-tests.factor [new file with mode: 0644]
extra/project-euler/134/134.factor
extra/project-euler/148/148-tests.factor [new file with mode: 0644]
extra/project-euler/148/148.factor
extra/project-euler/150/150-tests.factor [new file with mode: 0644]
extra/project-euler/150/150.factor
extra/project-euler/164/164-tests.factor [new file with mode: 0644]
extra/project-euler/164/164.factor
extra/project-euler/169/169-tests.factor [new file with mode: 0644]
extra/project-euler/169/169.factor
extra/project-euler/173/173-tests.factor [new file with mode: 0644]
extra/project-euler/173/173.factor
extra/project-euler/175/175-tests.factor [new file with mode: 0644]
extra/project-euler/175/175.factor
extra/project-euler/186/186-tests.factor [new file with mode: 0644]
extra/project-euler/186/186.factor
extra/project-euler/190/190-tests.factor [new file with mode: 0644]
extra/project-euler/190/190.factor
extra/project-euler/ave-time/ave-time.factor
extra/project-euler/common/common.factor
extra/project-euler/project-euler.factor

index 7da1c96b611f339d1ead03010482573555285f0d..b5f6a547bac77064cc8c259665e68715842a0fde 100755 (executable)
@@ -1,7 +1,7 @@
-! Copyright (C) 2008 Doug Coleman, Slava Pestov.
+! Copyright (C) 2008 Doug Coleman, Slava Pestov, Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math math.constants math.functions math.intervals
-math.vectors namespaces sequences combinators.short-circuit ;
+USING: combinators.short-circuit kernel math math.constants math.functions
+    math.vectors sequences ;
 IN: math.analysis
 
 <PRIVATE
@@ -14,7 +14,7 @@ IN: math.analysis
 : gamma-p6
     {
         2.50662827563479526904 225.525584619175212544 -268.295973841304927459
-        80.9030806934622512966 -5.00757863970517583837 0.0114684895434781459556 
+        80.9030806934622512966 -5.00757863970517583837 0.0114684895434781459556
     } ; inline
 
 : gamma-z ( x n -- seq )
@@ -22,16 +22,16 @@ IN: math.analysis
 
 : (gamma-lanczos6) ( x -- log[gamma[x+1]] )
     #! log(gamma(x+1)
-    [ 0.5 + dup gamma-g6 + dup [ log * ] dip - ]
+    [ 0.5 + dup gamma-g6 + [ log * ] keep - ]
     [ 6 gamma-z gamma-p6 v. log ] bi + ;
 
 : gamma-lanczos6 ( x -- gamma[x] )
     #! gamma(x) = gamma(x+1) / x
-    dup (gamma-lanczos6) exp swap / ;
+    [ (gamma-lanczos6) exp ] keep / ;
 
 : gammaln-lanczos6 ( x -- gammaln[x] )
     #! log(gamma(x)) = log(gamma(x+1)) - log(x)
-    dup (gamma-lanczos6) swap log - ;
+    [ (gamma-lanczos6) ] keep log - ;
 
 : gamma-neg ( gamma[abs[x]] x -- gamma[x] )
     dup pi * sin * * pi neg swap / ; inline
@@ -42,22 +42,22 @@ PRIVATE>
     #! gamma(x) = integral 0..inf [ t^(x-1) exp(-t) ] dt
     #! gamma(n+1) = n! for n > 0
     dup { [ 0.0 <= ] [ 1.0 mod zero? ] } 1&& [
-            drop 1./0.
-        ] [
-            dup abs gamma-lanczos6 swap dup 0 > [ drop ] [ gamma-neg ] if
+        drop 1./0.
+    ] [
+        [ abs gamma-lanczos6 ] keep dup 0 > [ drop ] [ gamma-neg ] if
     ] if ;
 
 : gammaln ( x -- gamma[x] )
     #! gammaln(x) is an alternative when gamma(x)'s range
     #! varies too widely
     dup 0 < [
-            drop 1./0.
-        ] [
-            dup abs gammaln-lanczos6 swap dup 0 > [ drop ] [ gamma-neg ] if
+        drop 1./0.
+    ] [
+        [ abs gammaln-lanczos6 ] keep dup 0 > [ drop ] [ gamma-neg ] if
     ] if ;
 
 : nth-root ( n x -- y )
-    [ recip ] dip swap ^ ;
+    swap recip ^ ;
 
 ! Forth Scientific Library Algorithm #1
 !
@@ -116,6 +116,6 @@ PRIVATE>
 
 : stirling-fact ( n -- fact )
     [ pi 2 * * sqrt ]
-    [ dup e / swap ^ ]
-    [ 12 * recip 1 + ]
-    tri * * ;
+    [ [ e / ] keep ^ ]
+    [ 12 * recip 1+ ] tri * * ;
+
index 439d0a75fe9c01686a3706c07a9394ecd7ed1c53..dfb0c00388398fbc2526ad3115b10571b497653c 100755 (executable)
@@ -1,7 +1,7 @@
-! Copyright (c) 2007 Aaron Schaefer.
+! Copyright (c) 2007, 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: combinators.lib kernel math math.functions math.parser namespaces
-sequences splitting grouping combinators.short-circuit ;
+USING: combinators.short-circuit grouping kernel math math.parser namespaces
+    sequences ;
 IN: math.text.english
 
 <PRIVATE
@@ -52,13 +52,11 @@ SYMBOL: and-needed?
     ] if ;
 
 : 3digits>text ( n -- str )
-    dup hundreds-place swap tens-place append ;
+    [ hundreds-place ] [ tens-place ] bi append ;
 
 : text-with-scale ( index seq -- str )
-    dupd nth 3digits>text swap
-    scale-numbers [
-        " " swap 3append
-    ] unless-empty ;
+    [ nth 3digits>text ] [ drop scale-numbers ] 2bi
+    [ " " swap 3append ] unless-empty ;
 
 : append-with-conjunction ( str1 str2 -- newstr )
     over length zero? [
@@ -68,20 +66,19 @@ SYMBOL: and-needed?
         and-needed? off
     ] if ;
 
-: (recombine) ( str index seq -- newstr seq )
+: (recombine) ( str index seq -- newstr )
     2dup nth zero? [
-        nip
+        2drop
     ] [
-        [ text-with-scale ] keep
-        -rot append-with-conjunction swap
+        text-with-scale append-with-conjunction
     ] if ;
 
 : recombine ( seq -- str )
     dup length 1 = [
         first 3digits>text
     ] [
-        dup set-conjunction "" swap
-        dup length [ swap (recombine) ] each drop
+        [ set-conjunction "" ] [ length ] [ ] tri
+        [ (recombine) ] curry each
     ] if ;
 
 : (number>text) ( n -- str )
diff --git a/extra/project-euler/001/001-tests.factor b/extra/project-euler/001/001-tests.factor
new file mode 100644 (file)
index 0000000..8d2461a
--- /dev/null
@@ -0,0 +1,6 @@
+USING: project-euler.001 tools.test ;
+IN: project-euler.001.tests
+
+[ 233168 ] [ euler001 ] unit-test
+[ 233168 ] [ euler001a ] unit-test
+[ 233168 ] [ euler001b ] unit-test
diff --git a/extra/project-euler/002/002-tests.factor b/extra/project-euler/002/002-tests.factor
new file mode 100644 (file)
index 0000000..bb02518
--- /dev/null
@@ -0,0 +1,5 @@
+USING: project-euler.002 tools.test ;
+IN: project-euler.002.tests
+
+[ 4613732 ] [ euler002 ] unit-test
+[ 4613732 ] [ euler002a ] unit-test
index 7bd77a2f6817f9db66c8954353d6bb5a425409a4..fae535cba9dfaaf39b9290959b520f7c54585bc3 100644 (file)
@@ -13,7 +13,8 @@ IN: project-euler.002
 
 !     1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
 
-! Find the sum of all the even-valued terms in the sequence which do not exceed one million.
+! Find the sum of all the even-valued terms in the sequence which do not exceed
+! four million.
 
 
 ! SOLUTION
@@ -30,10 +31,10 @@ PRIVATE>
     V{ 0 } clone 1 rot (fib-upto) ;
 
 : euler002 ( -- answer )
-    1000000 fib-upto [ even? ] filter sum ;
+    4000000 fib-upto [ even? ] filter sum ;
 
 ! [ euler002 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.22 SD (100 trials)
 
 
 ! ALTERNATE SOLUTIONS
@@ -44,9 +45,9 @@ PRIVATE>
     but-last-slice { 0 1 } prepend ;
 
 : euler002a ( -- answer )
-    1000000 fib-upto* [ even? ] filter sum ;
+    4000000 fib-upto* [ even? ] filter sum ;
 
 ! [ euler002a ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.2 SD (100 trials)
 
 MAIN: euler002a
diff --git a/extra/project-euler/003/003-tests.factor b/extra/project-euler/003/003-tests.factor
new file mode 100644 (file)
index 0000000..ab136a8
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.003 tools.test ;
+IN: project-euler.003.tests
+
+[ 6857 ] [ euler003 ] unit-test
index afc4069aeef1f8b7a132cd278ea2a7d5d0f9fe72..09374bcee302d26c26b4e01bc00e5a5460e25a40 100644 (file)
@@ -10,16 +10,16 @@ IN: project-euler.003
 
 ! The prime factors of 13195 are 5, 7, 13 and 29.
 
-! What is the largest prime factor of the number 317584931803?
+! What is the largest prime factor of the number 600851475143 ?
 
 
 ! SOLUTION
 ! --------
 
 : euler003 ( -- answer )
-    317584931803 factors supremum ;
+    600851475143 factors supremum ;
 
 ! [ euler003 ] 100 ave-time
-! 1 ms run / 0 ms GC ave time - 100 trials
+! 1 ms ave run time - 0.49 SD (100 trials)
 
 MAIN: euler003
diff --git a/extra/project-euler/004/004-tests.factor b/extra/project-euler/004/004-tests.factor
new file mode 100644 (file)
index 0000000..6640e7e
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.004 tools.test ;
+IN: project-euler.004.tests
+
+[ 906609 ] [ euler004 ] unit-test
index 1f268f15001743ed1488d018b69affa130b4707a..eb5f97b2de3586f2ead2f533009fca867799ed51 100644 (file)
@@ -32,6 +32,6 @@ PRIVATE>
     source-004 dup cartesian-product [ product ] map prune max-palindrome ;
 
 ! [ euler004 ] 100 ave-time
-! 1608 ms run / 102 ms GC ave time - 100 trials
+! 1164 ms ave run time - 39.35 SD (100 trials)
 
 MAIN: euler004
diff --git a/extra/project-euler/005/005-tests.factor b/extra/project-euler/005/005-tests.factor
new file mode 100644 (file)
index 0000000..1d17b2e
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.005 tools.test ;
+IN: project-euler.005.tests
+
+[ 232792560 ] [ euler005 ] unit-test
index 0d8f11f2439c9c714e78d7bfc3adbee4c838572a..8b446f237628f8545c1e1454ea0b1c5f7b071c8c 100644 (file)
@@ -21,6 +21,6 @@ IN: project-euler.005
     20 1 [ 1+ lcm ] reduce ;
 
 ! [ euler005 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.14 SD (100 trials)
 
 MAIN: euler005
diff --git a/extra/project-euler/006/006-tests.factor b/extra/project-euler/006/006-tests.factor
new file mode 100644 (file)
index 0000000..56fbbd3
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.006 tools.test ;
+IN: project-euler.006.tests
+
+[ 25164150 ] [ euler006 ] unit-test
index fb4fb954fa622a82a325c33dd28ef2162a5e568c..21493536583ae4a4287c602adde37f9e645e78df 100644 (file)
@@ -1,6 +1,6 @@
-! Copyright (c) 2007 Aaron Schaefer.
+! Copyright (c) 2007, 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math math.functions math.ranges sequences ;
+USING: kernel math math.ranges sequences ;
 IN: project-euler.006
 
 ! http://projecteuler.net/index.php?section=problems&id=6
@@ -35,9 +35,9 @@ IN: project-euler.006
 PRIVATE>
 
 : euler006 ( -- answer )
-    1 100 [a,b] dup sum-of-squares swap square-of-sum - abs ;
+    100 [1,b] [ sum-of-squares ] [ square-of-sum ] bi - abs ;
 
 ! [ euler006 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.24 SD (100 trials)
 
 MAIN: euler006
diff --git a/extra/project-euler/007/007-tests.factor b/extra/project-euler/007/007-tests.factor
new file mode 100644 (file)
index 0000000..ab2bf15
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.007 tools.test ;
+IN: project-euler.007.tests
+
+[ 104743 ] [ euler007 ] unit-test
index 04686a8328766d133f6ab69558870f3e972e06a7..f2b659fe94d32f9e21cc7a35526c519f03f9347e 100644 (file)
@@ -24,6 +24,6 @@ IN: project-euler.007
     10001 nth-prime ;
 
 ! [ euler007 ] 100 ave-time
-! 10 ms run / 0 ms GC ave time - 100 trials
+! 5 ms ave run time - 1.13 SD (100 trials)
 
 MAIN: euler007
diff --git a/extra/project-euler/008/008-tests.factor b/extra/project-euler/008/008-tests.factor
new file mode 100644 (file)
index 0000000..15fd9f4
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.008 tools.test ;
+IN: project-euler.008.tests
+
+[ 40824 ] [ euler008 ] unit-test
index 8b32d5651e5069be3c6dfc260e8f376115a5b936..24ccbb443a8bdb83d4b2b3a844366ed5fe2f4a04 100644 (file)
@@ -1,6 +1,6 @@
-! Copyright (c) 2007 Aaron Schaefer.
+! Copyright (c) 2007, 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: math.parser project-euler.common sequences ;
+USING: grouping math.parser sequences ;
 IN: project-euler.008
 
 ! http://projecteuler.net/index.php?section=problems&id=8
@@ -64,9 +64,9 @@ IN: project-euler.008
 PRIVATE>
 
 : euler008 ( -- answer )
-    source-008 5 collect-consecutive [ string>digits product ] map supremum ;
+    source-008 5 clump [ string>digits product ] map supremum ;
 
 ! [ euler008 ] 100 ave-time
-! 11 ms run / 0 ms GC ave time - 100 trials
+! 2 ms ave run time - 0.79 SD (100 trials)
 
 MAIN: euler008
diff --git a/extra/project-euler/009/009-tests.factor b/extra/project-euler/009/009-tests.factor
new file mode 100644 (file)
index 0000000..20be369
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.009 tools.test ;
+IN: project-euler.009.tests
+
+[ 31875000 ] [ euler009 ] unit-test
index c1a4a169189b0a0aa74cf893e233e433b289d0b8..a1040d2bf2687a6a5f4c33008fada47acd97619e 100644 (file)
@@ -1,6 +1,6 @@
-! Copyright (c) 2007 Aaron Schaefer.
+! Copyright (c) 2007, 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math math.functions namespaces make sequences sorting ;
+USING: kernel make math sequences sorting ;
 IN: project-euler.009
 
 ! http://projecteuler.net/index.php?section=problems&id=9
@@ -30,14 +30,14 @@ IN: project-euler.009
 
 : abc ( p q -- triplet )
     [
-        2dup * ,                    ! a = p * q
-        [ sq ] bi@ 2dup - 2 / ,  ! b = (p² - q²) / 2
-        + 2 / ,                     ! c = (p² + q²) / 2
+        2dup * ,         ! a = p * q
+        [ sq ] bi@
+        [ - 2 / , ]      ! b = (p² - q²) / 2
+        [ + 2 / , ] 2bi  ! c = (p² + q²) / 2
     ] { } make natural-sort ;
 
 : (ptriplet) ( target p q triplet -- target p q )
-    roll [ swap sum = ] keep -roll
-    [ next-pq 2dup abc (ptriplet) ] unless ;
+    sum [ pick ] dip = [ next-pq 2dup abc (ptriplet) ] unless ;
 
 : ptriplet ( target -- triplet )
    3 1 { 3 4 5 } (ptriplet) abc nip ;
@@ -48,6 +48,6 @@ PRIVATE>
     1000 ptriplet product ;
 
 ! [ euler009 ] 100 ave-time
-! 1 ms run / 0 ms GC ave time - 100 trials
+! 1 ms ave run time - 0.73 SD (100 trials)
 
 MAIN: euler009
diff --git a/extra/project-euler/010/010-tests.factor b/extra/project-euler/010/010-tests.factor
new file mode 100644 (file)
index 0000000..b110ce8
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.010 tools.test ;
+IN: project-euler.010.tests
+
+[ 142913828922 ] [ euler010 ] unit-test
index 172bb9d2907fcc5c2b40ae508e281eae679d9865..c8bbe3d72e91083d3f75789475b6bee37f15f451 100644 (file)
@@ -10,16 +10,19 @@ IN: project-euler.010
 
 ! The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
 
-! Find the sum of all the primes below one million.
+! Find the sum of all the primes below two million.
 
 
 ! SOLUTION
 ! --------
 
 : euler010 ( -- answer )
-    1000000 primes-upto sum ;
+    2000000 primes-upto sum ;
 
-! [ euler010 ] 100 ave-time
-! 14 ms run / 0 ms GC ave time - 100 trials
+! [ euler010 ] time
+! 266425 ms run / 10001 ms GC time
+
+! TODO: this takes well over one minute now that they changed the problem to
+! two million instead of one. the primes vocab could use some improvements
 
 MAIN: euler010
diff --git a/extra/project-euler/011/011-tests.factor b/extra/project-euler/011/011-tests.factor
new file mode 100644 (file)
index 0000000..5c48320
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.011 tools.test ;
+IN: project-euler.011.tests
+
+[ 70600674 ] [ euler011 ] unit-test
index f4e549c7c046cb1b48b03d9f5b84d1919e5b360d..094069572684b34e1944549d14ea78a557cdac34 100644 (file)
@@ -1,7 +1,6 @@
-! Copyright (c) 2007 Aaron Schaefer.
+! Copyright (c) 2007, 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel namespaces make project-euler.common sequences
-splitting grouping ;
+USING: grouping kernel make sequences ;
 IN: project-euler.011
 
 ! http://projecteuler.net/index.php?section=problems&id=11
@@ -88,7 +87,7 @@ IN: project-euler.011
     horizontal pad-front pad-back flip ;
 
 : max-product ( matrix width -- n )
-    [ collect-consecutive ] curry map concat
+    [ clump ] curry map concat
     [ product ] map supremum ; inline
 
 PRIVATE>
@@ -100,6 +99,6 @@ PRIVATE>
     ] { } make supremum ;
 
 ! [ euler011 ] 100 ave-time
-! 4 ms run / 0 ms GC ave time - 100 trials
+! 3 ms ave run time - 0.77 SD (100 trials)
 
 MAIN: euler011
diff --git a/extra/project-euler/012/012-tests.factor b/extra/project-euler/012/012-tests.factor
new file mode 100644 (file)
index 0000000..c2d9730
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.012 tools.test ;
+IN: project-euler.012.tests
+
+[ 76576500 ] [ euler012 ] unit-test
index 583bad8f726e4fcc72a4e94a7942da540edf5b69..b25bfc90f1b4133bf34becb35141646edea40647 100644 (file)
@@ -37,6 +37,6 @@ IN: project-euler.012
     8 [ dup nth-triangle tau* 500 < ] [ 1+ ] [ ] while nth-triangle ;
 
 ! [ euler012 ] 10 ave-time
-! 5413 ms run / 1 ms GC ave time - 10 trials
+! 6573 ms ave run time - 346.27 SD (10 trials)
 
 MAIN: euler012
diff --git a/extra/project-euler/013/013-tests.factor b/extra/project-euler/013/013-tests.factor
new file mode 100644 (file)
index 0000000..3d9f88d
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.013 tools.test ;
+IN: project-euler.013.tests
+
+[ 5537376230 ] [ euler013 ] unit-test
index 907029cfb29470e589cad4c66750ee003e4ca837..857bd62cc40c7bce093c8796396a8c3b73aa282b 100644 (file)
@@ -228,6 +228,6 @@ PRIVATE>
     source-013 sum number>string 10 head string>number ;
 
 ! [ euler013 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.31 SD (100 trials)
 
 MAIN: euler013
diff --git a/extra/project-euler/014/014-tests.factor b/extra/project-euler/014/014-tests.factor
new file mode 100644 (file)
index 0000000..b423c90
--- /dev/null
@@ -0,0 +1,5 @@
+USING: project-euler.014 tools.test ;
+IN: project-euler.014.tests
+
+[ 837799 ] [ euler014 ] unit-test
+[ 837799 ] [ euler014a ] unit-test
index dc0c060b226c03c62b251576bf0c1f7ffa82ff03..3b812cf242ae77c77211bd5439d120701db31994 100644 (file)
@@ -1,7 +1,6 @@
 ! Copyright (c) 2007 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays combinators.short-circuit kernel
-math math.ranges namespaces make sequences sorting ;
+USING: combinators.short-circuit kernel make math math.ranges sequences ;
 IN: project-euler.014
 
 ! http://projecteuler.net/index.php?section=problems&id=14
@@ -59,7 +58,7 @@ PRIVATE>
 <PRIVATE
 
 : worth-calculating? ( n -- ? )
-    { [ dup 1- 3 mod zero? ] [ dup 1- 3 / even? ] } 0&& nip ;
+    1- 3 { [ mod zero? ] [ / even? ] } 2&& ;
 
 PRIVATE>
 
diff --git a/extra/project-euler/015/015-tests.factor b/extra/project-euler/015/015-tests.factor
new file mode 100644 (file)
index 0000000..9c86421
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.015 tools.test ;
+IN: project-euler.015.tests
+
+[ 137846528820 ] [ euler015 ] unit-test
index 305426902bca798070c4b7e1f84b81feaa4380be..fb720c7e7c76545484921e6d267ee9f4e0ad6b72 100644 (file)
@@ -28,6 +28,6 @@ PRIVATE>
     20 grid-paths ;
 
 ! [ euler015 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.2 SD (100 trials)
 
 MAIN: euler015
diff --git a/extra/project-euler/016/016-tests.factor b/extra/project-euler/016/016-tests.factor
new file mode 100644 (file)
index 0000000..e75a114
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.016 tools.test ;
+IN: project-euler.016.tests
+
+[ 1366 ] [ euler016 ] unit-test
index 00747a93175e6678ceb012ed20706aa0eb0a9f01..216fcb3523382cd33d62ffd72f7ad1911aafbaa2 100644 (file)
@@ -1,6 +1,6 @@
-! Copyright (c) 2007 Aaron Schaefer.
+! Copyright (c) 2007, 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: math.functions math.parser project-euler.common sequences ;
+USING: math.functions project-euler.common sequences ;
 IN: project-euler.016
 
 ! http://projecteuler.net/index.php?section=problems&id=16
@@ -20,6 +20,6 @@ IN: project-euler.016
     2 1000 ^ number>digits sum ;
 
 ! [ euler016 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.67 SD (100 trials)
 
 MAIN: euler016
diff --git a/extra/project-euler/017/017-tests.factor b/extra/project-euler/017/017-tests.factor
new file mode 100644 (file)
index 0000000..3c2b2d5
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.017 tools.test ;
+IN: project-euler.017.tests
+
+[ 21124 ] [ euler017 ] unit-test
index 5f6541873ac33fcbdcac550f7cc8962d8fa2c1f0..21e277da00455db69539965a2a0b1d6969288d45 100644 (file)
@@ -1,7 +1,6 @@
-! Copyright (c) 2007 Aaron Schaefer.
+! Copyright (c) 2007, 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math.ranges math.text.english sequences strings
-    ascii combinators.short-circuit ;
+USING: ascii kernel math.ranges math.text.english sequences ;
 IN: project-euler.017
 
 ! http://projecteuler.net/index.php?section=problems&id=17
@@ -26,7 +25,7 @@ IN: project-euler.017
 : euler017 ( -- answer )
     1000 [1,b] SBUF" " clone [ number>text over push-all ] reduce [ Letter? ] count ;
 
-! [ euler017a ] 100 ave-time
-! 14 ms run / 0 ms GC ave time - 100 trials
+! [ euler017 ] 100 ave-time
+! 15 ms ave run time - 1.71 SD (100 trials)
 
 MAIN: euler017
diff --git a/extra/project-euler/018/018-tests.factor b/extra/project-euler/018/018-tests.factor
new file mode 100644 (file)
index 0000000..1d4d650
--- /dev/null
@@ -0,0 +1,5 @@
+USING: project-euler.018 tools.test ;
+IN: project-euler.018.tests
+
+[ 1074 ] [ euler018 ] unit-test
+[ 1074 ] [ euler018a ] unit-test
index eb2df5e0daa9de04547846da930512fceea30fff..21831b90d49b1217735a9f183dc2dd726757e231 100644 (file)
@@ -74,7 +74,7 @@ PRIVATE>
     source-018 propagate-all first first ;
 
 ! [ euler018 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.29 SD (100 trials)
 
 
 ! ALTERNATE SOLUTIONS
@@ -84,6 +84,6 @@ PRIVATE>
     source-018 max-path ;
 
 ! [ euler018a ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.39 SD (100 trials)
 
 MAIN: euler018a
diff --git a/extra/project-euler/019/019-tests.factor b/extra/project-euler/019/019-tests.factor
new file mode 100644 (file)
index 0000000..543c01b
--- /dev/null
@@ -0,0 +1,5 @@
+USING: project-euler.019 tools.test ;
+IN: project-euler.019.tests
+
+[ 171 ] [ euler019 ] unit-test
+[ 171 ] [ euler019a ] unit-test
index 9482b337bb56da9db95be82dcd7a68403e436371..62e2e066fffebbf6fce9faf27fafd479525df146 100644 (file)
@@ -36,7 +36,7 @@ IN: project-euler.019
     ] map concat [ zero? ] count ;
 
 ! [ euler019 ] 100 ave-time
-! 1 ms run / 0 ms GC ave time - 100 trials
+! 1 ms ave run time - 0.51 SD (100 trials)
 
 
 ! ALTERNATE SOLUTIONS
@@ -61,6 +61,6 @@ PRIVATE>
     end-date start-date first-days [ zero? ] count ;
 
 ! [ euler019a ] 100 ave-time
-! 131 ms run / 3 ms GC ave time - 100 trials
+! 17 ms ave run time - 2.13 SD (100 trials)
 
 MAIN: euler019
diff --git a/extra/project-euler/020/020-tests.factor b/extra/project-euler/020/020-tests.factor
new file mode 100644 (file)
index 0000000..2d9175b
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.020 tools.test ;
+IN: project-euler.020.tests
+
+[ 648 ] [ euler020 ] unit-test
index 8ac75bd9fffb663031d235a63c067b36c0f7fdea..e75747b57c80dd3d70a5e68015c615e76ff31c31 100644 (file)
@@ -1,6 +1,6 @@
-! Copyright (c) 2007 Aaron Schaefer.
+! Copyright (c) 2007, 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: math.combinatorics math.parser project-euler.common sequences ;
+USING: math.combinatorics project-euler.common sequences ;
 IN: project-euler.020
 
 ! http://projecteuler.net/index.php?section=problems&id=20
@@ -20,6 +20,6 @@ IN: project-euler.020
     100 factorial number>digits sum ;
 
 ! [ euler020 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.55 (100 trials)
 
 MAIN: euler020
diff --git a/extra/project-euler/021/021-tests.factor b/extra/project-euler/021/021-tests.factor
new file mode 100644 (file)
index 0000000..f20ae56
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.021 tools.test ;
+IN: project-euler.021.tests
+
+[ 31626 ] [ euler021 ] unit-test
index af6bb3270baf5265178bb048e5b42902dde409cd..55060a7c71aeb442004aede598864f58921fb047 100644 (file)
@@ -27,12 +27,12 @@ IN: project-euler.021
 
 : amicable? ( n -- ? )
     dup sum-proper-divisors
-    { [ 2dup = not ] [ 2dup sum-proper-divisors = ] } 0&& 2nip ;
+    { [ = not ] [ sum-proper-divisors = ] } 2&& ;
 
 : euler021 ( -- answer )
     10000 [1,b] [ dup amicable? [ drop 0 ] unless ] sigma ;
 
 ! [ euler021 ] 100 ave-time
-! 328 ms run / 10 ms GC ave time - 100 trials
+! 335 ms ave run time - 18.63 SD (100 trials)
 
 MAIN: euler021
diff --git a/extra/project-euler/022/022-tests.factor b/extra/project-euler/022/022-tests.factor
new file mode 100644 (file)
index 0000000..bcd5c18
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.022 tools.test ;
+IN: project-euler.022.tests
+
+[ 871198282 ] [ euler022 ] unit-test
index a508ddea6c9a9fb0f2e56883dd52ea0f800cd8be..a12838406ab6d8f9fe973d3ab6b4fa03eaff7c12 100644 (file)
@@ -40,6 +40,6 @@ PRIVATE>
     source-022 natural-sort name-scores sum ;
 
 ! [ euler022 ] 100 ave-time
-! 123 ms run / 4 ms GC ave time - 100 trials
+! 74 ms ave run time - 5.13 SD (100 trials)
 
 MAIN: euler022
diff --git a/extra/project-euler/023/023-tests.factor b/extra/project-euler/023/023-tests.factor
new file mode 100644 (file)
index 0000000..bba4173
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.023 tools.test ;
+IN: project-euler.023.tests
+
+[ 4179871 ] [ euler023 ] unit-test
index 6b38a2b6ac8eb83374beb537a63ad1206e514f3d..80aa40f449bbe9f8d61bd66a12dda1a6722ef887 100644 (file)
@@ -1,7 +1,6 @@
 ! 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 sets ;
+USING: kernel math math.ranges project-euler.common sequences sets sorting ;
 IN: project-euler.023
 
 ! http://projecteuler.net/index.php?section=problems&id=23
diff --git a/extra/project-euler/024/024-tests.factor b/extra/project-euler/024/024-tests.factor
new file mode 100644 (file)
index 0000000..fe722e5
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.024 tools.test ;
+IN: project-euler.024.tests
+
+[ 2783915460 ] [ euler024 ] unit-test
index 0cc0c39e0788d8d0b5493e0b656f5316903529cc..c10ce418c4e471cefe8b7730c7a7ae18ce82a1ea 100755 (executable)
@@ -26,6 +26,6 @@ IN: project-euler.024
     999999 10 permutation 10 digits>integer ;
 
 ! [ euler024 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.27 SD (100 trials)
 
 MAIN: euler024
diff --git a/extra/project-euler/025/025-tests.factor b/extra/project-euler/025/025-tests.factor
new file mode 100644 (file)
index 0000000..0de6820
--- /dev/null
@@ -0,0 +1,5 @@
+USING: project-euler.025 tools.test ;
+IN: project-euler.025.tests
+
+[ 4782 ] [ euler025 ] unit-test
+[ 4782 ] [ euler025a ] unit-test
index 2786d9f0e6fbbfac2bf124b8778574ab76acc8d0..a2934c23c71f8c5771e07c7e3c41e3b8369d3863 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (c) 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien.syntax kernel math math.constants math.functions math.parser
-    math.ranges memoize project-euler.common sequences ;
+USING: kernel math math.constants math.functions math.parser memoize
+    project-euler.common sequences ;
 IN: project-euler.025
 
 ! http://projecteuler.net/index.php?section=problems&id=25
@@ -55,7 +55,7 @@ PRIVATE>
     1000 digit-fib ;
 
 ! [ euler025 ] 10 ave-time
-! 5237 ms run / 72 ms GC ave time - 10 trials
+! 5345 ms ave run time - 105.91 SD (10 trials)
 
 
 ! ALTERNATE SOLUTIONS
@@ -76,6 +76,6 @@ PRIVATE>
     1000 digit-fib* ;
 
 ! [ euler025a ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.17 SD (100 trials)
 
 MAIN: euler025a
diff --git a/extra/project-euler/026/026-tests.factor b/extra/project-euler/026/026-tests.factor
new file mode 100644 (file)
index 0000000..1b9b953
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.026 tools.test ;
+IN: project-euler.026.tests
+
+[ 983 ] [ euler026 ] unit-test
index 8cbf20d0bfd497632af1320e582e1fe72cfbb1f8..cf30d0ee4288a8793a9663bc96a1b4ac87c59ffd 100644 (file)
@@ -66,6 +66,6 @@ PRIVATE>
     source-026 max-period drop denominator ;
 
 ! [ euler026 ] 100 ave-time
-! 724 ms run / 7 ms GC ave time - 100 trials
+! 290 ms ave run time - 19.2 SD (100 trials)
 
 MAIN: euler026
diff --git a/extra/project-euler/027/027-tests.factor b/extra/project-euler/027/027-tests.factor
new file mode 100644 (file)
index 0000000..614d8a5
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.027 tools.test ;
+IN: project-euler.027.tests
+
+[ -59231 ] [ euler027 ] unit-test
index 7680112af79dba1fe97861560ab425712177574e..5bf753074e4c05295e39f9ad4dd5d7d7d85d98ca 100644 (file)
@@ -68,7 +68,7 @@ PRIVATE>
     source-027 max-consecutive drop product ;
 
 ! [ euler027 ] 100 ave-time
-! 687 ms run / 23 ms GC ave time - 100 trials
+! 111 ms ave run time - 6.07 SD (100 trials)
 
 ! TODO: generalize max-consecutive/max-product (from #26) into a new word
 
diff --git a/extra/project-euler/028/028-tests.factor b/extra/project-euler/028/028-tests.factor
new file mode 100644 (file)
index 0000000..fea5ef1
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.028 tools.test ;
+IN: project-euler.028.tests
+
+[ 669171001 ] [ euler028 ] unit-test
index d0f38929563446aa02c00c79473d6f5699c540f7..cd359c70a9bbadde9b0c124d2d5724cbc7bfd7ea 100644 (file)
@@ -30,7 +30,7 @@ IN: project-euler.028
 <PRIVATE
 
 : sum-corners ( n -- sum )
-    dup 1 = [ [ sq 4 * ] keep 6 * - 6 + ] unless ;
+    dup 1 = [ [ sq 4 * ] [ 6 * ] bi - 6 + ] unless ;
 
 : sum-diags ( n -- sum )
     1 swap 2 <range> [ sum-corners ] sigma ;
@@ -41,6 +41,6 @@ PRIVATE>
     1001 sum-diags ;
 
 ! [ euler028 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.39 SD (100 trials)
 
 MAIN: euler028
diff --git a/extra/project-euler/029/029-tests.factor b/extra/project-euler/029/029-tests.factor
new file mode 100644 (file)
index 0000000..5fd064f
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.029 tools.test ;
+IN: project-euler.029.tests
+
+[ 9183 ] [ euler029 ] unit-test
index 9cfe0aacffc510dddc235ff8d828d23a38f22e66..2586e6182ae4c9eaaf18eab6a4a0c0ee336b2e4c 100644 (file)
@@ -32,6 +32,6 @@ IN: project-euler.029
     2 100 [a,b] dup cartesian-product [ first2 ^ ] map prune length ;
 
 ! [ euler029 ] 100 ave-time
-! 951 ms run / 12 ms GC ave time - 100 trials
+! 704 ms ave run time - 28.07 SD (100 trials)
 
 MAIN: euler029
diff --git a/extra/project-euler/030/030-tests.factor b/extra/project-euler/030/030-tests.factor
new file mode 100644 (file)
index 0000000..3b0d030
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.030 tools.test ;
+IN: project-euler.030.tests
+
+[ 443839 ] [ euler030 ] unit-test
index 250494c0dc2f4953fdc32a0cc528b9ce578c5cac..63693f96d8a38f2119e9cf475f2432a5701083d5 100644 (file)
@@ -41,6 +41,6 @@ PRIVATE>
     325537 [ dup sum-fifth-powers = ] filter sum 1- ;
 
 ! [ euler030 ] 100 ave-time
-! 2537 ms run / 125 ms GC ave time - 100 trials
+! 1700 ms ave run time - 64.84 SD (100 trials)
 
 MAIN: euler030
diff --git a/extra/project-euler/031/031-tests.factor b/extra/project-euler/031/031-tests.factor
new file mode 100644 (file)
index 0000000..5e81717
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.031 tools.test ;
+IN: project-euler.031.tests
+
+[ 73682 ] [ euler031 ] unit-test
index 4be866dc03c8b49299f727f5fa4a6f718fe54c44..1b6d1c83eb26a75eb1b2f61c283d6b619189951d 100644 (file)
@@ -30,25 +30,25 @@ IN: project-euler.031
     drop 1 ;
 
 : 2p ( m -- n )
-    dup 0 >= [ [ 2 - 2p ] keep 1p + ] [ drop 0 ] if ;
+    dup 0 >= [ [ 2 - 2p ] [ 1p ] bi + ] [ drop 0 ] if ;
 
 : 5p ( m -- n )
-    dup 0 >= [ [ 5 - 5p ] keep 2p + ] [ drop 0 ] if ;
+    dup 0 >= [ [ 5 - 5p ] [ 2p ] bi + ] [ drop 0 ] if ;
 
 : 10p ( m -- n )
-    dup 0 >= [ [ 10 - 10p ] keep 5p + ] [ drop 0 ] if ;
+    dup 0 >= [ [ 10 - 10p ] [ 5p ] bi + ] [ drop 0 ] if ;
 
 : 20p ( m -- n )
-    dup 0 >= [ [ 20 - 20p ] keep 10p + ] [ drop 0 ] if ;
+    dup 0 >= [ [ 20 - 20p ] [ 10p ] bi + ] [ drop 0 ] if ;
 
 : 50p ( m -- n )
-    dup 0 >= [ [ 50 - 50p ] keep 20p + ] [ drop 0 ] if ;
+    dup 0 >= [ [ 50 - 50p ] [ 20p ] bi + ] [ drop 0 ] if ;
 
 : 100p ( m -- n )
-    dup 0 >= [ [ 100 - 100p ] keep 50p + ] [ drop 0 ] if ;
+    dup 0 >= [ [ 100 - 100p ] [ 50p ] bi + ] [ drop 0 ] if ;
 
 : 200p ( m -- n )
-    dup 0 >= [ [ 200 - 200p ] keep 100p + ] [ drop 0 ] if ;
+    dup 0 >= [ [ 200 - 200p ] [ 100p ] bi + ] [ drop 0 ] if ;
 
 PRIVATE>
 
@@ -56,7 +56,7 @@ PRIVATE>
     200 200p ;
 
 ! [ euler031 ] 100 ave-time
-! 4 ms run / 0 ms GC ave time - 100 trials
+! 3 ms ave run time - 0.91 SD (100 trials)
 
 ! TODO: generalize to eliminate duplication; use a sequence to specify denominations?
 
diff --git a/extra/project-euler/032/032-tests.factor b/extra/project-euler/032/032-tests.factor
new file mode 100644 (file)
index 0000000..039c31d
--- /dev/null
@@ -0,0 +1,5 @@
+USING: project-euler.032 tools.test ;
+IN: project-euler.032.tests
+
+[ 45228 ] [ euler032 ] unit-test
+[ 45228 ] [ euler032a ] unit-test
index f9667c75fea28f6ec7c104b302ba676d347c3a72..07c643659c723c911b74e0b17022869db43cdd14 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (c) 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: hashtables kernel math math.combinatorics math.functions
-    math.parser math.ranges project-euler.common sequences sets ;
+USING: kernel math math.combinatorics math.functions math.parser math.ranges
+    project-euler.common sequences sets ;
 IN: project-euler.032
 
 ! http://projecteuler.net/index.php?section=problems&id=32
@@ -38,7 +38,7 @@ IN: project-euler.032
     [ string>number ] tri@ [ * ] dip = ;
 
 : valid? ( n -- ? )
-    dup 1and4 swap 2and3 or ;
+    [ 1and4 ] [ 2and3 ] bi or ;
 
 : products ( seq -- m )
     [ 10 4 ^ mod ] map ;
@@ -49,7 +49,7 @@ PRIVATE>
     source-032 [ valid? ] filter products prune sum ;
 
 ! [ euler032 ] 10 ave-time
-! 23922 ms run / 1505 ms GC ave time - 10 trials
+! 16361 ms ave run time - 417.8 SD (10 trials)
 
 
 ! ALTERNATE SOLUTIONS
@@ -72,7 +72,7 @@ PRIVATE>
 : euler032a ( -- answer )
     source-032a [ mmp ] map [ pandigital? ] filter products prune sum ;
 
-! [ euler032a ] 100 ave-time
-! 5978 ms run / 327 ms GC ave time - 100 trials
+! [ euler032a ] 10 ave-time
+! 2624 ms ave run time - 131.91 SD (10 trials)
 
 MAIN: euler032a
diff --git a/extra/project-euler/033/033-tests.factor b/extra/project-euler/033/033-tests.factor
new file mode 100644 (file)
index 0000000..e57d623
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.033 tools.test ;
+IN: project-euler.033.tests
+
+[ 100 ] [ euler033 ] unit-test
index 8cb0dc45c3bfc44a1aaa301aea8d459e761a5d53..d0c79c220a151e2e2ae0bdb093bb65bc218a2084 100644 (file)
@@ -50,6 +50,6 @@ PRIVATE>
     source-033 curious-fractions product denominator ;
 
 ! [ euler033 ] 100 ave-time
-! 5 ms run / 0 ms GC ave time - 100 trials
+! 7 ms ave run time - 1.31 SD (100 trials)
 
 MAIN: euler033
diff --git a/extra/project-euler/034/034-tests.factor b/extra/project-euler/034/034-tests.factor
new file mode 100644 (file)
index 0000000..56d2bbb
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.034 tools.test ;
+IN: project-euler.034.tests
+
+[ 40730 ] [ euler034 ] unit-test
index 28c4fa5dc783c9b0a4540af2fe327cb021a96381..11b7efa8b55fedae275d5b4fd11ef4458510e07f 100644 (file)
@@ -42,6 +42,6 @@ PRIVATE>
     3 2000000 [a,b] [ factorion? ] filter sum ;
 
 ! [ euler034 ] 10 ave-time
-! 15089 ms run / 725 ms GC ave time - 10 trials
+! 5506 ms ave run time - 144.0 SD (10 trials)
 
 MAIN: euler034
diff --git a/extra/project-euler/035/035-tests.factor b/extra/project-euler/035/035-tests.factor
new file mode 100644 (file)
index 0000000..0ede690
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.035 tools.test ;
+IN: project-euler.035.tests
+
+[ 55 ] [ euler035 ] unit-test
index 8e8b654d28f163bdb0caa6246dfb73794bba1ce2..517e5211d20e4d1461b7c145406f5ed4c296159b 100755 (executable)
@@ -53,7 +53,7 @@ PRIVATE>
     source-035 [ possible? ] filter [ circular? ] count ;
 
 ! [ euler035 ] 100 ave-time
-! 904 ms run / 86 ms GC ave time - 100 trials
+! 538 ms ave run time - 17.16 SD (100 trials)
 
 ! TODO: try using bit arrays or other methods outlined here:
 !     http://home.comcast.net/~babdulbaki/Circular_Primes.html
diff --git a/extra/project-euler/036/036-tests.factor b/extra/project-euler/036/036-tests.factor
new file mode 100644 (file)
index 0000000..07c2d76
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.036 tools.test ;
+IN: project-euler.036.tests
+
+[ 872187 ] [ euler036 ] unit-test
index fc9df9a8fe8b7490de0718ed702687d12ce7ca4d..f5afeceb21fd3858af6b727fa875f5f5492a5a5a 100644 (file)
@@ -26,8 +26,7 @@ IN: project-euler.036
 <PRIVATE
 
 : both-bases? ( n -- ? )
-    { [ dup palindrome? ]
-      [ dup >bin dup reverse = ] } 0&& nip ;
+    { [ palindrome? ] [ >bin dup reverse = ] } 1&& ;
 
 PRIVATE>
 
@@ -35,6 +34,6 @@ PRIVATE>
     1 1000000 2 <range> [ both-bases? ] filter sum ;
 
 ! [ euler036 ] 100 ave-time
-! 3891 ms run / 173 ms GC ave time - 100 trials
+! 1703 ms ave run time - 96.6 SD (100 trials)
 
 MAIN: euler036
diff --git a/extra/project-euler/037/037-tests.factor b/extra/project-euler/037/037-tests.factor
new file mode 100644 (file)
index 0000000..b661e5b
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.037 tools.test ;
+IN: project-euler.037.tests
+
+[ 748317 ] [ euler037 ] unit-test
index a5bc0581e6f38439c3686463c02215b44959eeba..4562c4588f90c7f559455cf85dcb651a3dff62a7 100755 (executable)
@@ -47,6 +47,6 @@ PRIVATE>
     23 1000000 primes-between [ r-trunc? ] filter [ l-trunc? ] filter sum ;
 
 ! [ euler037 ] 100 ave-time
-! 768 ms run / 9 ms GC ave time - 100 trials
+! 130 ms ave run time - 6.27 SD (100 trials)
 
 MAIN: euler037
diff --git a/extra/project-euler/038/038-tests.factor b/extra/project-euler/038/038-tests.factor
new file mode 100644 (file)
index 0000000..0bad869
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.038 tools.test ;
+IN: project-euler.038.tests
+
+[ 932718654 ] [ euler038 ] unit-test
index 78e3848a337a2723317a5f8a9a50973fb047b744..2df993b341dda71ca60781fa780be60fe1d90d9c 100755 (executable)
@@ -1,6 +1,7 @@
 ! Copyright (c) 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math math.parser math.ranges project-euler.common sequences ;
+USING: kernel math math.parser math.ranges project-euler.common sequences
+    strings ;
 IN: project-euler.038
 
 ! http://projecteuler.net/index.php?section=problems&id=38
@@ -50,6 +51,6 @@ PRIVATE>
     9123 9876 [a,b] [ concat-product ] map [ pandigital? ] filter supremum ;
 
 ! [ euler038 ] 100 ave-time
-! 37 ms run / 1 ms GC ave time - 100 trials
+! 11 ms ave run time - 1.5 SD (100 trials)
 
 MAIN: euler038
diff --git a/extra/project-euler/039/039-tests.factor b/extra/project-euler/039/039-tests.factor
new file mode 100644 (file)
index 0000000..742550a
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.039 tools.test ;
+IN: project-euler.039.tests
+
+[ 840 ] [ euler039 ] unit-test
index d0caa6d0e407961b5454bb5cb2835d045d22bff7..6b5601566762f0e0be2721afef150948594abd44 100755 (executable)
@@ -60,6 +60,6 @@ PRIVATE>
     ] with-scope ;
 
 ! [ euler039 ] 100 ave-time
-! 2 ms run / 0 ms GC ave time - 100 trials
+! 1 ms ave run time - 0.37 SD (100 trials)
 
 MAIN: euler039
diff --git a/extra/project-euler/040/040-tests.factor b/extra/project-euler/040/040-tests.factor
new file mode 100644 (file)
index 0000000..5934e65
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.040 tools.test ;
+IN: project-euler.040.tests
+
+[ 210 ] [ euler040 ] unit-test
index e2df1df2c9ccd08992794cf08ea7044ad979ce8e..6b8a3f267ac59321573886fdb00bc5e0e180ff5d 100755 (executable)
@@ -46,6 +46,6 @@ PRIVATE>
     [ swap nth-integer ] with map product ;
 
 ! [ euler040 ] 100 ave-time
-! 1002 ms run / 43 ms GC ave time - 100 trials
+! 444 ms ave run time - 23.64 SD (100 trials)
 
 MAIN: euler040
diff --git a/extra/project-euler/041/041-tests.factor b/extra/project-euler/041/041-tests.factor
new file mode 100644 (file)
index 0000000..5226860
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.041 tools.test ;
+IN: project-euler.041.tests
+
+[ 7652413 ] [ euler041 ] unit-test
index 14084cc01d4c71dde1c8c8d8c4a6eeccf4c71893..d6d428a11f5a191c1440d1e70ad90e51771bebca 100644 (file)
@@ -35,6 +35,6 @@ IN: project-euler.041
     [ 10 digits>integer ] map [ prime? ] find nip ;
 
 ! [ euler041 ] 100 ave-time
-! 107 ms run / 7 ms GC ave time - 100 trials
+! 64 ms ave run time - 4.22 SD (100 trials)
 
 MAIN: euler041
diff --git a/extra/project-euler/042/042-tests.factor b/extra/project-euler/042/042-tests.factor
new file mode 100644 (file)
index 0000000..ef8f06f
--- /dev/null
@@ -0,0 +1,5 @@
+USING: project-euler.042 tools.test ;
+IN: project-euler.042.tests
+
+[ 162 ] [ euler042 ] unit-test
+[ 162 ] [ euler042a ] unit-test
index 8ae95d6db7e0bb2a0c229c9f9147daef445270ba..c8236db1185c2de5332ebd26fcdc91d2005669f1 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (c) 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: ascii io.files kernel math math.functions namespaces make
-    project-euler.common sequences splitting io.encodings.ascii ;
+USING: ascii io.encodings.ascii io.files kernel make math math.functions
+    namespaces project-euler.common sequences splitting ;
 IN: project-euler.042
 
 ! http://projecteuler.net/index.php?section=problems&id=42
@@ -50,7 +50,7 @@ PRIVATE>
     triangle-upto [ member? ] curry count ;
 
 ! [ euler042 ] 100 ave-time
-! 27 ms run / 1 ms GC ave time - 100 trials
+! 19 ms ave run time - 1.97 SD (100 trials)
 
 
 ! ALTERNATE SOLUTIONS
@@ -69,6 +69,6 @@ PRIVATE>
     source-042 [ alpha-value ] map [ triangle? ] count ;
 
 ! [ euler042a ] 100 ave-time
-! 25 ms run / 1 ms GC ave time - 100 trials
+! 21 ms ave run time - 2.2 SD (100 trials)
 
 MAIN: euler042a
diff --git a/extra/project-euler/043/043-tests.factor b/extra/project-euler/043/043-tests.factor
new file mode 100644 (file)
index 0000000..4c96721
--- /dev/null
@@ -0,0 +1,5 @@
+USING: project-euler.043 tools.test ;
+IN: project-euler.043.tests
+
+[ 16695334890 ] [ euler043 ] unit-test
+[ 16695334890 ] [ euler043a ] unit-test
index 84ed7a830ff92197f83990c025f1b7388850a3fc..268a6becfb4d8d377a19a3ca55c78bd91a5c49f2 100644 (file)
@@ -1,8 +1,7 @@
 ! Copyright (c) 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: combinators.short-circuit hashtables kernel math
-    math.combinatorics math.parser math.ranges project-euler.common sequences
-    sorting sets ;
+USING: combinators.short-circuit kernel math math.combinatorics math.parser
+    math.ranges project-euler.common sequences sets sorting ;
 IN: project-euler.043
 
 ! http://projecteuler.net/index.php?section=problems&id=43
@@ -41,14 +40,14 @@ IN: project-euler.043
 
 : interesting? ( seq -- ? )
     {
-        [ 17 8 pick subseq-divisible? ]
-        [ 13 7 pick subseq-divisible? ]
-        [ 11 6 pick subseq-divisible? ]
-        [ 7 5 pick subseq-divisible? ]
-        [ 5 4 pick subseq-divisible? ]
-        [ 3 3 pick subseq-divisible? ]
-        [ 2 2 pick subseq-divisible? ]
-    } 0&& nip ;
+        [ 17 8 rot subseq-divisible? ]
+        [ 13 7 rot subseq-divisible? ]
+        [ 11 6 rot subseq-divisible? ]
+        [ 7  5 rot subseq-divisible? ]
+        [ 5  4 rot subseq-divisible? ]
+        [ 3  3 rot subseq-divisible? ]
+        [ 2  2 rot subseq-divisible? ]
+    } 1&& ;
 
 PRIVATE>
 
@@ -57,7 +56,7 @@ PRIVATE>
     [ interesting? ] filter [ 10 digits>integer ] map sum ;
 
 ! [ euler043 ] time
-! 125196 ms run / 19548 ms GC time
+! 104526 ms run / 42735 ms GC time
 
 
 ! ALTERNATE SOLUTIONS
@@ -74,13 +73,13 @@ PRIVATE>
     1000 over <range> [ number>digits 3 0 pad-left ] map [ all-unique? ] filter ;
 
 : overlap? ( seq -- ? )
-    dup first 2 tail* swap second 2 head = ;
+    [ first 2 tail* ] [ second 2 head ] bi = ;
 
 : clean ( seq -- seq )
     [ unclip 1 head prefix concat ] map [ all-unique? ] filter ;
 
 : add-missing-digit ( seq -- seq )
-    dup natural-sort 10 swap diff first prefix ;
+    dup natural-sort 10 swap diff prepend ;
 
 : interesting-pandigitals ( -- seq )
     17 candidates { 13 11 7 5 3 2 } [
@@ -93,6 +92,6 @@ PRIVATE>
     interesting-pandigitals [ 10 digits>integer ] sigma ;
 
 ! [ euler043a ] 100 ave-time
-! 19 ms run / 1 ms GC ave time - 100 trials
+! 10 ms ave run time - 1.37 SD (100 trials)
 
 MAIN: euler043a
diff --git a/extra/project-euler/044/044-tests.factor b/extra/project-euler/044/044-tests.factor
new file mode 100644 (file)
index 0000000..df93dd6
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.044 tools.test ;
+IN: project-euler.044.tests
+
+[ 5482660 ] [ euler044 ] unit-test
index eaa6bf96ef7b164065befbe6630236e53d231e70..e7b1959023840c568115257eafa17113da454b60 100644 (file)
@@ -31,7 +31,7 @@ IN: project-euler.044
     dup 3 * 1- * 2 / ;
 
 : sum-and-diff? ( m n -- ? )
-    2dup + -rot - [ pentagonal? ] bi@ and ;
+    [ + ] [ - ] 2bi [ pentagonal? ] bi@ and ;
 
 PRIVATE>
 
@@ -40,7 +40,7 @@ PRIVATE>
     [ first2 sum-and-diff? ] filter [ first2 - abs ] map infimum ;
 
 ! [ euler044 ] 10 ave-time
-! 8924 ms run / 2872 ms GC ave time - 10 trials
+! 4996 ms ave run time - 87.46 SD (10 trials)
 
 ! TODO: this solution is ugly and not very efficient...find a better algorithm
 
diff --git a/extra/project-euler/045/045-tests.factor b/extra/project-euler/045/045-tests.factor
new file mode 100644 (file)
index 0000000..4beb8f8
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.045 tools.test ;
+IN: project-euler.045.tests
+
+[ 1533776805 ] [ euler045 ] unit-test
index d9cf8c99f8c4fd8c4534cf0625daddf138d877cf..ca5cd83f41aba82ca15d84e5c34a3e8fc713f7a5 100644 (file)
@@ -44,6 +44,6 @@ PRIVATE>
     143 next-solution ;
 
 ! [ euler045 ] 100 ave-time
-! 18 ms run / 1 ms GC ave time - 100 trials
+! 12 ms ave run time - 1.71 SD (100 trials)
 
 MAIN: euler045
diff --git a/extra/project-euler/046/046-tests.factor b/extra/project-euler/046/046-tests.factor
new file mode 100644 (file)
index 0000000..ecfff9d
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.046 tools.test ;
+IN: project-euler.046.tests
+
+[ 5777 ] [ euler046 ] unit-test
index 1e7630c142fbbf1966c20918e368755dbecde019..7f5ad9e0d845d1f2ae1312bc57d25ad71f52f2d9 100644 (file)
@@ -47,6 +47,6 @@ PRIVATE>
     9 disprove-conjecture ;
 
 ! [ euler046 ] 100 ave-time
-! 150 ms run / 2 ms GC ave time - 100 trials
+! 37 ms ave run time - 3.39 SD (100 trials)
 
 MAIN: euler046
diff --git a/extra/project-euler/047/047-tests.factor b/extra/project-euler/047/047-tests.factor
new file mode 100644 (file)
index 0000000..fb3c72f
--- /dev/null
@@ -0,0 +1,5 @@
+USING: project-euler.047 tools.test ;
+IN: project-euler.047.tests
+
+[ 134043 ] [ euler047 ] unit-test
+[ 134043 ] [ euler047a ] unit-test
index 87a13878873c43ed3143224cb85c1bba43498aba..84041babb79a7dd84576a741ed0a140e739f9467 100644 (file)
@@ -49,7 +49,7 @@ PRIVATE>
     4 646 consecutive ;
 
 ! [ euler047 ] time
-! 542708 ms run / 60548 ms GC time
+! 344688 ms run / 20727 ms GC time
 
 
 ! ALTERNATE SOLUTIONS
@@ -88,7 +88,7 @@ PRIVATE>
     4 200000 consecutive-under ;
 
 ! [ euler047a ] 100 ave-time
-! 503 ms run / 5 ms GC ave time - 100 trials
+! 331 ms ave run time - 19.14 SD (100 trials)
 
 ! TODO: I don't like that you have to specify the upper bound, maybe try making
 ! this lazy so it could also short-circuit when it finds the answer?
diff --git a/extra/project-euler/048/048-tests.factor b/extra/project-euler/048/048-tests.factor
new file mode 100644 (file)
index 0000000..172623a
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.048 tools.test ;
+IN: project-euler.048.tests
+
+[ 9110846700 ] [ euler048 ] unit-test
diff --git a/extra/project-euler/052/052-tests.factor b/extra/project-euler/052/052-tests.factor
new file mode 100644 (file)
index 0000000..be032c8
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.052 tools.test ;
+IN: project-euler.052.tests
+
+[ 142857 ] [ euler052 ] unit-test
index 3f562baa8505ee3572829cfa0bb127c39e38bde1..5362a6e9b0dfd6cb3fcbc11e665345b3fb0a7a0b 100644 (file)
@@ -30,7 +30,7 @@ IN: project-euler.052
     [ number>digits natural-sort ] map all-equal? ;
 
 : candidate? ( n -- ? )
-    { [ dup odd? ] [ dup 3 mod zero? ] } 0&& nip ;
+    { [ odd? ] [ 3 mod zero? ] } 1&& ;
 
 : next-all-same ( x n -- n )
     dup candidate? [
@@ -46,6 +46,6 @@ PRIVATE>
     6 123456 next-all-same ;
 
 ! [ euler052 ] 100 ave-time
-! 403 ms run / 7 ms GC ave time - 100 trials
+! 92 ms ave run time - 6.29 SD (100 trials)
 
 MAIN: euler052
diff --git a/extra/project-euler/053/053-tests.factor b/extra/project-euler/053/053-tests.factor
new file mode 100644 (file)
index 0000000..6c9ffae
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.053 tools.test ;
+IN: project-euler.053.tests
+
+[ 4075 ] [ euler053 ] unit-test
index b2a50e4ac7b71d1937c8310fe4f3d7a6ba19ef3a..d264bca4bff1a8b80a174551976c15aa2de98f52 100644 (file)
@@ -30,6 +30,6 @@ IN: project-euler.053
     23 100 [a,b] [ dup [ nCk 1000000 > ] with count ] sigma ;
 
 ! [ euler053 ] 100 ave-time
-! 64 ms run / 2 ms GC ave time - 100 trials
+! 52 ms ave run time - 4.44 SD (100 trials)
 
 MAIN: euler053
diff --git a/extra/project-euler/055/055-tests.factor b/extra/project-euler/055/055-tests.factor
new file mode 100644 (file)
index 0000000..ad23695
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.055 tools.test ;
+IN: project-euler.055.tests
+
+[ 249 ] [ euler055 ] unit-test
index bf1dd43b979acde78f78125aa9ee59d790454cb6..d07d0c8e31dabbcff6cdf2075e4f2b7c7b16aa6a 100644 (file)
@@ -64,6 +64,6 @@ PRIVATE>
     10000 [ lychrel? ] count ;
 
 ! [ euler055 ] 100 ave-time
-! 1370 ms run / 31 ms GC ave time - 100 trials
+! 478 ms ave run time - 30.63 SD (100 trials)
 
 MAIN: euler055
diff --git a/extra/project-euler/056/056-tests.factor b/extra/project-euler/056/056-tests.factor
new file mode 100644 (file)
index 0000000..b1f3751
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.056 tools.test ;
+IN: project-euler.056.tests
+
+[ 972 ] [ euler056 ] unit-test
index 0efe32b25429dbcb268beb35262a0fc590c2624d..34626b796d8de38d202b2dc184f9f420755917e3 100644 (file)
@@ -26,6 +26,6 @@ IN: project-euler.056
     [ first2 ^ number>digits sum ] map supremum ;
 
 ! [ euler056 ] 100 ave-time
-! 33 ms run / 1 ms GC ave time - 100 trials
+! 22 ms ave run time - 2.13 SD (100 trials)
 
 MAIN: euler056
diff --git a/extra/project-euler/059/059-tests.factor b/extra/project-euler/059/059-tests.factor
new file mode 100644 (file)
index 0000000..231c733
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.059 tools.test ;
+IN: project-euler.059.tests
+
+[ 107359 ] [ euler059 ] unit-test
index e3ab9762d8b6c2dbdfe73db7dd3eb8cab14e144c..bbeeff1eec8b0b83db2f67a0bf3bb506ce4a1bb4 100644 (file)
@@ -87,6 +87,6 @@ PRIVATE>
     source-059 dup 3 crack-key decrypt sum ;
 
 ! [ euler059 ] 100 ave-time
-! 13 ms run / 0 ms GC ave time - 100 trials
+! 8 ms ave run time - 1.4 SD (100 trials)
 
 MAIN: euler059
diff --git a/extra/project-euler/067/067-tests.factor b/extra/project-euler/067/067-tests.factor
new file mode 100644 (file)
index 0000000..1e8940f
--- /dev/null
@@ -0,0 +1,5 @@
+USING: project-euler.067 tools.test ;
+IN: project-euler.067.tests
+
+[ 7273 ] [ euler067 ] unit-test
+[ 7273 ] [ euler067a ] unit-test
index 3e16996e0424c4cea61404d9349996ce286e5ca2..3f9d67091dad9ceef9066042b5138047ee064f1b 100644 (file)
@@ -47,7 +47,7 @@ PRIVATE>
     source-067 propagate-all first first ;
 
 ! [ euler067 ] 100 ave-time
-! 18 ms run / 0 ms GC time
+! 20 ms ave run time - 2.12 SD (100 trials)
 
 
 ! ALTERNATE SOLUTIONS
@@ -57,6 +57,6 @@ PRIVATE>
     source-067 max-path ;
 
 ! [ euler067a ] 100 ave-time
-! 14 ms run / 0 ms GC ave time - 100 trials
+! 21 ms ave run time - 2.65 SD (100 trials)
 
 MAIN: euler067a
diff --git a/extra/project-euler/075/075-tests.factor b/extra/project-euler/075/075-tests.factor
new file mode 100644 (file)
index 0000000..8c69a99
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.075 tools.test ;
+IN: project-euler.075.tests
+
+[ 214954 ] [ euler075 ] unit-test
index 76f2a2a26ec8f6762017c55710b668ded5748128..2b5b9311650b530fa22f274ffaf92c267823d0c3 100755 (executable)
@@ -26,7 +26,7 @@ IN: project-euler.075
 
 !     120 cm: (30,40,50), (20,48,52), (24,45,51)
 
-! Given that L is the length of the wire, for how many values of L â‰¤ 1,000,000
+! Given that L is the length of the wire, for how many values of L â‰¤ 2,000,000
 ! can exactly one right angle triangle be formed?
 
 
@@ -36,9 +36,9 @@ IN: project-euler.075
 ! Algorithm adapted from http://mathworld.wolfram.com/PythagoreanTriple.html
 ! Identical implementation as problem #39
 
-! Basically, this makes an array of 1000000 zeros, recursively creates
+! Basically, this makes an array of 2000000 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
+! index [a+b+c] by one for each triple's sum AND its multiples under 2000000
 ! (to account for non-primitive triples). The answer is just the total number
 ! of indexes that are equal to one.
 
@@ -69,10 +69,10 @@ PRIVATE>
 
 : euler075 ( -- answer )
     [
-        1000000 count-perimeters p-count get [ 1 = ] count
+        2000000 count-perimeters p-count get [ 1 = ] count
     ] with-scope ;
 
-! [ euler075 ] 100 ave-time
-! 1873 ms run / 123 ms GC ave time - 100 trials
+! [ euler075 ] 10 ave-time
+! 3341 ms ave run timen - 157.77 SD (10 trials)
 
 MAIN: euler075
diff --git a/extra/project-euler/076/076-tests.factor b/extra/project-euler/076/076-tests.factor
new file mode 100644 (file)
index 0000000..9d435b1
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.076 tools.test ;
+IN: project-euler.076.tests
+
+[ 190569291 ] [ euler076 ] unit-test
index 3530f2163ac32e038e624f33b336faff1ecb475f..e332d9ef3e53c40c4ba322fa793e4f800bb4e798 100644 (file)
@@ -1,7 +1,6 @@
 ! Copyright (c) 2008 Eric Mertens.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays assocs combinators kernel locals math math.order math.ranges
-    sequences ;
+USING: arrays assocs kernel locals math math.order math.ranges sequences ;
 IN: project-euler.076
 
 ! http://projecteuler.net/index.php?section=problems&id=76
@@ -55,6 +54,6 @@ PRIVATE>
     100 (euler076) ;
 
 ! [ euler076 ] 100 ave-time
-! 704 ms run time - 100 trials
+! 560 ms ave run time - 17.74 SD (100 trials)
 
 MAIN: euler076
diff --git a/extra/project-euler/079/079-tests.factor b/extra/project-euler/079/079-tests.factor
new file mode 100644 (file)
index 0000000..d9f47cf
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.079 tools.test ;
+IN: project-euler.079.tests
+
+[ 73162890 ] [ euler079 ] unit-test
index 99c70ba038e377e0522ed479691c68d4a26f74a9..ad75c43c42772c2fe8f37bf9d3a40c84792d1b52 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (c) 2008 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: assocs hashtables io.files kernel math math.parser
-namespaces make io.encodings.ascii sequences sets ;
+USING: assocs io.encodings.ascii io.files kernel make math math.parser
+    sequences sets ;
 IN: project-euler.079
 
 ! http://projecteuler.net/index.php?section=problems&id=79
@@ -58,7 +58,7 @@ PRIVATE>
     source-079 >edges topological-sort 10 digits>integer ;
 
 ! [ euler079 ] 100 ave-time
-! 2 ms run / 0 ms GC ave time - 100 trials
+! 1 ms ave run time - 0.46 SD (100 trials)
 
 ! TODO: prune and diff are relatively slow; topological sort could be
 ! cleaned up and generalized much better, but it works for this problem
diff --git a/extra/project-euler/092/092-tests.factor b/extra/project-euler/092/092-tests.factor
new file mode 100644 (file)
index 0000000..0a89e18
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.092 tools.test ;
+IN: project-euler.092.tests
+
+[ 8581146 ] [ euler092 ] unit-test
index 7e44a509abc5bda691aa4a28755d4a7b6f4ad052..c778fd952556f1406efd6dfb3f0482a5f7a92682 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (c) 2008 Aaron Schaefer, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math math.ranges sequences ;
+USING: kernel math math.ranges project-euler.common sequences ;
 IN: project-euler.092
 
 ! http://projecteuler.net/index.php?section=problems&id=92
@@ -29,10 +29,10 @@ IN: project-euler.092
 <PRIVATE
 
 : next-link ( n -- m )
-    0 swap [ dup zero? not ] [ 10 /mod sq -rot [ + ] dip ] [ ] while drop ;
+    number>digits [ sq ] sigma ;
 
 : chain-ending ( n -- m )
-    dup 1 = over 89 = or [ next-link chain-ending ] unless ;
+    dup [ 1 = ] [ 89 = ] bi or [ next-link chain-ending ] unless ;
 
 : lower-endings ( -- seq )
     567 [1,b] [ chain-ending ] map ;
@@ -40,15 +40,14 @@ IN: project-euler.092
 : fast-chain-ending ( seq n -- m )
     dup 567 > [ next-link ] when 1- swap nth ;
 
-: count ( seq quot -- n )
-    0 -rot [ rot >r call [ r> 1+ ] [ r> ] if ] curry each ; inline
-
 PRIVATE>
 
 : euler092 ( -- answer )
     lower-endings 9999999 [1,b] [ fast-chain-ending 89 = ] with count ;
 
 ! [ euler092 ] 10 ave-time
-! 11169 ms run / 0 ms GC ave time - 10 trials
+! 33257 ms ave run time - 624.27 SD (10 trials)
+
+! TODO: this solution is not very efficient, much better optimizations exist
 
 MAIN: euler092
diff --git a/extra/project-euler/097/097-tests.factor b/extra/project-euler/097/097-tests.factor
new file mode 100644 (file)
index 0000000..3a48403
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.097 tools.test ;
+IN: project-euler.097.tests
+
+[ 8739992577 ] [ euler097 ] unit-test
index 50e7af563ddadefd5f46c15b7941f3888527df99..6e6547a7e961e563d670ecff987fab769313e5de 100644 (file)
@@ -26,6 +26,6 @@ IN: project-euler.097
      2 7830457 10 10 ^ ^mod 28433 * 10 10 ^ mod 1+ ;
 
 ! [ euler097 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run timen - 0.22 SD (100 trials)
 
 MAIN: euler097
diff --git a/extra/project-euler/100/100-tests.factor b/extra/project-euler/100/100-tests.factor
new file mode 100644 (file)
index 0000000..bbe84eb
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.100 tools.test ;
+IN: project-euler.100.tests
+
+[ 756872327473 ] [ euler100 ] unit-test
index fca1bf8af8b9a490884520682714b746cccdde80..98dbba19fd27bd1b6b08e0c60682ed8613e587ff 100644 (file)
@@ -28,9 +28,9 @@ IN: project-euler.100
     [ dup dup 1- * 2 * 10 24 ^ <= ]
     [ tuck 6 * swap - 2 - ] [ ] while nip ;
 
-! TODO: solution is incredibly slow (>30 minutes) and needs generalization
+! TODO: solution needs generalization
 
-! [ euler100 ] time
-! ? ms run time
+! [ euler100 ] 100 ave-time
+! 0 ms ave run time - 0.14 SD (100 trials)
 
 MAIN: euler100
diff --git a/extra/project-euler/116/116-tests.factor b/extra/project-euler/116/116-tests.factor
new file mode 100644 (file)
index 0000000..fae67f3
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.116 tools.test ;
+IN: project-euler.116.tests
+
+[ 20492570929 ] [ euler116 ] unit-test
index 0e3633dc9a6f3a79318d6eefaf58c0fd793204cc..742fe9d625b324b3c9f739026041a0ad9f392f0f 100644 (file)
@@ -55,6 +55,6 @@ PRIVATE>
     50 (euler116) ;
 
 ! [ euler116 ] 100 ave-time
-! 0 ms run time - 100 trials
+! 0 ms ave run time - 0.34 SD (100 trials)
 
 MAIN: euler116
diff --git a/extra/project-euler/117/117-tests.factor b/extra/project-euler/117/117-tests.factor
new file mode 100644 (file)
index 0000000..ba677cf
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.117 tools.test ;
+IN: project-euler.117.tests
+
+[ 100808458960497 ] [ euler117 ] unit-test
index cc5dea8f3703898666a1e2b792b273681d0f811e..7174066227c2a9351b4fe06bdc5c9b08271d031d 100644 (file)
@@ -42,6 +42,6 @@ PRIVATE>
     50 (euler117) ;
 
 ! [ euler117 ] 100 ave-time
-! 0 ms run time - 100 trials
+! 0 ms ave run time - 0.29 SD (100 trials)
 
 MAIN: euler117
diff --git a/extra/project-euler/134/134-tests.factor b/extra/project-euler/134/134-tests.factor
new file mode 100644 (file)
index 0000000..63c25ea
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.134 tools.test ;
+IN: project-euler.134.tests
+
+[ 18613426663617118 ] [ euler134 ] unit-test
index 4e54a18f197794c4ce1e84f9f145dfc1abaf5fed..7bdf17ef684260c36cc65e0d64f5feac11811aff 100644 (file)
@@ -43,6 +43,6 @@ PRIVATE>
     [ [ s + ] keep ] leach drop ;
 
 ! [ euler134 ] 10 ave-time
-! 2430 ms run / 36 ms GC ave time - 10 trials
+! 933 ms ave run timen - 19.58 SD (10 trials)
 
 MAIN: euler134
diff --git a/extra/project-euler/148/148-tests.factor b/extra/project-euler/148/148-tests.factor
new file mode 100644 (file)
index 0000000..66c8f6c
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.148 tools.test ;
+IN: project-euler.148.tests
+
+[ 2129970655314432 ] [ euler148 ] unit-test
index 0509936e524069ca82da983fc4c0fccb32e27118..533874fa67819b0f5f8b4013376c52079418b2ee 100644 (file)
@@ -49,6 +49,6 @@ PRIVATE>
     10 9 ^ (euler148) ;
 
 ! [ euler148 ] 100 ave-time
-! 0 ms run time - 100 trials
+! 0 ms ave run time - 0.17 SD (100 trials)
 
 MAIN: euler148
diff --git a/extra/project-euler/150/150-tests.factor b/extra/project-euler/150/150-tests.factor
new file mode 100644 (file)
index 0000000..19fb31b
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.150 tools.test ;
+IN: project-euler.150.tests
+
+[ -271248680 ] [ euler150 ] unit-test
index c7d878edcb24a3cf5df100769c7a21209629b2cc..1b84b25d37a1b27dedaec1731dd396102b431a2e 100644 (file)
@@ -73,6 +73,6 @@ PRIVATE>
     1000 (euler150) ;
 
 ! [ euler150 ] 10 ave-time
-! 32858 ms run time - 10 trials
+! 30208 ms ave run time - 593.45 SD (10 trials)
 
 MAIN: euler150
diff --git a/extra/project-euler/164/164-tests.factor b/extra/project-euler/164/164-tests.factor
new file mode 100644 (file)
index 0000000..013e8bd
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.164 tools.test ;
+IN: project-euler.164.tests
+
+[ 378158756814587 ] [ euler164 ] unit-test
index 9d88e49e0e501f72983ad0cb23209231e9f56be8..5bc4fdc74e3026162e52c9f45c9fc1fa9dd77475 100644 (file)
@@ -33,6 +33,6 @@ PRIVATE>
     init-table 19 [ next-table ] times values sum ;
 
 ! [ euler164 ] 100 ave-time
-! 8 ms run time - 100 trials
+! 7 ms ave run time - 1.23 SD (100 trials)
 
 MAIN: euler164
diff --git a/extra/project-euler/169/169-tests.factor b/extra/project-euler/169/169-tests.factor
new file mode 100644 (file)
index 0000000..0722e7f
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.169 tools.test ;
+IN: project-euler.169.tests
+
+[ 178653872807 ] [ euler169 ] unit-test
index 4387662c90f033f0d63a51a6e682554b865982e6..ef43fc3c340cdc97b5883ac19828f1d4fa61757d 100644 (file)
@@ -20,7 +20,7 @@ USING: combinators kernel math math.functions memoize ;
 ! 2 + 4 + 4
 ! 2 + 8
 
-! What is f(1025)?
+! What is f(10^25)?
 
 
 ! SOLUTION
@@ -37,6 +37,6 @@ MEMO: fn ( n -- x )
     10 25 ^ fn ;
 
 ! [ euler169 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.2 SD (100 trials)
 
 MAIN: euler169
diff --git a/extra/project-euler/173/173-tests.factor b/extra/project-euler/173/173-tests.factor
new file mode 100644 (file)
index 0000000..9417ba8
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.173 tools.test ;
+IN: project-euler.173.tests
+
+[ 1572729 ] [ euler173 ] unit-test
index 9f2984d37df9e7ea16bf481a428ba6c1a5763839..757dfb017a223b339586fb3153a19e50f15ca9a8 100644 (file)
@@ -33,6 +33,6 @@ PRIVATE>
     1000000 laminae ;
 
 ! [ euler173 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.35 SD (100 trials)
 
 MAIN: euler173
diff --git a/extra/project-euler/175/175-tests.factor b/extra/project-euler/175/175-tests.factor
new file mode 100644 (file)
index 0000000..541aa7d
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.175 tools.test ;
+IN: project-euler.175.tests
+
+[ "1,13717420,8" ] [ euler175 ] unit-test
index 853bf9a10f1b7c28841ee68da0ea9579cd52b3cb..9aebcf565cc44ab575187cf45726fb69b4bc0129 100644 (file)
@@ -53,6 +53,6 @@ PRIVATE>
     V{ 1 } clone dup 123456789/987654321 compute [ number>string ] map "," join ;
 
 ! [ euler175 ] 100 ave-time
-! 0 ms run / 0 ms GC ave time - 100 trials
+! 0 ms ave run time - 0.31 SD (100 trials)
 
 MAIN: euler175
diff --git a/extra/project-euler/186/186-tests.factor b/extra/project-euler/186/186-tests.factor
new file mode 100644 (file)
index 0000000..71d2f1c
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.186 tools.test ;
+IN: project-euler.186.tests
+
+[ 2325629 ] [ euler186 ] unit-test
index 7504e09a81fa08fcac25d705ec6591dcf95f90b8..679748b3c2fb694e61c38ae9bec8b13680205a42 100644 (file)
@@ -1,7 +1,43 @@
-USING: circular disjoint-sets kernel math math.ranges
-sequences ;
+! Copyright (c) 2008 Eric Mertens.
+! See http://factorcode.org/license.txt for BSD license.
+USING: circular disjoint-sets kernel math math.ranges sequences ;
 IN: project-euler.186
 
+! http://projecteuler.net/index.php?section=problems&id=186
+
+! DESCRIPTION
+! -----------
+
+! Here are the records from a busy telephone system with one million users:
+
+!     RecNr  Caller  Called
+!     1      200007  100053
+!     2      600183  500439
+!     3      600863  701497
+!     ...    ...     ...
+
+! The telephone number of the caller and the called number in record n are
+! Caller(n) = S2n-1 and Called(n) = S2n where S1,2,3,... come from the "Lagged
+! Fibonacci Generator":
+
+! For 1 <= k <= 55, Sk = [100003 - 200003k + 300007k^3] (modulo 1000000)
+! For 56 <= k, Sk = [Sk-24 + Sk-55] (modulo 1000000)
+
+! If Caller(n) = Called(n) then the user is assumed to have misdialled and the
+! call fails; otherwise the call is successful.
+
+! From the start of the records, we say that any pair of users X and Y are
+! friends if X calls Y or vice-versa. Similarly, X is a friend of a friend of Z
+! if X is a friend of Y and Y is a friend of Z; and so on for longer chains.
+
+! The Prime Minister's phone number is 524287. After how many successful calls,
+! not counting misdials, will 99% of the users (including the PM) be a friend,
+! or a friend of a friend etc., of the Prime Minister?
+
+
+! SOLUTION
+! --------
+
 : (generator) ( k -- n )
     dup sq 300007 * 200003 - * 100003 + 1000000 rem ;
 
@@ -15,11 +51,10 @@ IN: project-euler.186
     [ first ] [ advance ] bi ;
 
 : 2unless? ( x y ?quot quot -- )
-    >r 2keep rot [ 2drop ] r> if ; inline
+    [ 2keep rot [ 2drop ] ] dip if ; inline
 
 : (p186) ( generator counter unionfind -- counter )
-    524287 over equiv-set-size 990000 <
-    [
+    524287 over equiv-set-size 990000 < [
         pick [ next ] [ next ] bi
         [ = ] [
             pick equate
@@ -35,4 +70,7 @@ IN: project-euler.186
 : euler186 ( -- n )
     <generator> 0 1000000 <relation> (p186) ;
 
+! [ euler186 ] 10 ave-time
+! 18572 ms ave run time - 796.87 SD (10 trials)
+
 MAIN: euler186
diff --git a/extra/project-euler/190/190-tests.factor b/extra/project-euler/190/190-tests.factor
new file mode 100644 (file)
index 0000000..edcfa98
--- /dev/null
@@ -0,0 +1,4 @@
+USING: project-euler.190 tools.test ;
+IN: project-euler.190.tests
+
+[ 371048281 ] [ euler190 ] unit-test
index c0b7cb577fbf563796987b5dd82f2a11f6795a23..84ab74bb031177a7c0dddd9c3006518cb40718ec 100644 (file)
@@ -49,6 +49,6 @@ PRIVATE>
     2 15 [a,b] [ P_m truncate ] sigma ;
 
 ! [ euler150 ] 100 ave-time
-! 7 ms run time - 100 trials
+! 5 ms ave run time - 1.01 SD (100 trials)
 
 MAIN: euler190
index df96d5e21105cede7807d470d2eb6bfbc097cb16..f176bbc7d2782b6bec5feb34268137fb1330e82d 100644 (file)
@@ -1,20 +1,21 @@
 ! Copyright (c) 2007 Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: continuations io kernel math math.functions math.parser math.statistics
-    namespaces make tools.time ;
+USING: continuations fry io kernel make math math.functions math.parser
+    math.statistics memory tools.time ;
 IN: project-euler.ave-time
 
 : collect-benchmarks ( quot n -- seq )
-  [
-    >r >r datastack r> [ benchmark , ] curry tuck
-    [ with-datastack drop ] 2curry r> swap times call
-  ] { } make ;
+    [
+        [ datastack ]
+        [ '[ _ gc benchmark , ] tuck '[ _ _ with-datastack drop ] ]
+        [ 1- ] tri* swap times call
+    ] { } make ; inline
 
 : nth-place ( x n -- y )
     10 swap ^ [ * round ] keep / ;
 
 : ave-time ( quot n -- )
-    [ collect-benchmarks ] keep
-    swap [ std 2 nth-place ] [ mean round ] bi [
+    [ collect-benchmarks ] keep swap
+    [ std 2 nth-place ] [ mean round ] bi [
         # " ms ave run time - " % # " SD (" % # " trials)" %
     ] "" make print flush ; inline
index 094893616b50386b83bc99f960a626fc95592b17..d3263bbc1e31a64d209f0ce1937b4a0b8dd9777b 100644 (file)
@@ -1,7 +1,8 @@
-USING: arrays kernel math math.functions math.miller-rabin
-math.matrices math.order math.parser math.primes.factors
-math.ranges namespaces make sequences sequences.lib sorting
-unicode.case ;
+! Copyright (c) 2007-2008 Aaron Schaefer.
+! See http://factorcode.org/license.txt for BSD license.
+USING: arrays kernel make math math.functions math.matrices math.miller-rabin
+    math.order math.parser math.primes.factors math.ranges sequences
+    sequences.lib sorting strings unicode.case ;
 IN: project-euler.common
 
 ! A collection of words used by more than one Project Euler solution
@@ -11,11 +12,10 @@ IN: project-euler.common
 ! -------------------------------
 ! alpha-value - #22, #42
 ! cartesian-product - #4, #27, #29, #32, #33, #43, #44, #56
-! collect-consecutive - #8, #11
 ! log10 - #25, #134
 ! max-path - #18, #67
 ! nth-triangle - #12, #42
-! number>digits - #16, #20, #30, #34, #35, #38, #43, #52, #55, #56
+! number>digits - #16, #20, #30, #34, #35, #38, #43, #52, #55, #56, #92
 ! palindrome? - #4, #36, #55
 ! pandigital? - #32, #38
 ! pentagonal? - #44, #45
@@ -25,27 +25,21 @@ IN: project-euler.common
 ! [uad]-transform - #39, #75
 
 
-: nth-pair ( n seq -- nth next )
-    over 1+ over nth >r nth r> ;
+: nth-pair ( seq n -- nth next )
+    tail-slice first2 ;
 
 : perfect-square? ( n -- ? )
     dup sqrt mod zero? ;
 
 <PRIVATE
 
-: count-shifts ( seq width -- n )
-    >r length 1+ r> - ;
-
 : max-children ( seq -- seq )
-    [ dup length 1- [ over nth-pair max , ] each ] { } make nip ;
+    [ dup length 1- [ nth-pair max , ] with each ] { } make ;
 
 ! Propagate one row into the upper one
 : propagate ( bottom top -- newtop )
     [ over rest rot first2 max rot + ] map nip ;
 
-: shift-3rd ( seq obj obj -- seq obj obj )
-    rot rest -rot ;
-
 : (sum-divisors) ( n -- sum )
     dup sqrt >fixnum [1,b] [
         [ 2dup mod zero? [ 2dup / + , ] [ drop ] if ] each
@@ -63,11 +57,6 @@ PRIVATE>
 : cartesian-product ( seq1 seq2 -- seq1xseq2 )
     swap [ swap [ 2array ] map-with ] map-with concat ;
 
-: collect-consecutive ( seq width -- seq )
-    [
-        2dup count-shifts [ 2dup head shift-3rd , ] times
-    ] { } make 2nip ;
-
 : log10 ( m -- n )
     log 10 log / ;
 
@@ -88,15 +77,16 @@ PRIVATE>
     number>string dup reverse = ;
 
 : pandigital? ( n -- ? )
-    number>string natural-sort "123456789" = ;
+    number>string natural-sort >string "123456789" = ;
 
 : pentagonal? ( n -- ? )
     dup 0 > [ 24 * 1+ sqrt 1+ 6 / 1 mod zero? ] [ drop f ] if ;
 
 ! Not strictly needed, but it is nice to be able to dump the triangle after the
 ! propagation
-: propagate-all ( triangle -- newtriangle )
-    reverse [ first dup ] keep rest [ propagate dup ] map nip reverse swap suffix ;
+: propagate-all ( triangle -- new-triangle )
+    reverse [ first dup ] [ rest ] bi
+    [ propagate dup ] map nip reverse swap suffix ;
 
 : sum-divisors ( n -- sum )
     dup 4 < [ { 0 1 3 4 } nth ] [ (sum-divisors) ] if ;
@@ -119,8 +109,9 @@ PRIVATE>
 
 ! Optimized brute-force, is often faster than prime factorization
 : tau* ( m -- n )
-    factor-2s [ 1+ ] dip [ perfect-square? -1 0 ? ] keep
-    dup sqrt >fixnum [1,b] [
+    factor-2s dup [ 1+ ]
+    [ perfect-square? -1 0 ? ]
+    [ dup sqrt >fixnum [1,b] ] tri* [
         dupd mod zero? [ [ 2 + ] dip ] when
     ] each drop * ;
 
index 9dfaad0e7b88f2b96e79939b4f0d0dad8f9dc699..5192e23a27fa0fcb174a507460232f34f88d180f 100644 (file)
@@ -14,12 +14,12 @@ USING: definitions io io.files kernel math math.parser project-euler.ave-time
     project-euler.037 project-euler.038 project-euler.039 project-euler.040
     project-euler.041 project-euler.042 project-euler.043 project-euler.044
     project-euler.045 project-euler.046 project-euler.047 project-euler.048
-    project-euler.052 project-euler.053 project-euler.056 project-euler.059
-    project-euler.067 project-euler.075 project-euler.079 project-euler.092
-    project-euler.097 project-euler.100 project-euler.116 project-euler.117
-    project-euler.134 project-euler.148 project-euler.150 project-euler.151
-    project-euler.164 project-euler.169 project-euler.173 project-euler.175
-    project-euler.186 project-euler.190 ;
+    project-euler.052 project-euler.053 project-euler.055 project-euler.056
+    project-euler.059 project-euler.067 project-euler.075 project-euler.076
+    project-euler.079 project-euler.092 project-euler.097 project-euler.100
+    project-euler.116 project-euler.117 project-euler.134 project-euler.148
+    project-euler.150 project-euler.151 project-euler.164 project-euler.169
+    project-euler.173 project-euler.175 project-euler.186 project-euler.190 ;
 IN: project-euler
 
 <PRIVATE