書きなおしてみた

数学ガール 上 (MFコミックス フラッパーシリーズ)

  • ○: 0314152759 → 3月14日15時27分59秒
  • ○: 0229152759 → 2月29日15時27分59秒(閏年と判断)
  • ×: 1314152759 → 13月はない。
  • ×: 0431152759 → 4月31日はない。
  • ×: 0314152760 → 60秒はない。
2009-03-14

テストケースのチェックもしないと。というわけで先の

書きなおしてみました。

import urllib

DAY_LIMIT = {
    1: 31,
    2: 29,
    3: 31,
    4: 30,
    5: 31,
    6: 30,
    7: 31,
    8: 31,
    9: 30,
    10: 31,
    11: 30,
    12: 31}

def is_mdhms(mdhms_str):
##    a = [int(x) for x in mdhms_str]
##    month = a[0] * 10 + a[1]
##    day = a[2] * 10 + a[3]
##    hour = a[4] * 10 + a[5]
##    minute = a[6] * 10 + a[7]
##    second = a[8] * 10 + a[9]
##    return (
##        month in range(1, 13) and
##        day in range(1, DAY_LIMIT[month] + 1) and
##        hour in range(1, 24) and
##        minute in range(1, 60) and
##        second in range(1, 60))
    month = int(mdhms_str[0:2])
    day = int(mdhms_str[2:4])
    hour = int(mdhms_str[4:6])
    minute = int(mdhms_str[6:8])
    second = int(mdhms_str[8:10])
    return (
        1 <= month <= 12 and
        1 <= day <= DAY_LIMIT[month] and
        1 <= hour <= 23 and
        1 <= minute <= 59 and
        1 <= second <= 59)

def mdhms_print(i, mdhms_str):
    month, day, hour, minute, second = [
        mdhms_str[x : x + 2] for x in range(0, len(mdhms_str), 2)]
    print u'%d桁目, %s月%s日%s時%s分%s秒' % (
       i + 1, month, day, hour, minute, second)
    print '"%s"' % mdhms_str


print u'テストケース:'
for s in (
    '0314152759', '0229152759',
    '1314152759', '0431152759', '0314152760'):
    mdhms_print(0, s)
    print is_mdhms(s)
    print
print u'本番:'
pi_url = 'ftp://pi.super-computing.org/pub/pi10m/pi10m.ascii.01of10'
f = urllib.urlopen(pi_url)
print u'π の値を読んでます: "%s"' % pi_url,
pi_str = ''.join(f.read().split())
f.close()
print '完了.'
for i in range(len(pi_str)):
    mdhms_str = pi_str[i : i + 10]
    if is_mdhms(mdhms_str):
        mdhms_print(i, mdhms_str)
        break  # この行を削れば次々と探し続ける

結果。

テストケース:
1桁目, 03月14日15時27分59秒
"0314152759"
True

1桁目, 02月29日15時27分59秒
"0229152759"
True

1桁目, 13月14日15時27分59秒
"1314152759"
False

1桁目, 04月31日15時27分59秒
"0431152759"
False

1桁目, 03月14日15時27分60秒
"0314152760"
False

本番:
π の値を読んでます: "ftp://pi.super-computing.org/pub/pi10m/pi10m.ascii.01of10" 完了.
287桁目, 07月26日02時49分14秒
"0726024914"

ちゃんと合ってる。うん。すっきり。
D