Solution to Project Euler problem 21

db4
Aaron Schaefer 2007-12-25 00:13:01 -05:00
parent 5b87577f91
commit f2cf2bc158
5 changed files with 62 additions and 15 deletions

View File

@ -1,6 +1,6 @@
! Copyright (c) 2007 Aaron Schaefer. ! Copyright (c) 2007 Aaron Schaefer.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel math.functions math.parser sequences ; USING: kernel math.functions math.parser project-euler.common sequences ;
IN: project-euler.016 IN: project-euler.016
! http://projecteuler.net/index.php?section=problems&id=16 ! http://projecteuler.net/index.php?section=problems&id=16
@ -17,7 +17,7 @@ IN: project-euler.016
! -------- ! --------
: euler016 ( -- answer ) : euler016 ( -- answer )
2 1000 ^ number>string string>digits sum ; 2 1000 ^ number>digits sum ;
! [ euler016 ] 100 ave-time ! [ euler016 ] 100 ave-time
! 0 ms run / 0 ms GC ave time - 100 trials ! 0 ms run / 0 ms GC ave time - 100 trials

View File

@ -1,6 +1,6 @@
! Copyright (c) 2007 Aaron Schaefer. ! Copyright (c) 2007 Aaron Schaefer.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel math.combinatorics math.parser sequences ; USING: kernel math.combinatorics math.parser project-euler.common sequences ;
IN: project-euler.020 IN: project-euler.020
! http://projecteuler.net/index.php?section=problems&id=20 ! http://projecteuler.net/index.php?section=problems&id=20
@ -17,7 +17,7 @@ IN: project-euler.020
! -------- ! --------
: euler020 ( -- answer ) : euler020 ( -- answer )
100 factorial number>string string>digits sum ; 100 factorial number>digits sum ;
! [ euler020 ] 100 ave-time ! [ euler020 ] 100 ave-time
! 0 ms run / 0 ms GC ave time - 100 trials ! 0 ms run / 0 ms GC ave time - 100 trials

View File

@ -0,0 +1,46 @@
! Copyright (c) 2007 Aaron Schaefer.
! See http://factorcode.org/license.txt for BSD license.
USING: combinators.lib kernel math math.functions math.ranges namespaces
project-euler.common sequences ;
IN: project-euler.021
! http://projecteuler.net/index.php?section=problems&id=21
! DESCRIPTION
! -----------
! Let d(n) be defined as the sum of proper divisors of n (numbers less than n
! which divide evenly into n).
! If d(a) = b and d(b) = a, where a != b, then a and b are an amicable pair and
! each of a and b are called amicable numbers.
! For example, the proper divisors of 220 are 1, 2, 4, 5, 10, 11, 20, 22, 44,
! 55 and 110; therefore d(220) = 284. The proper divisors of 284 are 1, 2, 4,
! 71 and 142; so d(284) = 220.
! Evaluate the sum of all the amicable numbers under 10000.
! SOLUTION
! --------
<PRIVATE
: d ( n -- sum )
dup sqrt >fixnum 2 swap [a,b] [
[ 2dup divisor? [ 2dup / + , ] [ drop ] if ] each drop
] { } make sum 1+ ;
: amicable-pair? ( n m -- ? )
{ [ 2dup = not ] [ 2dup d = ] } && 2nip ;
PRIVATE>
: euler021 ( -- answer )
10000 [1,b] [ dup dup d amicable-pair? [ drop 0 ] unless ] sigma ;
! [ euler021 ] 100 ave-time
! 328 ms run / 10 ms GC ave time - 100 trials
MAIN: euler021

View File

@ -15,6 +15,9 @@ IN: project-euler.common
: shift-3rd ( seq obj obj -- seq obj obj ) : shift-3rd ( seq obj obj -- seq obj obj )
rot 1 tail -rot ; rot 1 tail -rot ;
: max-children ( seq -- seq )
[ dup length 1- [ over nth-pair max , ] each ] { } make nip ;
: >multiplicity ( seq -- seq ) : >multiplicity ( seq -- seq )
dup prune [ dup prune [
[ 2dup [ = ] curry count 2array , ] each [ 2dup [ = ] curry count 2array , ] each
@ -23,12 +26,6 @@ IN: project-euler.common
: reduce-2s ( n -- r s ) : reduce-2s ( n -- r s )
dup even? [ factor-2s >r 1+ r> ] [ 1 swap ] if ; dup even? [ factor-2s >r 1+ r> ] [ 1 swap ] if ;
: tau-limit ( n -- n )
sqrt floor >fixnum ;
: max-children ( seq -- seq )
[ dup length 1- [ over nth-pair max , ] each ] { } make nip ;
PRIVATE> PRIVATE>
: collect-consecutive ( seq width -- seq ) : collect-consecutive ( seq width -- seq )
@ -46,8 +43,11 @@ PRIVATE>
first first first first
] if ; ] if ;
: number>digits ( n -- seq )
number>string string>digits ;
: perfect-square? ( n -- ? ) : perfect-square? ( n -- ? )
dup sqrt mod zero? ; dup sqrt divisor? ;
: prime-factorization ( n -- seq ) : prime-factorization ( n -- seq )
[ [
@ -68,6 +68,7 @@ PRIVATE>
! Optimized brute-force, is often faster than prime factorization ! Optimized brute-force, is often faster than prime factorization
: tau* ( n -- n ) : tau* ( n -- n )
reduce-2s [ perfect-square? -1 0 ? ] keep dup tau-limit [1,b] [ reduce-2s [ perfect-square? -1 0 ? ] keep
dup sqrt >fixnum [1,b] [
dupd divisor? [ >r 2 + r> ] when dupd divisor? [ >r 2 + r> ] when
] each drop * ; ] each drop * ;

View File

@ -1,13 +1,13 @@
! Copyright (c) 2007 Aaron Schaefer. ! Copyright (c) 2007 Aaron Schaefer.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: io io.files kernel math.parser namespaces sequences strings USING: io io.files kernel math.parser namespaces sequences strings
vocabs vocabs.loader system project-euler.ave-time vocabs vocabs.loader system project-euler.ave-time project-euler.common
project-euler.001 project-euler.002 project-euler.003 project-euler.004 project-euler.001 project-euler.002 project-euler.003 project-euler.004
project-euler.005 project-euler.006 project-euler.007 project-euler.008 project-euler.005 project-euler.006 project-euler.007 project-euler.008
project-euler.009 project-euler.010 project-euler.011 project-euler.012 project-euler.009 project-euler.010 project-euler.011 project-euler.012
project-euler.013 project-euler.014 project-euler.015 project-euler.016 project-euler.013 project-euler.014 project-euler.015 project-euler.016
project-euler.017 project-euler.018 project-euler.019 project-euler.020 project-euler.017 project-euler.018 project-euler.019 project-euler.020
project-euler.067 ; project-euler.021 project-euler.067 ;
IN: project-euler IN: project-euler
<PRIVATE <PRIVATE
@ -17,7 +17,7 @@ IN: project-euler
print readln string>number ; print readln string>number ;
: number>euler ( n -- str ) : number>euler ( n -- str )
number>string string>digits 3 0 pad-left [ number>string ] map concat ; number>digits 3 0 pad-left [ number>string ] map concat ;
: solution-path ( n -- str ) : solution-path ( n -- str )
number>euler dup [ number>euler dup [