! Copyright (c) 2008 Aaron Schaefer.
! See http://factorcode.org/license.txt for BSD license.
-USING: combinators.lib kernel math math.combinatorics math.parser math.primes
- project-euler.common sequences ;
+USING: kernel math math.combinatorics math.parser math.primes
+ project-euler.common sequences sets ;
IN: project-euler.035
! http://projecteuler.net/index.php?section=problems&id=35
: possible? ( seq -- ? )
dup length 1 > [
- dup { 0 2 4 5 6 8 } swap seq-diff =
+ dup { 0 2 4 5 6 8 } diff =
] [
drop t
] if ;
: rotate ( seq n -- seq )
- cut* swap append ;
+ cut* prepend ;
: (circular?) ( seq n -- ? )
dup 0 > [
- 2dup rotate 10 swap digits>integer
- prime? [ 1- (circular?) ] [ 2drop f ] if
+ 2dup rotate 10 digits>integer
+ prime? [ 1 - (circular?) ] [ 2drop f ] if
] [
2drop t
] if ;
: circular? ( seq -- ? )
- dup length 1- (circular?) ;
+ dup length 1 - (circular?) ;
PRIVATE>
: euler035 ( -- answer )
- source-035 [ possible? ] subset [ circular? ] count ;
+ source-035 [ possible? ] filter [ circular? ] count ;
! [ euler035 ] 100 ave-time
-! 904 ms run / 86 ms GC ave time - 100 trials
+! 538 ms ave run time - 17.16 SD (100 trials)
! TODO: try using bit arrays or other methods outlined here:
! http://home.comcast.net/~babdulbaki/Circular_Primes.html
-MAIN: euler035
+SOLUTION: euler035