Solution to Project Euler problem 35
parent
38bc7d7f75
commit
7b74afd043
|
@ -0,0 +1,61 @@
|
|||
! 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 ;
|
||||
IN: project-euler.035
|
||||
|
||||
! http://projecteuler.net/index.php?section=problems&id=35
|
||||
|
||||
! DESCRIPTION
|
||||
! -----------
|
||||
|
||||
! The number, 197, is called a circular prime because all rotations of the
|
||||
! digits: 197, 971, and 719, are themselves prime.
|
||||
|
||||
! There are thirteen such primes below 100:
|
||||
! 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.
|
||||
|
||||
! How many circular primes are there below one million?
|
||||
|
||||
|
||||
! SOLUTION
|
||||
! --------
|
||||
|
||||
<PRIVATE
|
||||
|
||||
: source-035 ( -- seq )
|
||||
1000000 primes-upto [ number>digits ] map ;
|
||||
|
||||
: possible? ( seq -- ? )
|
||||
dup length 1 > [
|
||||
dup { 0 2 4 5 6 8 } swap seq-diff =
|
||||
] [
|
||||
drop t
|
||||
] if ;
|
||||
|
||||
: rotate ( seq n -- seq )
|
||||
cut* swap append ;
|
||||
|
||||
: (circular?) ( seq n -- ? )
|
||||
dup 0 > [
|
||||
2dup rotate 10 swap digits>integer
|
||||
prime? [ 1- (circular?) ] [ 2drop f ] if
|
||||
] [
|
||||
2drop t
|
||||
] if ;
|
||||
|
||||
: circular? ( seq -- ? )
|
||||
dup length 1- (circular?) ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: euler035 ( -- answer )
|
||||
source-035 [ possible? ] subset [ circular? ] count ;
|
||||
|
||||
! [ euler035 ] 100 ave-time
|
||||
! 904 ms run / 86 ms GC ave time - 100 trials
|
||||
|
||||
! TODO: try using bit arrays or other methods outlined here:
|
||||
! http://home.comcast.net/~babdulbaki/Circular_Primes.html
|
||||
|
||||
MAIN: euler035
|
|
@ -1,4 +1,4 @@
|
|||
! Copyright (c) 2007, 2008 Aaron Schaefer.
|
||||
! Copyright (c) 2007, 2008 Aaron Schaefer, Samuel Tardieu.
|
||||
! 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
|
||||
|
@ -10,8 +10,8 @@ USING: definitions io io.files kernel math.parser sequences vocabs
|
|||
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.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 ;
|
||||
project-euler.033 project-euler.034 project-euler.035 project-euler.067
|
||||
project-euler.134 project-euler.169 project-euler.173 project-euler.175 ;
|
||||
IN: project-euler
|
||||
|
||||
<PRIVATE
|
||||
|
|
Loading…
Reference in New Issue