Fix conflict
commit
ba467a39c4
|
@ -33,9 +33,6 @@ IN: project-euler.012
|
||||||
! SOLUTION
|
! SOLUTION
|
||||||
! --------
|
! --------
|
||||||
|
|
||||||
: nth-triangle ( n -- n )
|
|
||||||
dup 1+ * 2 / ;
|
|
||||||
|
|
||||||
: euler012 ( -- answer )
|
: euler012 ( -- answer )
|
||||||
8 [ dup nth-triangle tau* 500 < ] [ 1+ ] [ ] while nth-triangle ;
|
8 [ dup nth-triangle tau* 500 < ] [ 1+ ] [ ] while nth-triangle ;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +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: io.files kernel math math.parser namespaces sequences sorting splitting
|
USING: ascii io.files kernel math project-euler.common sequences sorting splitting ;
|
||||||
strings system vocabs ascii ;
|
|
||||||
IN: project-euler.022
|
IN: project-euler.022
|
||||||
|
|
||||||
! http://projecteuler.net/index.php?section=problems&id=22
|
! http://projecteuler.net/index.php?section=problems&id=22
|
||||||
|
@ -31,9 +30,6 @@ IN: project-euler.022
|
||||||
"extra/project-euler/022/names.txt" resource-path
|
"extra/project-euler/022/names.txt" resource-path
|
||||||
file-contents [ quotable? ] subset "," split ;
|
file-contents [ quotable? ] subset "," split ;
|
||||||
|
|
||||||
: alpha-value ( str -- n )
|
|
||||||
[ string>digits sum ] keep length 9 * - ;
|
|
||||||
|
|
||||||
: name-scores ( seq -- seq )
|
: name-scores ( seq -- seq )
|
||||||
dup length [ 1+ swap alpha-value * ] 2map ;
|
dup length [ 1+ swap alpha-value * ] 2map ;
|
||||||
|
|
||||||
|
@ -43,9 +39,6 @@ PRIVATE>
|
||||||
source-022 natural-sort name-scores sum ;
|
source-022 natural-sort name-scores sum ;
|
||||||
|
|
||||||
! [ euler022 ] 100 ave-time
|
! [ euler022 ] 100 ave-time
|
||||||
! 59 ms run / 1 ms GC ave time - 100 trials
|
! 123 ms run / 4 ms GC ave time - 100 trials
|
||||||
|
|
||||||
! source-022 [ natural-sort name-scores sum ] curry 100 ave-time
|
|
||||||
! 45 ms run / 1 ms GC ave time - 100 trials
|
|
||||||
|
|
||||||
MAIN: euler022
|
MAIN: euler022
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
! Copyright (c) 2008 Aaron Schaefer.
|
! Copyright (c) 2008 Aaron Schaefer.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: combinators.lib hashtables kernel math math.combinatorics math.parser
|
USING: combinators.lib hashtables kernel math math.combinatorics math.functions
|
||||||
math.ranges project-euler.common sequences ;
|
math.parser math.ranges project-euler.common sequences ;
|
||||||
IN: project-euler.032
|
IN: project-euler.032
|
||||||
|
|
||||||
! http://projecteuler.net/index.php?section=problems&id=32
|
! http://projecteuler.net/index.php?section=problems&id=32
|
||||||
|
@ -41,7 +41,7 @@ IN: project-euler.032
|
||||||
dup 1and4 swap 2and3 or ;
|
dup 1and4 swap 2and3 or ;
|
||||||
|
|
||||||
: products ( seq -- m )
|
: products ( seq -- m )
|
||||||
[ number>string 4 tail* string>number ] map ;
|
[ 10 4 ^ mod ] map ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ PRIVATE>
|
||||||
source-032 [ valid? ] subset products prune sum ;
|
source-032 [ valid? ] subset products prune sum ;
|
||||||
|
|
||||||
! [ euler032 ] 10 ave-time
|
! [ euler032 ] 10 ave-time
|
||||||
! 27609 ms run / 2484 ms GC ave time - 10 trials
|
! 23922 ms run / 1505 ms GC ave time - 10 trials
|
||||||
|
|
||||||
|
|
||||||
! ALTERNATE SOLUTIONS
|
! ALTERNATE SOLUTIONS
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
! Copyright (c) 2008 Aaron Schaefer.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: kernel math.combinatorics math.parser math.primes sequences ;
|
||||||
|
IN: project-euler.041
|
||||||
|
|
||||||
|
! http://projecteuler.net/index.php?section=problems&id=41
|
||||||
|
|
||||||
|
! DESCRIPTION
|
||||||
|
! -----------
|
||||||
|
|
||||||
|
! We shall say that an n-digit number is pandigital if it makes use of all the
|
||||||
|
! digits 1 to n exactly once. For example, 2143 is a 4-digit pandigital and is
|
||||||
|
! also prime.
|
||||||
|
|
||||||
|
! What is the largest n-digit pandigital prime that exists?
|
||||||
|
|
||||||
|
|
||||||
|
! SOLUTION
|
||||||
|
! --------
|
||||||
|
|
||||||
|
! Check 7-digit pandigitals because if the sum of the digits in any number add
|
||||||
|
! up to a multiple of three, then it is a multiple of three and can't be prime.
|
||||||
|
! I assumed there would be a 7-digit answer, but technically a higher 4-digit
|
||||||
|
! pandigital than the one given in the description was also possible.
|
||||||
|
|
||||||
|
! 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
|
||||||
|
! 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36
|
||||||
|
! 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28 *** not divisible by 3 ***
|
||||||
|
! 1 + 2 + 3 + 4 + 5 + 6 = 21
|
||||||
|
! 1 + 2 + 3 + 4 + 5 = 15
|
||||||
|
! 1 + 2 + 3 + 4 = 10 *** not divisible by 3 ***
|
||||||
|
|
||||||
|
: euler041 ( -- answer )
|
||||||
|
{ 7 6 5 4 3 2 1 } all-permutations
|
||||||
|
[ 10 swap digits>integer ] map [ prime? ] find nip ;
|
||||||
|
|
||||||
|
! [ euler041 ] 100 ave-time
|
||||||
|
! 107 ms run / 7 ms GC ave time - 100 trials
|
||||||
|
|
||||||
|
MAIN: euler041
|
|
@ -0,0 +1,74 @@
|
||||||
|
! Copyright (c) 2008 Aaron Schaefer.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: ascii combinators.lib io.files kernel math math.functions namespaces
|
||||||
|
project-euler.common sequences splitting ;
|
||||||
|
IN: project-euler.042
|
||||||
|
|
||||||
|
! http://projecteuler.net/index.php?section=problems&id=42
|
||||||
|
|
||||||
|
! DESCRIPTION
|
||||||
|
! -----------
|
||||||
|
|
||||||
|
! The nth term of the sequence of triangle numbers is given by,
|
||||||
|
! tn = n * (n + 1) / 2; so the first ten triangle numbers are:
|
||||||
|
|
||||||
|
! 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
|
||||||
|
|
||||||
|
! By converting each letter in a word to a number corresponding to its
|
||||||
|
! alphabetical position and adding these values we form a word value. For
|
||||||
|
! example, the word value for SKY is 19 + 11 + 25 = 55 = t10. If the word value
|
||||||
|
! is a triangle number then we shall call the word a triangle word.
|
||||||
|
|
||||||
|
! Using words.txt (right click and 'Save Link/Target As...'), a 16K text file
|
||||||
|
! containing nearly two-thousand common English words, how many are triangle
|
||||||
|
! words?
|
||||||
|
|
||||||
|
|
||||||
|
! SOLUTION
|
||||||
|
! --------
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: source-042 ( -- seq )
|
||||||
|
"extra/project-euler/042/words.txt" resource-path
|
||||||
|
file-contents [ quotable? ] subset "," split ;
|
||||||
|
|
||||||
|
: (triangle-upto) ( limit n -- )
|
||||||
|
2dup nth-triangle > [
|
||||||
|
dup nth-triangle , 1+ (triangle-upto)
|
||||||
|
] [
|
||||||
|
2drop
|
||||||
|
] if ;
|
||||||
|
|
||||||
|
: triangle-upto ( n -- seq )
|
||||||
|
[ 1 (triangle-upto) ] { } make ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: euler042 ( -- answer )
|
||||||
|
source-042 [ alpha-value ] map dup supremum
|
||||||
|
triangle-upto [ member? ] curry count ;
|
||||||
|
|
||||||
|
! [ euler042 ] 100 ave-time
|
||||||
|
! 27 ms run / 1 ms GC ave time - 100 trials
|
||||||
|
|
||||||
|
|
||||||
|
! ALTERNATE SOLUTIONS
|
||||||
|
! -------------------
|
||||||
|
|
||||||
|
! Use the inverse function of n * (n + 1) / 2 and test if the result is an integer
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: triangle? ( n -- ? )
|
||||||
|
8 * 1+ sqrt 1- 2 / 1 mod zero? ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: euler042a ( -- answer )
|
||||||
|
source-042 [ alpha-value ] map [ triangle? ] count ;
|
||||||
|
|
||||||
|
! [ euler042a ] 100 ave-time
|
||||||
|
! 25 ms run / 1 ms GC ave time - 100 trials
|
||||||
|
|
||||||
|
MAIN: euler042a
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,97 @@
|
||||||
|
! Copyright (c) 2008 Aaron Schaefer.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: combinators.lib hashtables kernel math math.combinatorics math.parser
|
||||||
|
math.ranges project-euler.common sequences sorting ;
|
||||||
|
IN: project-euler.043
|
||||||
|
|
||||||
|
! http://projecteuler.net/index.php?section=problems&id=43
|
||||||
|
|
||||||
|
! DESCRIPTION
|
||||||
|
! -----------
|
||||||
|
|
||||||
|
! The number, 1406357289, is a 0 to 9 pandigital number because it is made up
|
||||||
|
! of each of the digits 0 to 9 in some order, but it also has a rather
|
||||||
|
! interesting sub-string divisibility property.
|
||||||
|
|
||||||
|
! Let d1 be the 1st digit, d2 be the 2nd digit, and so on. In this way, we note
|
||||||
|
! the following:
|
||||||
|
|
||||||
|
! * d2d3d4 = 406 is divisible by 2
|
||||||
|
! * d3d4d5 = 063 is divisible by 3
|
||||||
|
! * d4d5d6 = 635 is divisible by 5
|
||||||
|
! * d5d6d7 = 357 is divisible by 7
|
||||||
|
! * d6d7d8 = 572 is divisible by 11
|
||||||
|
! * d7d8d9 = 728 is divisible by 13
|
||||||
|
! * d8d9d10 = 289 is divisible by 17
|
||||||
|
|
||||||
|
! Find the sum of all 0 to 9 pandigital numbers with this property.
|
||||||
|
|
||||||
|
|
||||||
|
! SOLUTION
|
||||||
|
! --------
|
||||||
|
|
||||||
|
! Brute force generating all the pandigitals then checking 3-digit divisiblity
|
||||||
|
! properties...this is very slow!
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: subseq-divisible? ( n index seq -- ? )
|
||||||
|
[ 1- dup 3 + ] dip subseq 10 swap digits>integer swap mod zero? ;
|
||||||
|
|
||||||
|
: 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? ]
|
||||||
|
} && nip ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: euler043 ( -- answer )
|
||||||
|
1234567890 number>digits all-permutations
|
||||||
|
[ interesting? ] subset [ 10 swap digits>integer ] map sum ;
|
||||||
|
|
||||||
|
! [ euler043 ] time
|
||||||
|
! 125196 ms run / 19548 ms GC time
|
||||||
|
|
||||||
|
|
||||||
|
! ALTERNATE SOLUTIONS
|
||||||
|
! -------------------
|
||||||
|
|
||||||
|
! Build the number from right to left, generating the next 3-digits according
|
||||||
|
! to the divisiblity rules and combining them with the previous digits if they
|
||||||
|
! overlap and still have all unique digits. When done with that, add whatever
|
||||||
|
! missing digit is needed to make the number pandigital.
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: candidates ( n -- seq )
|
||||||
|
1000 over <range> [ number>digits 3 0 pad-left ] map [ all-unique? ] subset ;
|
||||||
|
|
||||||
|
: overlap? ( seq -- ? )
|
||||||
|
dup first 2 tail* swap second 2 head = ;
|
||||||
|
|
||||||
|
: clean ( seq -- seq )
|
||||||
|
[ unclip 1 head add* concat ] map [ all-unique? ] subset ;
|
||||||
|
|
||||||
|
: add-missing-digit ( seq -- seq )
|
||||||
|
dup natural-sort 10 seq-diff first add* ;
|
||||||
|
|
||||||
|
: interesting-pandigitals ( -- seq )
|
||||||
|
17 candidates { 13 11 7 5 3 2 } [
|
||||||
|
candidates swap cartesian-product [ overlap? ] subset clean
|
||||||
|
] each [ add-missing-digit ] map ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: euler043a ( -- answer )
|
||||||
|
interesting-pandigitals [ 10 swap digits>integer ] sigma ;
|
||||||
|
|
||||||
|
! [ euler043a ] 100 ave-time
|
||||||
|
! 19 ms run / 1 ms GC ave time - 100 trials
|
||||||
|
|
||||||
|
MAIN: euler043a
|
|
@ -0,0 +1,50 @@
|
||||||
|
! Copyright (c) 2008 Aaron Schaefer.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: kernel math math.functions math.ranges project-euler.common sequences ;
|
||||||
|
IN: project-euler.044
|
||||||
|
|
||||||
|
! http://projecteuler.net/index.php?section=problems&id=44
|
||||||
|
|
||||||
|
! DESCRIPTION
|
||||||
|
! -----------
|
||||||
|
|
||||||
|
! Pentagonal numbers are generated by the formula, Pn=n(3n−1)/2. The first ten
|
||||||
|
! pentagonal numbers are:
|
||||||
|
|
||||||
|
! 1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ...
|
||||||
|
|
||||||
|
! It can be seen that P4 + P7 = 22 + 70 = 92 = P8. However, their difference,
|
||||||
|
! 70 − 22 = 48, is not pentagonal.
|
||||||
|
|
||||||
|
! Find the pair of pentagonal numbers, Pj and Pk, for which their sum and
|
||||||
|
! difference is pentagonal and D = |Pk − Pj| is minimised; what is the value of D?
|
||||||
|
|
||||||
|
|
||||||
|
! SOLUTION
|
||||||
|
! --------
|
||||||
|
|
||||||
|
! Brute force using a cartesian product and an arbitrarily chosen limit.
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: nth-pentagonal ( n -- seq )
|
||||||
|
dup 3 * 1- * 2 / ;
|
||||||
|
|
||||||
|
: pentagonal? ( n -- ? )
|
||||||
|
dup 0 > [ 24 * 1+ sqrt 1+ 6 / 1 mod zero? ] [ drop f ] if ;
|
||||||
|
|
||||||
|
: sum-and-diff? ( m n -- ? )
|
||||||
|
2dup + -rot - [ pentagonal? ] 2apply and ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: euler044 ( -- answer )
|
||||||
|
2500 [1,b] [ nth-pentagonal ] map dup cartesian-product
|
||||||
|
[ first2 sum-and-diff? ] subset [ first2 - abs ] map infimum ;
|
||||||
|
|
||||||
|
! [ euler044 ] 10 ave-time
|
||||||
|
! 8924 ms run / 2872 ms GC ave time - 10 trials
|
||||||
|
|
||||||
|
! TODO: this solution is ugly and not very efficient...find a better algorithm
|
||||||
|
|
||||||
|
MAIN: euler044
|
|
@ -0,0 +1,25 @@
|
||||||
|
! Copyright (c) 2008 Aaron Schaefer.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: combinators.lib kernel math math.functions ;
|
||||||
|
IN: project-euler.048
|
||||||
|
|
||||||
|
! http://projecteuler.net/index.php?section=problems&id=48
|
||||||
|
|
||||||
|
! DESCRIPTION
|
||||||
|
! -----------
|
||||||
|
|
||||||
|
! The series, 1^1 + 2^2 + 3^3 + ... + 10^10 = 10405071317.
|
||||||
|
|
||||||
|
! Find the last ten digits of the series, 1^1 + 2^2 + 3^3 + ... + 1000^1000.
|
||||||
|
|
||||||
|
|
||||||
|
! SOLUTION
|
||||||
|
! --------
|
||||||
|
|
||||||
|
: euler048 ( -- answer )
|
||||||
|
1000 [ 1+ dup ^ ] sigma 10 10 ^ mod ;
|
||||||
|
|
||||||
|
! [ euler048 ] 100 ave-time
|
||||||
|
! 276 ms run / 1 ms GC ave time - 100 trials
|
||||||
|
|
||||||
|
MAIN: euler048
|
|
@ -0,0 +1,50 @@
|
||||||
|
! Copyright (c) 2008 Aaron Schaefer.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: combinators.lib kernel math project-euler.common sequences sorting ;
|
||||||
|
IN: project-euler.052
|
||||||
|
|
||||||
|
! http://projecteuler.net/index.php?section=problems&id=52
|
||||||
|
|
||||||
|
! DESCRIPTION
|
||||||
|
! -----------
|
||||||
|
|
||||||
|
! It can be seen that the number, 125874, and its double, 251748, contain
|
||||||
|
! exactly the same digits, but in a different order.
|
||||||
|
|
||||||
|
! Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x,
|
||||||
|
! contain the same digits.
|
||||||
|
|
||||||
|
|
||||||
|
! SOLUTION
|
||||||
|
! --------
|
||||||
|
|
||||||
|
! Analysis shows the number must be odd, divisible by 3, and larger than 123456
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: map-nx ( n x -- seq )
|
||||||
|
[ 1+ * ] with map ; inline
|
||||||
|
|
||||||
|
: all-same-digits? ( seq -- ? )
|
||||||
|
[ number>digits natural-sort ] map all-equal? ;
|
||||||
|
|
||||||
|
: candidate? ( n -- ? )
|
||||||
|
{ [ dup odd? ] [ dup 3 mod zero? ] } && nip ;
|
||||||
|
|
||||||
|
: next-all-same ( x n -- n )
|
||||||
|
dup candidate? [
|
||||||
|
2dup swap map-nx all-same-digits?
|
||||||
|
[ nip ] [ 1+ next-all-same ] if
|
||||||
|
] [
|
||||||
|
1+ next-all-same
|
||||||
|
] if ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: euler052 ( -- answer )
|
||||||
|
6 123456 next-all-same ;
|
||||||
|
|
||||||
|
! [ euler052 ] 100 ave-time
|
||||||
|
! 403 ms run / 7 ms GC ave time - 100 trials
|
||||||
|
|
||||||
|
MAIN: euler052
|
|
@ -58,7 +58,4 @@ PRIVATE>
|
||||||
! [ euler067a ] 100 ave-time
|
! [ euler067a ] 100 ave-time
|
||||||
! 14 ms run / 0 ms GC ave time - 100 trials
|
! 14 ms run / 0 ms GC ave time - 100 trials
|
||||||
|
|
||||||
! source-067 [ max-path ] curry 100 ave-time
|
|
||||||
! 3 ms run / 0 ms GC ave time - 100 trials
|
|
||||||
|
|
||||||
MAIN: euler067a
|
MAIN: euler067a
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
! Copyright (c) 2008 Aaron Schaefer.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: assocs hashtables io.files kernel math math.parser namespaces sequences ;
|
||||||
|
IN: project-euler.079
|
||||||
|
|
||||||
|
! http://projecteuler.net/index.php?section=problems&id=79
|
||||||
|
|
||||||
|
! DESCRIPTION
|
||||||
|
! -----------
|
||||||
|
|
||||||
|
! A common security method used for online banking is to ask the user for three
|
||||||
|
! random characters from a passcode. For example, if the passcode was 531278,
|
||||||
|
! they may asked for the 2nd, 3rd, and 5th characters; the expected reply would
|
||||||
|
! be: 317.
|
||||||
|
|
||||||
|
! The text file, keylog.txt, contains fifty successful login attempts.
|
||||||
|
|
||||||
|
! Given that the three characters are always asked for in order, analyse the
|
||||||
|
! file so as to determine the shortest possible secret passcode of unknown
|
||||||
|
! length.
|
||||||
|
|
||||||
|
|
||||||
|
! SOLUTION
|
||||||
|
! --------
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: source-079 ( -- seq )
|
||||||
|
"extra/project-euler/079/keylog.txt" resource-path file-lines ;
|
||||||
|
|
||||||
|
: >edges ( seq -- seq )
|
||||||
|
[
|
||||||
|
[ string>digits [ 2 head , ] keep 2 tail* , ] each
|
||||||
|
] { } make ;
|
||||||
|
|
||||||
|
: find-source ( seq -- elt )
|
||||||
|
dup values swap keys [ prune ] 2apply seq-diff
|
||||||
|
dup empty? [ "Topological sort failed" throw ] [ first ] if ;
|
||||||
|
|
||||||
|
: remove-source ( seq elt -- seq )
|
||||||
|
[ swap member? not ] curry subset ;
|
||||||
|
|
||||||
|
: (topological-sort) ( seq -- )
|
||||||
|
dup length 1 > [
|
||||||
|
dup find-source dup , remove-source (topological-sort)
|
||||||
|
] [
|
||||||
|
dup empty? [ drop ] [ first [ , ] each ] if
|
||||||
|
] if ;
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: topological-sort ( seq -- seq )
|
||||||
|
[ [ (topological-sort) ] { } make ] keep
|
||||||
|
concat prune dupd seq-diff append ;
|
||||||
|
|
||||||
|
: euler079 ( -- answer )
|
||||||
|
source-079 >edges topological-sort 10 swap digits>integer ;
|
||||||
|
|
||||||
|
! [ euler079 ] 100 ave-time
|
||||||
|
! 2 ms run / 0 ms GC ave time - 100 trials
|
||||||
|
|
||||||
|
! TODO: prune and seq-diff are relatively slow; topological sort could be
|
||||||
|
! cleaned up and generalized much better, but it works for this problem
|
||||||
|
|
||||||
|
MAIN: euler079
|
|
@ -0,0 +1,50 @@
|
||||||
|
319
|
||||||
|
680
|
||||||
|
180
|
||||||
|
690
|
||||||
|
129
|
||||||
|
620
|
||||||
|
762
|
||||||
|
689
|
||||||
|
762
|
||||||
|
318
|
||||||
|
368
|
||||||
|
710
|
||||||
|
720
|
||||||
|
710
|
||||||
|
629
|
||||||
|
168
|
||||||
|
160
|
||||||
|
689
|
||||||
|
716
|
||||||
|
731
|
||||||
|
736
|
||||||
|
729
|
||||||
|
316
|
||||||
|
729
|
||||||
|
729
|
||||||
|
710
|
||||||
|
769
|
||||||
|
290
|
||||||
|
719
|
||||||
|
680
|
||||||
|
318
|
||||||
|
389
|
||||||
|
162
|
||||||
|
289
|
||||||
|
162
|
||||||
|
718
|
||||||
|
729
|
||||||
|
319
|
||||||
|
790
|
||||||
|
680
|
||||||
|
890
|
||||||
|
362
|
||||||
|
319
|
||||||
|
760
|
||||||
|
316
|
||||||
|
729
|
||||||
|
380
|
||||||
|
319
|
||||||
|
728
|
||||||
|
716
|
|
@ -0,0 +1,31 @@
|
||||||
|
! Copyright (c) 2008 Aaron Schaefer.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: math math.functions ;
|
||||||
|
IN: project-euler.097
|
||||||
|
|
||||||
|
! http://projecteuler.net/index.php?section=problems&id=97
|
||||||
|
|
||||||
|
! DESCRIPTION
|
||||||
|
! -----------
|
||||||
|
|
||||||
|
! The first known prime found to exceed one million digits was discovered in
|
||||||
|
! 1999, and is a Mersenne prime of the form 2^6972593 − 1; it contains exactly
|
||||||
|
! 2,098,960 digits. Subsequently other Mersenne primes, of the form 2p − 1,
|
||||||
|
! have been found which contain more digits.
|
||||||
|
|
||||||
|
! However, in 2004 there was found a massive non-Mersenne prime which contains
|
||||||
|
! 2,357,207 digits: 28433 * 2^7830457 + 1.
|
||||||
|
|
||||||
|
! Find the last ten digits of this prime number.
|
||||||
|
|
||||||
|
|
||||||
|
! SOLUTION
|
||||||
|
! --------
|
||||||
|
|
||||||
|
: euler097 ( -- answer )
|
||||||
|
2 7830457 10 10 ^ ^mod 28433 * 10 10 ^ mod 1+ ;
|
||||||
|
|
||||||
|
! [ euler097 ] 100 ave-time
|
||||||
|
! 0 ms run / 0 ms GC ave time - 100 trials
|
||||||
|
|
||||||
|
MAIN: euler097
|
|
@ -1,6 +1,6 @@
|
||||||
USING: arrays combinators.lib kernel math math.functions math.miller-rabin
|
USING: arrays combinators.lib kernel math math.functions math.miller-rabin
|
||||||
math.matrices math.parser math.primes.factors math.ranges namespaces
|
math.matrices math.parser math.primes.factors math.ranges namespaces
|
||||||
sequences sorting ;
|
sequences sorting unicode.case ;
|
||||||
IN: project-euler.common
|
IN: project-euler.common
|
||||||
|
|
||||||
! A collection of words used by more than one Project Euler solution
|
! A collection of words used by more than one Project Euler solution
|
||||||
|
@ -8,10 +8,12 @@ IN: project-euler.common
|
||||||
|
|
||||||
! Problems using each public word
|
! Problems using each public word
|
||||||
! -------------------------------
|
! -------------------------------
|
||||||
|
! alpha-value - #22, #42
|
||||||
! cartesian-product - #4, #27, #29, #32, #33
|
! cartesian-product - #4, #27, #29, #32, #33
|
||||||
! collect-consecutive - #8, #11
|
! collect-consecutive - #8, #11
|
||||||
! log10 - #25, #134
|
! log10 - #25, #134
|
||||||
! max-path - #18, #67
|
! max-path - #18, #67
|
||||||
|
! nth-triangle - #12, #42
|
||||||
! number>digits - #16, #20, #30, #34
|
! number>digits - #16, #20, #30, #34
|
||||||
! pandigital? - #32, #38
|
! pandigital? - #32, #38
|
||||||
! propagate-all - #18, #67
|
! propagate-all - #18, #67
|
||||||
|
@ -52,6 +54,9 @@ IN: project-euler.common
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
: alpha-value ( str -- n )
|
||||||
|
>lower [ CHAR: a - 1+ ] sigma ;
|
||||||
|
|
||||||
: cartesian-product ( seq1 seq2 -- seq1xseq2 )
|
: cartesian-product ( seq1 seq2 -- seq1xseq2 )
|
||||||
swap [ swap [ 2array ] map-with ] map-with concat ;
|
swap [ swap [ 2array ] map-with ] map-with concat ;
|
||||||
|
|
||||||
|
@ -73,6 +78,9 @@ PRIVATE>
|
||||||
: number>digits ( n -- seq )
|
: number>digits ( n -- seq )
|
||||||
number>string string>digits ;
|
number>string string>digits ;
|
||||||
|
|
||||||
|
: nth-triangle ( n -- n )
|
||||||
|
dup 1+ * 2 / ;
|
||||||
|
|
||||||
: pandigital? ( n -- ? )
|
: pandigital? ( n -- ? )
|
||||||
number>string natural-sort "123456789" = ;
|
number>string natural-sort "123456789" = ;
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,9 @@ USING: definitions io io.files kernel math math.parser project-euler.ave-time
|
||||||
project-euler.029 project-euler.030 project-euler.031 project-euler.032
|
project-euler.029 project-euler.030 project-euler.031 project-euler.032
|
||||||
project-euler.033 project-euler.034 project-euler.035 project-euler.036
|
project-euler.033 project-euler.034 project-euler.035 project-euler.036
|
||||||
project-euler.037 project-euler.038 project-euler.039 project-euler.040
|
project-euler.037 project-euler.038 project-euler.039 project-euler.040
|
||||||
project-euler.067 project-euler.075 project-euler.134 project-euler.169
|
project-euler.041 project-euler.042 project-euler.043 project-euler.044
|
||||||
|
project-euler.048 project-euler.052 project-euler.067 project-euler.075
|
||||||
|
project-euler.079 project-euler.097 project-euler.134 project-euler.169
|
||||||
project-euler.173 project-euler.175 ;
|
project-euler.173 project-euler.175 ;
|
||||||
IN: project-euler
|
IN: project-euler
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue