Solution to Project Euler problem 21
parent
5b87577f91
commit
f2cf2bc158
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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 * ;
|
||||||
|
|
|
@ -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 [
|
||||||
|
|
Loading…
Reference in New Issue