和暦変換(どう書く?orgに投稿)
昨年大晦日に出題されていた、西暦の入力から元号表示の和暦に変換する、というお題。
元号の切り替わりタイミングとなる閾値の配列を用意した上で、入力された日付をpushしてsortし、そのindexを調べることで元号を判定させている。(明治6年より前を「範囲外」にしているのは、太政官布告により太陽暦に切り替わったのが、明治6年元旦であるからです。)
で、大胆にも本家サイトに投稿。
require 'date' DAYS = [Date.parse('1873/1/1'), Date.parse('1912/7/30'), Date.parse('1926/12/25'), Date.parse('1989/1/8')] GENGO = ['明治', '大正', '昭和', '平成'] def format_date(d, i) raise if d < DAYS[0] d = d + 365 * 6 + 1 if i <= 1 #明治用のオフセット return "#{GENGO[i != 0 ? i - 1 : i]}#{d.year - DAYS[i - 1].year + 1}年#{d.month}月#{d.day}日" end begin d = Date.parse(ARGV[0]) days = DAYS.push(d).sort i = days.index(d) puts (days.uniq.size == 4 && i != 0 ? format_date(d, i) << ' ' << format_date(d, i + 1) : format_date(d, i)) rescue puts '範囲外' end