数学の日にちなんで、円周率クイズ

http://d.hatena.ne.jp/hyuki/20090314#pi

これのいちおう解答。まだあまり慣れていないが、さらっとPythonで書いてみた。円周率の計算は、マチンの公式で。誤差評価とか全然していない。10000桁まで求めて、そっから1桁ごとずらして検査した。



def pi(n):
# Machin's formula
result = arctan(16, 5, n) - arctan(4, 239, n)
str_pi = str(result)

for i in range(1, n - 8):
yield [ i, str_pi[i:i+10] ]

# k*atan(1/m):to n figures
def arctan(k, m, n):
result = 0
a = k
for i in range(n):
a *= 10
a /= m
b = a
i = 0;
while b != 0:
result += b
i += 1
a /= -m * m
b = a / (i * 2 + 1)
return result

def is_date_time(s):
limit = [ 12, 31, 24, 60, 60 ]
num_days = [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
a = [ int(s[i:i+2]) for i in range(0, 10, 2) ]
if [ a[i] <= limit[i] for i in range(5) ] == [ True ] * 5:
return a[1] <= num_days[a[0]-1]

for s in pi(10000):
if is_date_time(s[1]):
print s


[287, '0726024914']
[340, '0917153643']
[596, '0513200056']
[657, '0901224953']
[852, '1010003137']
[1598, '0008164706']
[1606, '0600161452']
[1608, '0016145249']
[2126, '0919065925']
[2497, '1125150760']
[3018, '0225231603']
[3155, '0213243408']
[3260, '0628043903']
[3640, '0709154814']
[3822, '1120191302']
[3844, '1101100449']
[3846, '0110044929']
[4251, '1127000407']
[4367, '0025012622']
[4775, '0403172118']
[4777, '0317211860']
[4789, '0419000422']
[5358, '0921201905']
[5715, '0425121925']
[6142, '0825202618']
[7266, '0616013635']
[7510, '1207151249']
[7512, '0715124914']
[7784, '0929160302']
[7962, '0922224533']
[8196, '1029161615']
[8219, '0423174733']
[8280, '1008031559']
[8282, '0803155902']
[8731, '1221033346']
[8764, '0114195212']
[9545, '0714122339']
[9887, '1209140938']
[9984, '0010165525']