From f59071189c478a2d211f3bbf083fd45ab8b5cbe1 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 18 Nov 2008 10:19:29 -0500 Subject: [PATCH 01/15] Moved math.polynomials to extra --- {extra => basis}/math/polynomials/authors.txt | 0 {extra => basis}/math/polynomials/polynomials-docs.factor | 0 {extra => basis}/math/polynomials/polynomials-tests.factor | 0 {extra => basis}/math/polynomials/polynomials.factor | 0 {extra => basis}/math/polynomials/summary.txt | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {extra => basis}/math/polynomials/authors.txt (100%) rename {extra => basis}/math/polynomials/polynomials-docs.factor (100%) rename {extra => basis}/math/polynomials/polynomials-tests.factor (100%) rename {extra => basis}/math/polynomials/polynomials.factor (100%) rename {extra => basis}/math/polynomials/summary.txt (100%) diff --git a/extra/math/polynomials/authors.txt b/basis/math/polynomials/authors.txt similarity index 100% rename from extra/math/polynomials/authors.txt rename to basis/math/polynomials/authors.txt diff --git a/extra/math/polynomials/polynomials-docs.factor b/basis/math/polynomials/polynomials-docs.factor similarity index 100% rename from extra/math/polynomials/polynomials-docs.factor rename to basis/math/polynomials/polynomials-docs.factor diff --git a/extra/math/polynomials/polynomials-tests.factor b/basis/math/polynomials/polynomials-tests.factor similarity index 100% rename from extra/math/polynomials/polynomials-tests.factor rename to basis/math/polynomials/polynomials-tests.factor diff --git a/extra/math/polynomials/polynomials.factor b/basis/math/polynomials/polynomials.factor similarity index 100% rename from extra/math/polynomials/polynomials.factor rename to basis/math/polynomials/polynomials.factor diff --git a/extra/math/polynomials/summary.txt b/basis/math/polynomials/summary.txt similarity index 100% rename from extra/math/polynomials/summary.txt rename to basis/math/polynomials/summary.txt From 5869a1aab48fa5cb6afef8000658aba963587f63 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 18 Nov 2008 10:20:44 -0500 Subject: [PATCH 02/15] Move math.combinatorics to basis --- {extra => basis}/math/combinatorics/authors.txt | 0 {extra => basis}/math/combinatorics/combinatorics-docs.factor | 0 {extra => basis}/math/combinatorics/combinatorics-tests.factor | 0 {extra => basis}/math/combinatorics/combinatorics.factor | 0 {extra => basis}/math/combinatorics/summary.txt | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {extra => basis}/math/combinatorics/authors.txt (100%) rename {extra => basis}/math/combinatorics/combinatorics-docs.factor (100%) rename {extra => basis}/math/combinatorics/combinatorics-tests.factor (100%) rename {extra => basis}/math/combinatorics/combinatorics.factor (100%) rename {extra => basis}/math/combinatorics/summary.txt (100%) diff --git a/extra/math/combinatorics/authors.txt b/basis/math/combinatorics/authors.txt similarity index 100% rename from extra/math/combinatorics/authors.txt rename to basis/math/combinatorics/authors.txt diff --git a/extra/math/combinatorics/combinatorics-docs.factor b/basis/math/combinatorics/combinatorics-docs.factor similarity index 100% rename from extra/math/combinatorics/combinatorics-docs.factor rename to basis/math/combinatorics/combinatorics-docs.factor diff --git a/extra/math/combinatorics/combinatorics-tests.factor b/basis/math/combinatorics/combinatorics-tests.factor similarity index 100% rename from extra/math/combinatorics/combinatorics-tests.factor rename to basis/math/combinatorics/combinatorics-tests.factor diff --git a/extra/math/combinatorics/combinatorics.factor b/basis/math/combinatorics/combinatorics.factor similarity index 100% rename from extra/math/combinatorics/combinatorics.factor rename to basis/math/combinatorics/combinatorics.factor diff --git a/extra/math/combinatorics/summary.txt b/basis/math/combinatorics/summary.txt similarity index 100% rename from extra/math/combinatorics/summary.txt rename to basis/math/combinatorics/summary.txt From 1ffc6051cdad982b99bfbdda312beb5251a5732b Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 18 Nov 2008 10:22:16 -0500 Subject: [PATCH 03/15] Move math.blas to basis --- {extra => basis}/math/blas/cblas/authors.txt | 0 {extra => basis}/math/blas/cblas/cblas.factor | 0 {extra => basis}/math/blas/cblas/summary.txt | 0 {extra => basis}/math/blas/cblas/tags.txt | 0 {extra => basis}/math/blas/matrices/authors.txt | 0 {extra => basis}/math/blas/matrices/matrices-docs.factor | 0 {extra => basis}/math/blas/matrices/matrices-tests.factor | 0 {extra => basis}/math/blas/matrices/matrices.factor | 0 {extra => basis}/math/blas/matrices/summary.txt | 0 {extra => basis}/math/blas/matrices/tags.txt | 0 {extra => basis}/math/blas/syntax/authors.txt | 0 {extra => basis}/math/blas/syntax/summary.txt | 0 {extra => basis}/math/blas/syntax/syntax-docs.factor | 0 {extra => basis}/math/blas/syntax/syntax.factor | 0 {extra => basis}/math/blas/syntax/tags.txt | 0 {extra => basis}/math/blas/vectors/authors.txt | 0 {extra => basis}/math/blas/vectors/summary.txt | 0 {extra => basis}/math/blas/vectors/tags.txt | 0 {extra => basis}/math/blas/vectors/vectors-docs.factor | 0 {extra => basis}/math/blas/vectors/vectors-tests.factor | 0 {extra => basis}/math/blas/vectors/vectors.factor | 0 21 files changed, 0 insertions(+), 0 deletions(-) rename {extra => basis}/math/blas/cblas/authors.txt (100%) rename {extra => basis}/math/blas/cblas/cblas.factor (100%) rename {extra => basis}/math/blas/cblas/summary.txt (100%) rename {extra => basis}/math/blas/cblas/tags.txt (100%) rename {extra => basis}/math/blas/matrices/authors.txt (100%) rename {extra => basis}/math/blas/matrices/matrices-docs.factor (100%) rename {extra => basis}/math/blas/matrices/matrices-tests.factor (100%) rename {extra => basis}/math/blas/matrices/matrices.factor (100%) rename {extra => basis}/math/blas/matrices/summary.txt (100%) rename {extra => basis}/math/blas/matrices/tags.txt (100%) rename {extra => basis}/math/blas/syntax/authors.txt (100%) rename {extra => basis}/math/blas/syntax/summary.txt (100%) rename {extra => basis}/math/blas/syntax/syntax-docs.factor (100%) rename {extra => basis}/math/blas/syntax/syntax.factor (100%) rename {extra => basis}/math/blas/syntax/tags.txt (100%) rename {extra => basis}/math/blas/vectors/authors.txt (100%) rename {extra => basis}/math/blas/vectors/summary.txt (100%) rename {extra => basis}/math/blas/vectors/tags.txt (100%) rename {extra => basis}/math/blas/vectors/vectors-docs.factor (100%) rename {extra => basis}/math/blas/vectors/vectors-tests.factor (100%) rename {extra => basis}/math/blas/vectors/vectors.factor (100%) diff --git a/extra/math/blas/cblas/authors.txt b/basis/math/blas/cblas/authors.txt similarity index 100% rename from extra/math/blas/cblas/authors.txt rename to basis/math/blas/cblas/authors.txt diff --git a/extra/math/blas/cblas/cblas.factor b/basis/math/blas/cblas/cblas.factor similarity index 100% rename from extra/math/blas/cblas/cblas.factor rename to basis/math/blas/cblas/cblas.factor diff --git a/extra/math/blas/cblas/summary.txt b/basis/math/blas/cblas/summary.txt similarity index 100% rename from extra/math/blas/cblas/summary.txt rename to basis/math/blas/cblas/summary.txt diff --git a/extra/math/blas/cblas/tags.txt b/basis/math/blas/cblas/tags.txt similarity index 100% rename from extra/math/blas/cblas/tags.txt rename to basis/math/blas/cblas/tags.txt diff --git a/extra/math/blas/matrices/authors.txt b/basis/math/blas/matrices/authors.txt similarity index 100% rename from extra/math/blas/matrices/authors.txt rename to basis/math/blas/matrices/authors.txt diff --git a/extra/math/blas/matrices/matrices-docs.factor b/basis/math/blas/matrices/matrices-docs.factor similarity index 100% rename from extra/math/blas/matrices/matrices-docs.factor rename to basis/math/blas/matrices/matrices-docs.factor diff --git a/extra/math/blas/matrices/matrices-tests.factor b/basis/math/blas/matrices/matrices-tests.factor similarity index 100% rename from extra/math/blas/matrices/matrices-tests.factor rename to basis/math/blas/matrices/matrices-tests.factor diff --git a/extra/math/blas/matrices/matrices.factor b/basis/math/blas/matrices/matrices.factor similarity index 100% rename from extra/math/blas/matrices/matrices.factor rename to basis/math/blas/matrices/matrices.factor diff --git a/extra/math/blas/matrices/summary.txt b/basis/math/blas/matrices/summary.txt similarity index 100% rename from extra/math/blas/matrices/summary.txt rename to basis/math/blas/matrices/summary.txt diff --git a/extra/math/blas/matrices/tags.txt b/basis/math/blas/matrices/tags.txt similarity index 100% rename from extra/math/blas/matrices/tags.txt rename to basis/math/blas/matrices/tags.txt diff --git a/extra/math/blas/syntax/authors.txt b/basis/math/blas/syntax/authors.txt similarity index 100% rename from extra/math/blas/syntax/authors.txt rename to basis/math/blas/syntax/authors.txt diff --git a/extra/math/blas/syntax/summary.txt b/basis/math/blas/syntax/summary.txt similarity index 100% rename from extra/math/blas/syntax/summary.txt rename to basis/math/blas/syntax/summary.txt diff --git a/extra/math/blas/syntax/syntax-docs.factor b/basis/math/blas/syntax/syntax-docs.factor similarity index 100% rename from extra/math/blas/syntax/syntax-docs.factor rename to basis/math/blas/syntax/syntax-docs.factor diff --git a/extra/math/blas/syntax/syntax.factor b/basis/math/blas/syntax/syntax.factor similarity index 100% rename from extra/math/blas/syntax/syntax.factor rename to basis/math/blas/syntax/syntax.factor diff --git a/extra/math/blas/syntax/tags.txt b/basis/math/blas/syntax/tags.txt similarity index 100% rename from extra/math/blas/syntax/tags.txt rename to basis/math/blas/syntax/tags.txt diff --git a/extra/math/blas/vectors/authors.txt b/basis/math/blas/vectors/authors.txt similarity index 100% rename from extra/math/blas/vectors/authors.txt rename to basis/math/blas/vectors/authors.txt diff --git a/extra/math/blas/vectors/summary.txt b/basis/math/blas/vectors/summary.txt similarity index 100% rename from extra/math/blas/vectors/summary.txt rename to basis/math/blas/vectors/summary.txt diff --git a/extra/math/blas/vectors/tags.txt b/basis/math/blas/vectors/tags.txt similarity index 100% rename from extra/math/blas/vectors/tags.txt rename to basis/math/blas/vectors/tags.txt diff --git a/extra/math/blas/vectors/vectors-docs.factor b/basis/math/blas/vectors/vectors-docs.factor similarity index 100% rename from extra/math/blas/vectors/vectors-docs.factor rename to basis/math/blas/vectors/vectors-docs.factor diff --git a/extra/math/blas/vectors/vectors-tests.factor b/basis/math/blas/vectors/vectors-tests.factor similarity index 100% rename from extra/math/blas/vectors/vectors-tests.factor rename to basis/math/blas/vectors/vectors-tests.factor diff --git a/extra/math/blas/vectors/vectors.factor b/basis/math/blas/vectors/vectors.factor similarity index 100% rename from extra/math/blas/vectors/vectors.factor rename to basis/math/blas/vectors/vectors.factor From c3f05eaaa141440c3f0cd77b787ced32108df924 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 18 Nov 2008 10:22:48 -0500 Subject: [PATCH 04/15] Move math.quaternions to extra --- {extra => basis}/math/quaternions/authors.txt | 0 {extra => basis}/math/quaternions/quaternions-docs.factor | 0 {extra => basis}/math/quaternions/quaternions-tests.factor | 0 {extra => basis}/math/quaternions/quaternions.factor | 0 {extra => basis}/math/quaternions/summary.txt | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {extra => basis}/math/quaternions/authors.txt (100%) rename {extra => basis}/math/quaternions/quaternions-docs.factor (100%) rename {extra => basis}/math/quaternions/quaternions-tests.factor (100%) rename {extra => basis}/math/quaternions/quaternions.factor (100%) rename {extra => basis}/math/quaternions/summary.txt (100%) diff --git a/extra/math/quaternions/authors.txt b/basis/math/quaternions/authors.txt similarity index 100% rename from extra/math/quaternions/authors.txt rename to basis/math/quaternions/authors.txt diff --git a/extra/math/quaternions/quaternions-docs.factor b/basis/math/quaternions/quaternions-docs.factor similarity index 100% rename from extra/math/quaternions/quaternions-docs.factor rename to basis/math/quaternions/quaternions-docs.factor diff --git a/extra/math/quaternions/quaternions-tests.factor b/basis/math/quaternions/quaternions-tests.factor similarity index 100% rename from extra/math/quaternions/quaternions-tests.factor rename to basis/math/quaternions/quaternions-tests.factor diff --git a/extra/math/quaternions/quaternions.factor b/basis/math/quaternions/quaternions.factor similarity index 100% rename from extra/math/quaternions/quaternions.factor rename to basis/math/quaternions/quaternions.factor diff --git a/extra/math/quaternions/summary.txt b/basis/math/quaternions/summary.txt similarity index 100% rename from extra/math/quaternions/summary.txt rename to basis/math/quaternions/summary.txt From 47d268d8947f27011dc3b52e4a153a17191f7d55 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 18 Nov 2008 10:30:11 -0500 Subject: [PATCH 05/15] Remove documentation duplication in math.statistics --- extra/math/statistics/statistics-docs.factor | 11 ++++++----- extra/math/statistics/statistics.factor | 10 +--------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/extra/math/statistics/statistics-docs.factor b/extra/math/statistics/statistics-docs.factor index 695834b554..7a7eb70dd2 100644 --- a/extra/math/statistics/statistics-docs.factor +++ b/extra/math/statistics/statistics-docs.factor @@ -3,13 +3,14 @@ IN: math.statistics HELP: geometric-mean { $values { "seq" "a sequence of numbers" } { "n" "a non-negative real number"} } -{ $description "Computes the geometric mean of all elements in " { $snippet "seq" } ". The geometric mean measures the central tendency of a data set that minimizes the effects of extreme values." } +{ $description "Computes the geometric mean of all elements in " { $snippet "seq" } ". The geometric mean measures the central tendency of a data set that minimizes the effects of extreme values." } { $examples { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 } geometric-mean ." "1.81712059283214" } } { $errors "Throws a " { $link signal-error. } " (square-root of 0) if the sequence is empty." } ; HELP: harmonic-mean { $values { "seq" "a sequence of numbers" } { "n" "a non-negative real number"} } -{ $description "Computes the harmonic mean of the elements in " { $snippet "seq" } ". The harmonic mean is appropriate when the average of rates is desired." } +{ $description "Computes the harmonic mean of the elements in " { $snippet "seq" } ". The harmonic mean is appropriate when the average of rates is desired." } +{ $notes "Positive reals only." } { $examples { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 } harmonic-mean ." "6/11" } } { $errors "Throws a " { $link signal-error. } " (divide by zero) if the sequence is empty." } ; @@ -36,21 +37,21 @@ HELP: range HELP: std { $values { "seq" "a sequence of numbers" } { "x" "a non-negative real number"} } -{ $description "Computes the standard deviation of " { $snippet "seq" } " by squaring the variance of the sequence. It measures how widely spread the values in a sequence are about the mean." } +{ $description "Computes the standard deviation of " { $snippet "seq" } ", which is the square root of the variance. It measures how widely spread the values in a sequence are about the mean." } { $examples { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 } std ." "1.0" } { $example "USING: math.statistics prettyprint ;" "{ 1 2 3 4 } std ." "1.290994448735806" } } ; HELP: ste { $values { "seq" "a sequence of numbers" } { "x" "a non-negative real number"} } - { $description "Computes the standard error of the mean for " { $snippet "seq" } ". It's defined as the standard deviation divided by the square root of the length of the sequence, and measures uncertainty associated with the estimate of the mean." } + { $description "Computes the standard error of the mean for " { $snippet "seq" } ". It's defined as the standard deviation divided by the square root of the length of the sequence, and measures uncertainty associated with the estimate of the mean." } { $examples { $example "USING: math.statistics prettyprint ;" "{ -2 2 } ste ." "2.0" } { $example "USING: math.statistics prettyprint ;" "{ -2 2 2 } ste ." "1.333333333333333" } } ; HELP: var { $values { "seq" "a sequence of numbers" } { "x" "a non-negative real number"} } -{ $description "Computes the variance of " { $snippet "seq" } ". It's a measurement of the spread of values in a sequence. The larger the variance, the larger the distance of values from the mean." } +{ $description "Computes the variance of " { $snippet "seq" } ". It's a measurement of the spread of values in a sequence. The larger the variance, the larger the distance of values from the mean." } { $notes "If the number of elements in " { $snippet "seq" } " is 1 or less, it outputs 0." } { $examples { $example "USING: math.statistics prettyprint ;" "{ 1 } var ." "0" } diff --git a/extra/math/statistics/statistics.factor b/extra/math/statistics/statistics.factor index 7568af5294..d2494ee32a 100644 --- a/extra/math/statistics/statistics.factor +++ b/extra/math/statistics/statistics.factor @@ -5,20 +5,15 @@ USING: arrays combinators kernel math math.analysis math.functions sequences IN: math.statistics : mean ( seq -- n ) - #! arithmetic mean, sum divided by length [ sum ] [ length ] bi / ; : geometric-mean ( seq -- n ) - #! geometric mean, nth root of product [ length ] [ product ] bi nth-root ; : harmonic-mean ( seq -- n ) - #! harmonic mean, reciprocal of sum of reciprocals. - #! positive reals only [ recip ] sigma recip ; : median ( seq -- n ) - #! middle number if odd, avg of two middle numbers if even natural-sort dup length even? [ [ midpoint@ dup 1- 2array ] keep nths mean ] [ @@ -26,11 +21,10 @@ IN: math.statistics ] if ; : range ( seq -- n ) - #! max - min minmax swap - ; : var ( seq -- x ) - #! variance, normalize by N-1 + #! normalize by N-1 dup length 1 <= [ drop 0 ] [ @@ -39,11 +33,9 @@ IN: math.statistics ] if ; : std ( seq -- x ) - #! standard deviation, sqrt of variance var sqrt ; : ste ( seq -- x ) - #! standard error, standard deviation / sqrt ( length of sequence ) [ std ] [ length ] bi sqrt / ; : ((r)) ( mean(x) mean(y) {x} {y} -- (r) ) From 197bb708934f6ab2b4c4f3960d9e284e73832bf4 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 18 Nov 2008 10:31:07 -0500 Subject: [PATCH 06/15] Move math.statistics to extra --- {extra => basis}/math/statistics/authors.txt | 0 {extra => basis}/math/statistics/statistics-docs.factor | 0 {extra => basis}/math/statistics/statistics-tests.factor | 0 {extra => basis}/math/statistics/statistics.factor | 0 {extra => basis}/math/statistics/summary.txt | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename {extra => basis}/math/statistics/authors.txt (100%) rename {extra => basis}/math/statistics/statistics-docs.factor (100%) rename {extra => basis}/math/statistics/statistics-tests.factor (100%) rename {extra => basis}/math/statistics/statistics.factor (100%) rename {extra => basis}/math/statistics/summary.txt (100%) diff --git a/extra/math/statistics/authors.txt b/basis/math/statistics/authors.txt similarity index 100% rename from extra/math/statistics/authors.txt rename to basis/math/statistics/authors.txt diff --git a/extra/math/statistics/statistics-docs.factor b/basis/math/statistics/statistics-docs.factor similarity index 100% rename from extra/math/statistics/statistics-docs.factor rename to basis/math/statistics/statistics-docs.factor diff --git a/extra/math/statistics/statistics-tests.factor b/basis/math/statistics/statistics-tests.factor similarity index 100% rename from extra/math/statistics/statistics-tests.factor rename to basis/math/statistics/statistics-tests.factor diff --git a/extra/math/statistics/statistics.factor b/basis/math/statistics/statistics.factor similarity index 100% rename from extra/math/statistics/statistics.factor rename to basis/math/statistics/statistics.factor diff --git a/extra/math/statistics/summary.txt b/basis/math/statistics/summary.txt similarity index 100% rename from extra/math/statistics/summary.txt rename to basis/math/statistics/summary.txt From 9a870b7760e0d8e042a0aba678844fe0abdcf75a Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Thu, 20 Nov 2008 01:48:43 -0500 Subject: [PATCH 07/15] Solution to Project Euler problem 50 --- extra/project-euler/050/050-tests.factor | 6 ++ extra/project-euler/050/050.factor | 90 ++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 extra/project-euler/050/050-tests.factor create mode 100644 extra/project-euler/050/050.factor diff --git a/extra/project-euler/050/050-tests.factor b/extra/project-euler/050/050-tests.factor new file mode 100644 index 0000000000..2bd5482f7e --- /dev/null +++ b/extra/project-euler/050/050-tests.factor @@ -0,0 +1,6 @@ +USING: project-euler.050 project-euler.050.private tools.test ; +IN: project-euler.050.tests + +[ 41 ] [ 100 solve ] unit-test +[ 953 ] [ 1000 solve ] unit-test +[ 997651 ] [ euler050 ] unit-test diff --git a/extra/project-euler/050/050.factor b/extra/project-euler/050/050.factor new file mode 100644 index 0000000000..f8ce68d173 --- /dev/null +++ b/extra/project-euler/050/050.factor @@ -0,0 +1,90 @@ +! Copyright (c) 2008 Aaron Schaefer. +! See http://factorcode.org/license.txt for BSD license. +USING: arrays kernel locals math math.primes sequences ; +IN: project-euler.050 + +! http://projecteuler.net/index.php?section=problems&id=50 + +! DESCRIPTION +! ----------- + +! The prime 41, can be written as the sum of six consecutive primes: + +! 41 = 2 + 3 + 5 + 7 + 11 + 13 + +! This is the longest sum of consecutive primes that adds to a prime below +! one-hundred. + +! The longest sum of consecutive primes below one-thousand that adds to a +! prime, contains 21 terms, and is equal to 953. + +! Which prime, below one-million, can be written as the sum of the most +! consecutive primes? + + +! SOLUTION +! -------- + +! 1) Create an sequence of all primes under 1000000. +! 2) Start summing elements in the sequence until the next number would put you +! over 1000000. +! 3) Check if that sum is prime, if not, subtract the last number added. +! 4) Repeat step 3 until you get a prime number, and store it along with the +! how many consecutive numbers from the original sequence it took to get there. +! 5) Drop the first number from the sequence of primes, and do steps 2-4 again +! 6) Compare the longest chain from the first run with the second run, and store +! the longer of the two. +! 7) If the sequence of primes is still longer than the longest chain, then +! repeat steps 5-7...otherwise, you've found the longest sum of consecutive +! primes! + + ] find + [ swapd - ] [ drop seq length swap ] if* ; + +: pop-until-prime ( seq sum -- seq prime ) + over length 0 > [ + [ unclip-last-slice ] dip swap - + dup prime? [ pop-until-prime ] unless + ] [ + 2drop { } 0 + ] if ; + +! a pair is { length of chain, prime the chain sums to } + +: longest-prime ( seq limit -- pair ) + dupd sum-upto dup prime? [ + 2array nip + ] [ + [ head-slice ] dip pop-until-prime + [ length ] dip 2array + ] if ; + +: longest ( pair pair -- longest ) + 2dup [ first ] bi@ > [ drop ] [ nip ] if ; + +: continue? ( pair seq -- ? ) + [ first ] [ length 1- ] bi* < ; + +: (find-longest) ( best seq limit -- best ) + [ longest-prime longest ] 2keep 2over continue? [ + [ rest-slice ] dip (find-longest) + ] [ 2drop ] if ; + +: find-longest ( seq limit -- best ) + { 1 2 } -rot (find-longest) ; + +: solve ( n -- answer ) + [ primes-upto ] keep find-longest second ; + +PRIVATE> + +: euler050 ( -- answer ) + 1000000 solve ; + +! [ euler050 ] 100 ave-time +! 291 ms run / 20.6 ms GC ave time - 100 trials + +MAIN: euler050 From 6333710f7df99fdce78ec6854a6ccc94b6d96388 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Mon, 24 Nov 2008 22:05:43 -0500 Subject: [PATCH 08/15] Fix ave-time considering switch to micro seconds --- extra/project-euler/ave-time/ave-time.factor | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/extra/project-euler/ave-time/ave-time.factor b/extra/project-euler/ave-time/ave-time.factor index f176bbc7d2..a7762836f1 100644 --- a/extra/project-euler/ave-time/ave-time.factor +++ b/extra/project-euler/ave-time/ave-time.factor @@ -1,21 +1,24 @@ -! Copyright (c) 2007 Aaron Schaefer. +! Copyright (c) 2007, 2008 Aaron Schaefer. ! See http://factorcode.org/license.txt for BSD license. USING: continuations fry io kernel make math math.functions math.parser math.statistics memory tools.time ; IN: project-euler.ave-time +: nth-place ( x n -- y ) + 10 swap ^ [ * round >integer ] keep /f ; + : collect-benchmarks ( quot n -- seq ) [ [ datastack ] - [ '[ _ gc benchmark , ] tuck '[ _ _ with-datastack drop ] ] + [ + '[ _ gc benchmark 1000 / , ] 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 [ + [ std 2 nth-place ] [ mean round >integer ] bi [ # " ms ave run time - " % # " SD (" % # " trials)" % ] "" make print flush ; inline From 46911bc79744e5ddca070a86335af956f915dad2 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Tue, 2 Dec 2008 00:46:38 -0500 Subject: [PATCH 09/15] Add alternate solution to Project Euler problem #2 --- extra/project-euler/002/002-tests.factor | 1 + extra/project-euler/002/002.factor | 31 ++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/extra/project-euler/002/002-tests.factor b/extra/project-euler/002/002-tests.factor index bb02518580..46015bee3e 100644 --- a/extra/project-euler/002/002-tests.factor +++ b/extra/project-euler/002/002-tests.factor @@ -3,3 +3,4 @@ IN: project-euler.002.tests [ 4613732 ] [ euler002 ] unit-test [ 4613732 ] [ euler002a ] unit-test +[ 4613732 ] [ euler002b ] unit-test diff --git a/extra/project-euler/002/002.factor b/extra/project-euler/002/002.factor index fae535cba9..da20c874b5 100644 --- a/extra/project-euler/002/002.factor +++ b/extra/project-euler/002/002.factor @@ -1,4 +1,4 @@ -! Copyright (c) 2007 Aaron Schaefer, Alexander Solovyov. +! Copyright (c) 2007, 2008 Aaron Schaefer, Alexander Solovyov, Vishal Talwar. ! See http://factorcode.org/license.txt for BSD license. USING: kernel math sequences shuffle ; IN: project-euler.002 @@ -50,4 +50,31 @@ PRIVATE> ! [ euler002a ] 100 ave-time ! 0 ms ave run time - 0.2 SD (100 trials) -MAIN: euler002a + + [ + 3drop + ] [ + [ ?retotal next-fibs ] dip (sum-even-fibs-below) + ] if ; + +PRIVATE> + +: sum-even-fibs-below ( max -- sum ) + [ 0 0 1 ] dip (sum-even-fibs-below) ; + +: euler002b ( -- answer ) + 4000000 sum-even-fibs-below ; + +! [ euler002b ] 100 ave-time +! 0 ms ave run time - 0.0 SD (100 trials) + +MAIN: euler002b From e6b585c376c2537b0221c3c1b5fcb59e655db5dc Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Wed, 3 Dec 2008 13:26:31 -0500 Subject: [PATCH 10/15] Fix example in spread combinator article --- core/kernel/kernel-docs.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/kernel/kernel-docs.factor b/core/kernel/kernel-docs.factor index 3fc3d175a0..ca18476ce5 100644 --- a/core/kernel/kernel-docs.factor +++ b/core/kernel/kernel-docs.factor @@ -770,7 +770,7 @@ $nl "Technically, the spread combinators are redundant because they can be simulated using shuffle words and other combinators, and in addition, they do not reduce token counts by much, if at all. However, they can make code more readable by expressing intention and exploiting any inherent symmetry. For example, a piece of code which performs three operations on three related values can be written in one of two ways:" { $code "! First alternative; uses dip" - "[ [ 1 + ] dip 1 - dip ] 2 *" + "[ [ 1 + ] dip 1 - ] dip 2 *" "! Second alternative: uses tri*" "[ 1 + ] [ 1 - ] [ 2 * ] tri*" } From ca73c06194a9bf5c631bd86c28083f4eba56b9f1 Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Thu, 4 Dec 2008 00:36:11 -0500 Subject: [PATCH 11/15] Fix documentation example for floats --- core/math/floats/floats-docs.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/math/floats/floats-docs.factor b/core/math/floats/floats-docs.factor index a1ba16c68a..5549ef79e9 100644 --- a/core/math/floats/floats-docs.factor +++ b/core/math/floats/floats-docs.factor @@ -6,7 +6,7 @@ ARTICLE: "floats" "Floats" "Rational numbers represent " { $emphasis "exact" } " quantities. On the other hand, a floating point number is an " { $emphasis "approximation" } ". While rationals can grow to any required precision, floating point numbers are fixed-width, and manipulating them is usually faster than manipulating ratios or bignums (but slower than manipulating fixnums). Floating point numbers are often used to represent irrational numbers, which have no exact representation as a ratio of two integers." $nl "Introducing a floating point number in a computation forces the result to be expressed in floating point." -{ $example "5/4 1/2 + ." "7/4" } +{ $example "5/4 1/2 + ." "1+3/4" } { $example "5/4 0.5 + ." "1.75" } "Integers and rationals can be converted to floats:" { $subsection >float } From 1247ebbac9a74eed55c294848a82872e8001e4e0 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 4 Dec 2008 00:28:16 -0600 Subject: [PATCH 12/15] Fix typo --- core/kernel/kernel-docs.factor | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/kernel/kernel-docs.factor b/core/kernel/kernel-docs.factor index 91b18d834b..5ee12ddedc 100644 --- a/core/kernel/kernel-docs.factor +++ b/core/kernel/kernel-docs.factor @@ -758,12 +758,10 @@ $nl "Technically, the spread combinators are redundant because they can be simulated using shuffle words and other combinators, and in addition, they do not reduce token counts by much, if at all. However, they can make code more readable by expressing intention and exploiting any inherent symmetry. For example, a piece of code which performs three operations on three related values can be written in one of two ways:" { $code "! First alternative; uses dip" - "[ [ 1 + ] dip 1 - dip ] 2 *" + "[ [ 1 + ] dip 1 - ] dip 2 *" "! Second alternative: uses tri*" "[ 1 + ] [ 1 - ] [ 2 * ] tri*" } - -$nl "A generalization of the above combinators to any number of quotations can be found in " { $link "combinators" } "." { $subsection "spread-shuffle-equivalence" } ; From 1296e3c7920915c0b916b8115733bac019b08b2e Mon Sep 17 00:00:00 2001 From: Aaron Schaefer Date: Thu, 4 Dec 2008 01:35:53 -0500 Subject: [PATCH 13/15] Move math.blas back to extra due to multimethods usage --- {basis => extra}/math/blas/cblas/authors.txt | 0 {basis => extra}/math/blas/cblas/cblas.factor | 0 {basis => extra}/math/blas/cblas/summary.txt | 0 {basis => extra}/math/blas/cblas/tags.txt | 0 {basis => extra}/math/blas/matrices/authors.txt | 0 {basis => extra}/math/blas/matrices/matrices-docs.factor | 0 {basis => extra}/math/blas/matrices/matrices-tests.factor | 0 {basis => extra}/math/blas/matrices/matrices.factor | 0 {basis => extra}/math/blas/matrices/summary.txt | 0 {basis => extra}/math/blas/matrices/tags.txt | 0 {basis => extra}/math/blas/syntax/authors.txt | 0 {basis => extra}/math/blas/syntax/summary.txt | 0 {basis => extra}/math/blas/syntax/syntax-docs.factor | 0 {basis => extra}/math/blas/syntax/syntax.factor | 0 {basis => extra}/math/blas/syntax/tags.txt | 0 {basis => extra}/math/blas/vectors/authors.txt | 0 {basis => extra}/math/blas/vectors/summary.txt | 0 {basis => extra}/math/blas/vectors/tags.txt | 0 {basis => extra}/math/blas/vectors/vectors-docs.factor | 0 {basis => extra}/math/blas/vectors/vectors-tests.factor | 0 {basis => extra}/math/blas/vectors/vectors.factor | 0 21 files changed, 0 insertions(+), 0 deletions(-) rename {basis => extra}/math/blas/cblas/authors.txt (100%) rename {basis => extra}/math/blas/cblas/cblas.factor (100%) rename {basis => extra}/math/blas/cblas/summary.txt (100%) rename {basis => extra}/math/blas/cblas/tags.txt (100%) rename {basis => extra}/math/blas/matrices/authors.txt (100%) rename {basis => extra}/math/blas/matrices/matrices-docs.factor (100%) rename {basis => extra}/math/blas/matrices/matrices-tests.factor (100%) rename {basis => extra}/math/blas/matrices/matrices.factor (100%) rename {basis => extra}/math/blas/matrices/summary.txt (100%) rename {basis => extra}/math/blas/matrices/tags.txt (100%) rename {basis => extra}/math/blas/syntax/authors.txt (100%) rename {basis => extra}/math/blas/syntax/summary.txt (100%) rename {basis => extra}/math/blas/syntax/syntax-docs.factor (100%) rename {basis => extra}/math/blas/syntax/syntax.factor (100%) rename {basis => extra}/math/blas/syntax/tags.txt (100%) rename {basis => extra}/math/blas/vectors/authors.txt (100%) rename {basis => extra}/math/blas/vectors/summary.txt (100%) rename {basis => extra}/math/blas/vectors/tags.txt (100%) rename {basis => extra}/math/blas/vectors/vectors-docs.factor (100%) rename {basis => extra}/math/blas/vectors/vectors-tests.factor (100%) rename {basis => extra}/math/blas/vectors/vectors.factor (100%) diff --git a/basis/math/blas/cblas/authors.txt b/extra/math/blas/cblas/authors.txt similarity index 100% rename from basis/math/blas/cblas/authors.txt rename to extra/math/blas/cblas/authors.txt diff --git a/basis/math/blas/cblas/cblas.factor b/extra/math/blas/cblas/cblas.factor similarity index 100% rename from basis/math/blas/cblas/cblas.factor rename to extra/math/blas/cblas/cblas.factor diff --git a/basis/math/blas/cblas/summary.txt b/extra/math/blas/cblas/summary.txt similarity index 100% rename from basis/math/blas/cblas/summary.txt rename to extra/math/blas/cblas/summary.txt diff --git a/basis/math/blas/cblas/tags.txt b/extra/math/blas/cblas/tags.txt similarity index 100% rename from basis/math/blas/cblas/tags.txt rename to extra/math/blas/cblas/tags.txt diff --git a/basis/math/blas/matrices/authors.txt b/extra/math/blas/matrices/authors.txt similarity index 100% rename from basis/math/blas/matrices/authors.txt rename to extra/math/blas/matrices/authors.txt diff --git a/basis/math/blas/matrices/matrices-docs.factor b/extra/math/blas/matrices/matrices-docs.factor similarity index 100% rename from basis/math/blas/matrices/matrices-docs.factor rename to extra/math/blas/matrices/matrices-docs.factor diff --git a/basis/math/blas/matrices/matrices-tests.factor b/extra/math/blas/matrices/matrices-tests.factor similarity index 100% rename from basis/math/blas/matrices/matrices-tests.factor rename to extra/math/blas/matrices/matrices-tests.factor diff --git a/basis/math/blas/matrices/matrices.factor b/extra/math/blas/matrices/matrices.factor similarity index 100% rename from basis/math/blas/matrices/matrices.factor rename to extra/math/blas/matrices/matrices.factor diff --git a/basis/math/blas/matrices/summary.txt b/extra/math/blas/matrices/summary.txt similarity index 100% rename from basis/math/blas/matrices/summary.txt rename to extra/math/blas/matrices/summary.txt diff --git a/basis/math/blas/matrices/tags.txt b/extra/math/blas/matrices/tags.txt similarity index 100% rename from basis/math/blas/matrices/tags.txt rename to extra/math/blas/matrices/tags.txt diff --git a/basis/math/blas/syntax/authors.txt b/extra/math/blas/syntax/authors.txt similarity index 100% rename from basis/math/blas/syntax/authors.txt rename to extra/math/blas/syntax/authors.txt diff --git a/basis/math/blas/syntax/summary.txt b/extra/math/blas/syntax/summary.txt similarity index 100% rename from basis/math/blas/syntax/summary.txt rename to extra/math/blas/syntax/summary.txt diff --git a/basis/math/blas/syntax/syntax-docs.factor b/extra/math/blas/syntax/syntax-docs.factor similarity index 100% rename from basis/math/blas/syntax/syntax-docs.factor rename to extra/math/blas/syntax/syntax-docs.factor diff --git a/basis/math/blas/syntax/syntax.factor b/extra/math/blas/syntax/syntax.factor similarity index 100% rename from basis/math/blas/syntax/syntax.factor rename to extra/math/blas/syntax/syntax.factor diff --git a/basis/math/blas/syntax/tags.txt b/extra/math/blas/syntax/tags.txt similarity index 100% rename from basis/math/blas/syntax/tags.txt rename to extra/math/blas/syntax/tags.txt diff --git a/basis/math/blas/vectors/authors.txt b/extra/math/blas/vectors/authors.txt similarity index 100% rename from basis/math/blas/vectors/authors.txt rename to extra/math/blas/vectors/authors.txt diff --git a/basis/math/blas/vectors/summary.txt b/extra/math/blas/vectors/summary.txt similarity index 100% rename from basis/math/blas/vectors/summary.txt rename to extra/math/blas/vectors/summary.txt diff --git a/basis/math/blas/vectors/tags.txt b/extra/math/blas/vectors/tags.txt similarity index 100% rename from basis/math/blas/vectors/tags.txt rename to extra/math/blas/vectors/tags.txt diff --git a/basis/math/blas/vectors/vectors-docs.factor b/extra/math/blas/vectors/vectors-docs.factor similarity index 100% rename from basis/math/blas/vectors/vectors-docs.factor rename to extra/math/blas/vectors/vectors-docs.factor diff --git a/basis/math/blas/vectors/vectors-tests.factor b/extra/math/blas/vectors/vectors-tests.factor similarity index 100% rename from basis/math/blas/vectors/vectors-tests.factor rename to extra/math/blas/vectors/vectors-tests.factor diff --git a/basis/math/blas/vectors/vectors.factor b/extra/math/blas/vectors/vectors.factor similarity index 100% rename from basis/math/blas/vectors/vectors.factor rename to extra/math/blas/vectors/vectors.factor From ffecedf9dece8ee5b0df558a20e06b834ba727c4 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 4 Dec 2008 02:21:36 -0600 Subject: [PATCH 14/15] Fix db.postgresql load error --- basis/db/postgresql/postgresql.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/basis/db/postgresql/postgresql.factor b/basis/db/postgresql/postgresql.factor index 82d96c4af1..90a875b8ff 100644 --- a/basis/db/postgresql/postgresql.factor +++ b/basis/db/postgresql/postgresql.factor @@ -267,7 +267,7 @@ ERROR: no-compound-found string object ; M: postgresql-db compound ( string object -- string' ) over { { "default" [ first number>string " " glue ] } - { "varchar" [ first number>string paren append ] } + { "varchar" [ first number>string "(" ")" surround append ] } { "references" [ >reference-string ] } [ drop no-compound-found ] } case ; From d70c8eff1c3decbb5e03e55413353a91ab67b912 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 4 Dec 2008 02:26:34 -0600 Subject: [PATCH 15/15] Rewrite interpolate without using PEGs for mad lulz --- basis/interpolate/interpolate-tests.factor | 20 +++++++++- basis/interpolate/interpolate.factor | 43 ++++++++++++++++------ 2 files changed, 50 insertions(+), 13 deletions(-) diff --git a/basis/interpolate/interpolate-tests.factor b/basis/interpolate/interpolate-tests.factor index 005ae87746..c15debd9b5 100644 --- a/basis/interpolate/interpolate-tests.factor +++ b/basis/interpolate/interpolate-tests.factor @@ -1,4 +1,22 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: tools.test interpolate ; +USING: interpolate io.streams.string namespaces tools.test locals ; IN: interpolate.tests + +[ "Hello, Jane." ] [ + "Jane" "name" set + [ "Hello, ${name}." interpolate ] with-string-writer +] unit-test + +[ "Sup Dawg, we heard you liked rims, so we put rims on your rims so you can roll while you roll." ] [ + "Dawg" "name" set + "rims" "noun" set + "roll" "verb" set + [ "Sup ${name}, we heard you liked ${noun}, so we put ${noun} on your ${noun} so you can ${verb} while you ${verb}." interpolate ] with-string-writer +] unit-test + +[ "Oops, I accidentally the whole economy..." ] [ + [let | noun [ "economy" ] | + [ I[ Oops, I accidentally the whole ${noun}...]I ] with-string-writer + ] +] unit-test diff --git a/basis/interpolate/interpolate.factor b/basis/interpolate/interpolate.factor index 27f0756f1f..5e4805a8ac 100644 --- a/basis/interpolate/interpolate.factor +++ b/basis/interpolate/interpolate.factor @@ -1,21 +1,40 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: io kernel macros make multiline namespaces parser -peg.ebnf present sequences strings ; +present sequences strings splitting fry accessors ; IN: interpolate -MACRO: interpolate ( string -- ) -[EBNF -var = "${" [^}]+ "}" => [[ second >string [ get present write ] curry ]] -text = [^$]+ => [[ >string [ write ] curry ]] -interpolate = (var|text)* => [[ [ ] join ]] -EBNF] ; +TUPLE: interpolate-var name ; -EBNF: interpolate-locals -var = "${" [^}]+ "}" => [[ [ second >string search , [ present write ] % ] [ ] make ]] -text = [^$]+ => [[ [ >string , [ write ] % ] [ ] make ]] -interpolate = (var|text)* => [[ [ ] join ]] -;EBNF +: (parse-interpolate) ( string -- ) + [ + "${" split1-slice [ >string , ] [ + [ + "}" split1-slice + [ >string interpolate-var boa , ] + [ (parse-interpolate) ] bi* + ] when* + ] bi* + ] unless-empty ; + +: parse-interpolate ( string -- seq ) + [ (parse-interpolate) ] { } make ; + +MACRO: interpolate ( string -- ) + parse-interpolate [ + dup interpolate-var? + [ name>> '[ _ get present write ] ] + [ '[ _ write ] ] + if + ] map [ ] join ; + +: interpolate-locals ( string -- quot ) + parse-interpolate [ + dup interpolate-var? + [ name>> search '[ _ present write ] ] + [ '[ _ write ] ] + if + ] map [ ] join ; : I[ "]I" parse-multiline-string interpolate-locals parsed \ call parsed ; parsing