和暦変換(どう書く?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