#問題
年月日をYYYYMMDDの8けたの整数で表したとき、
これを2進数に変換して逆から並べ、
さらに10進数に戻したとき、
元の日付を同じ日付になるものを探してください。
期間は、前回の東京オリンピック(1964年10月10日)から、
次回の東京オリンピック(2020年7月24日予定)とします。
例)1966年7月13日の場合
- YYYYMMDDのフォーマット -> 19660713
- 2進数に変換 -> 100101011111111110101001
- 2進数を逆か並べる -> 1001010111111111110101001
- 逆から並べた2進数を10進数に戻す -> 19660713
・・・1966年7月13日(最初の数)に戻る
引用:「プログラマ脳を鍛える数学パズル 著者 増井 敏克」
#回答
answer.py
from datetime import datetime
from datetime import timedelta
from_date = datetime(1964, 10, 10)
to_date = datetime(2020, 7, 24)
def return_reversed_number(n):
binary_date = format(int(n.strftime("%Y%m%d")), "b")
reversed_number = int(binary_date[::-1], 2)
return reversed_number
def daterange(_from, _to):
for i in range((_to - _from).days):
yield _from + timedelta(i)
for j in daterange(from_date, to_date):
if int(j.strftime("%Y%m%d")) == return_reversed_number(j):
print(j)
else:
pass
#つまづいたところ
10進数、2進数の相互変換は過去に触れましたので、
今回は特につまづきはしませんでした。
何日から(from)何日まで(to)の期間を取得する方法は初め考えましたが、
ググってみると簡単に出てきたのでそのままコピペでいけました。
逆順も[::-1]
で簡単にいけました。
便利ですねー[::-1]
本書ではさらに検索する範囲を絞り、
処理速度を速めた方法も紹介しています。
しかし、それだと求める期間が変更になったときの拡張性が乏しいみたいです。
なので検索する範囲を絞らない方法の方でPythonに書き換えています。
つまづいたといえば、
前回の更新日から1ヶ月経ってしまったところでしょうか・・・