Solution to Project Euler problem 35

db4
Aaron Schaefer 2008-01-29 12:39:25 -05:00
parent 38bc7d7f75
commit 7b74afd043
2 changed files with 64 additions and 3 deletions

View File

@ -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

View File

@ -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