問題概要
日付をyyyymmddの整数で表し、これを2進数に変換し、逆順に並べ、10進数に戻したとき、もとの日付と同じになるものを見つける。
Code
import datetime as dt
start = dt.datetime(1964, 10, 1)
end = dt.datetime(2020, 7, 24)
for days in range((end - start).days):
day = start + dt.timedelta(days)
daystr = day.strftime("%Y%m%d") #yymmdd
daybin = bin(int(daystr))
daybinr = str(daybin)[:1:-1] #2進数を表す頭の"0b"を除外して逆順にする
daystrr = str(int(daybinr, 2))
if daystr == daystrr:
print(daystr)
補足
2進法や文字列の逆順については、Q01を参照。
日付の演算
datetime.timedelta で 秒、分、時間、日、週の演算ができる。
このモジュールはなぜか月、年は対応していなくて、これにはdateutil.relativedeltaという別のモジュールを使う。
import datetime as dt
from dateutil.relativedelta import relativedelta
today = dt.datetime(2020, 4, 22, 14, 21, 50)
print(today + dt.timedelta(seconds = 5)) #2020-04-22 14:21:55
print(today - dt.timedelta(minutes = 30)) #2020-04-22 13:51:50
print(today + dt.timedelta(hours = 10)) #2020-04-23 00:21:50
print(today + dt.timedelta(days = 10)) #2020-05-02 14:21:50
print(today - dt.timedelta(weeks = 1)) #2020-04-15 14:21:50
print(today + relativedelta(months = 3)) #2020-07-22 14:21:50
print(today - relativedelta(years = 5)) #2015-04-22 14:21:50