電子竹林:Blog2

Tech関係、はてなダイアリーから移転済み...

回文の日を求める (リスト内包表記)

概要

  • 回文の日を求めるのも、Pythonのリスト内包表記(List Comprehension)なら一行

    詳細

  • 2020/02/02 は、20200202 で逆からでも同じ回文の日
  • 回文の日を求めるのは簡単で、次の一行だけで求められる(月の日数とかは手を抜いて全部31日までにしてある)。とりあえず1500年から2500年までで計算する。
[s for s in  [str(y).rjust(4,'0')+str(m).rjust(2,'0')+str(d).rjust(2,'0') for y in range(1500,2501)  for m in range(1,13) for d in range(1,32)] if s==s[::-1]]
  • 三重ループで長すぎて分かりにくいリスト内包表記の悪用とも思えるが、まあワンライナー的な遊びである (もうちょっと簡単に書ける気もするが、filter使うと長くなりそうな…)
  • 構文的には難しくないと思うが、rjust(2,'0;)は文字列を0で右詰め、s[::-1]は文字列を逆にするので回文を判定している。
  • 結果は次の通りで1000年間で36日のみ。前半500年は無しで、後半500年のみにしかない。(51日、61日とか無いので当然か)
['20011002', '20100102', '20111102', '20200202', '20211202', '20300302', '20400402', '20500502', '20600602', '20700702', '20800802', '20900902', '21011012', '21100112', '21111112', '21200212', '21211212', '21300312', '21400412', '21500512', '21600612', '21700712', '21800812', '21900912', '22011022', '22100122', '22111122', '22200222', '22211222', '22300322', '22400422', '22500522', '22600622', '22700722', '22800822', '22900922']
  • 日を全部31日までと手を抜いているので、年の範囲によっては0320年02年30日とかありえない日も出てきてしまう。さらにうるう年も正確にやるとちょっとメンドくさい。
  • 三重のforで内包表記が分かりにくいので、for文だと以下の通り(これはリストにしないでprint)
for y in range(1500, 2501):
  for m in range(1, 13):
    for d in range(1, 32):
        s = str(y).rjust(4,'0')+str(m).rjust(2,'0')+str(d).rjust(2,'0') 
        if s == s[::-1]:
          print(s)

docs.python.org