内包表記はリスト操作時にだいぶお世話になっております。
関数引数は使おうと思うときは大体複雑なことをしようとしてる気がする。あんまりいいイメージが無い。
自分の実力だと策士策に溺れるを体現してしまいそう。
lambdaは少しだけ使ったことはあるけれど、良い奴なのかよく分かりません。
# Circular primes
# Problem 35
# 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?
#エラトステネスの篩
def get_prime_list(max_number):
is_prime=[True] * (max_number+1)
is_prime[0] = False
is_prime[1] = False
prime_list = []
for i in range(2,max_number+1):
if is_prime[i]:
prime_list.append(i)
for n in range(i*2,max_number+1,i):
is_prime[n] = False
return prime_list
def is_circular_prime(n,is_prime):
string_=str(n)
length_=len(string_)
for i in range(length_):
str2=string_[i:]+string_[:i]
if not(is_prime(int(str2))):
return False
return True
def has_024568(n):
str_=str(n)
list_="024568"
return any(s in list_ for s in str_)
max_n = 1_000_000
prime_list=get_prime_list(max_n)
#0,2,4,5,6,8含む素数の順番をずらしていって一桁目がそれらになった場合には素数にならないので
#circular_primeを探すためのprime_listから除外しておく
prime_list=[n for n in prime_list if not(has_024568(n))]
prime_list = [2,5] + prime_list
is_prime = lambda n : n in prime_list
count_=0
for n in prime_list:
if is_circular_prime(n,is_prime):
count_+=1
print(count_)