Project Eulerが面白い

Project Eulerとは

Project Eulerとは「はてなキーワード」によると,

      数学の問題をプログラミング言語で解き、正解数を競うサイト。
      問題を解くためにはプログラミング能力と数学的素養が求められる。

簡単に言うとそこそこ難しいプログラミングの問題集です.

例えば No.35の問題は

f:id:kazy1991:20130726225053p:plain

上記のような感じで,全ての問題文は英語で書かれています.

ざっくり要約すると

       素数の中でも桁の位を循環させても素数であり続けるものを特別に循環素数呼びます.
       例えば197は719,917もすべて素数になるので循環素数の一つです.
       では,100万以下の範囲でいくつ循環素数があるか求めなさい.

のような内容です.

素数の判定くらいは誰もがやったことあると思いますが,循環素数の判定となるとそれなりに考える必要があります.個人的には頭の体操になるし,覚えたての言語を使うと配列の操作とかの確認に使えるので結構良い題材になります. 興味がある人は1,2問解いてみると面白いと思います.

僕も覚えたてのpython3で解いてみました.

from math import sqrt
from math import log10

def is_prime_number( num ):
    check_list = [2] + [ i for i in range( 3 , int( sqrt(num) ) + 1 , 2 ) ]
    for i in check_list:
        if( num % i == 0 ):
            return False
    return True

def is_circular_prime( num ):
    circle_numbers = get_circular_numbers( num )
    for prime_num in circle_numbers:
        if( not is_prime_number( prime_num ) ):
            return False
    return True

def get_rotate( num , digit_length ):
    result = int( num / 10 )
    result += num % 10 * (10 ** ( digit_length - 1 ) )
    return result

def get_circular_numbers( num ):
    circle_numbers = [num]
    digit_length = int( log10( num ) + 1 )
    for i in range( digit_length - 1 ):
        num = get_rotate( num  , digit_length ) 
        circle_numbers.append( num )
    return circle_numbers

def circular_prime( max_range ):
    odd_list = [ i for i in range( 3 , max_range , 2 ) ]
    prime_list = list( filter( is_prime_number , odd_list ) )
    circular_prime_list = list( filter( is_circular_prime , prime_list ) )
    return circular_prime_list

if __name__ == '__main__':
    print( 'there are {0} circular primes below one million'.format( len( circular_prime(100000) ) ) )


あと今度advent calendar形式でProject Eulerを解こうみたいな事やるのでぜひよかったら参加してください