Solution to Project Euler problem 34
parent
840c401cb5
commit
38bc7d7f75
|
@ -0,0 +1,47 @@
|
|||
! Copyright (c) 2008 Aaron Schaefer.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: combinators.lib kernel math.ranges project-euler.common sequences ;
|
||||
IN: project-euler.034
|
||||
|
||||
! http://projecteuler.net/index.php?section=problems&id=34
|
||||
|
||||
! DESCRIPTION
|
||||
! -----------
|
||||
|
||||
! 145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145.
|
||||
|
||||
! Find the sum of all numbers which are equal to the sum of the factorial of
|
||||
! their digits.
|
||||
|
||||
! Note: as 1! = 1 and 2! = 2 are not sums they are not included.
|
||||
|
||||
|
||||
! SOLUTION
|
||||
! --------
|
||||
|
||||
! We can reduce the upper bound a little by calculating 7 * 9! = 2540160, and
|
||||
! then reducing one of the 9! to 2! (since the 7th digit cannot exceed 2), so we
|
||||
! get 2! + 6 * 9! = 2177282 as an upper bound.
|
||||
|
||||
! We can then take that one more step, and notice that the largest factorial
|
||||
! sum a 7 digit number starting with 21 or 20 is 2! + 1! + 5 * 9! or 1814403.
|
||||
! So there can't be any 7 digit solutions starting with 21 or 20, and therefore
|
||||
! our numbers must be less that 2000000.
|
||||
|
||||
<PRIVATE
|
||||
|
||||
: digit-factorial ( n -- n! )
|
||||
{ 1 1 2 6 24 120 720 5040 40320 362880 } nth ;
|
||||
|
||||
: factorion? ( n -- ? )
|
||||
dup number>digits [ digit-factorial ] sigma = ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: euler034 ( -- answer )
|
||||
3 2000000 [a,b] [ factorion? ] subset sum ;
|
||||
|
||||
! [ euler034 ] 10 ave-time
|
||||
! 15089 ms run / 725 ms GC ave time - 10 trials
|
||||
|
||||
MAIN: euler034
|
|
@ -7,11 +7,11 @@ IN: project-euler.common
|
|||
|
||||
! Problems using each public word
|
||||
! -------------------------------
|
||||
! cartesian-product - #4, #27
|
||||
! cartesian-product - #4, #27, #29, #32, #33
|
||||
! collect-consecutive - #8, #11
|
||||
! log10 - #25, #134
|
||||
! max-path - #18, #67
|
||||
! number>digits - #16, #20, #30
|
||||
! number>digits - #16, #20, #30, #34
|
||||
! propagate-all - #18, #67
|
||||
! sum-proper-divisors - #21
|
||||
! tau* - #12
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
! Copyright (c) 2007 Aaron Schaefer.
|
||||
! Copyright (c) 2007, 2008 Aaron Schaefer.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: definitions io io.files kernel math.parser sequences vocabs
|
||||
vocabs.loader project-euler.ave-time project-euler.common math
|
||||
|
@ -9,7 +9,8 @@ USING: definitions io io.files kernel math.parser sequences vocabs
|
|||
project-euler.017 project-euler.018 project-euler.019 project-euler.020
|
||||
project-euler.021 project-euler.022 project-euler.023 project-euler.024
|
||||
project-euler.025 project-euler.026 project-euler.027 project-euler.028
|
||||
project-euler.029 project-euler.030 project-euler.067 project-euler.134
|
||||
project-euler.029 project-euler.030 project-euler.031 project-euler.032
|
||||
project-euler.033 project-euler.034 project-euler.067 project-euler.134
|
||||
project-euler.169 project-euler.173 project-euler.175 ;
|
||||
IN: project-euler
|
||||
|
||||
|
|
Loading…
Reference in New Issue