Problem:
西暦和暦変換

西暦で表された年月日を、元号を用いた和暦に変換し、その年月日を出力するプログラムを作成してください。入力は例に示すように 3 つの整数であり、順に西暦年、月、日です。これを、出力例に示すように変換してください。なお、明治以前の年月日が入力された場合は「pre-meiji」と表示してください。

各年号の最初の年は「元年」ではなく「１年」と出力することとします。

元号

期間

meiji

1868. 9. 8 〜 1912. 7.29

taisho

1912. 7.30 〜 1926.12.24

showa

1926.12.25 〜 1989. 1. 7

heisei

1989. 1. 8 〜

入力

複数のデータが与えられます。各データとして年、月、日を表す３つの整数が空白区切りで１行に与えられます。

入力の終わりまで処理してください。データの数は 50 を超えません。

出力

空白区切りの元号、年、月、日、または「pre-meiji」を１行に出力してください。

Sample Input

2005 9 3
1868 12 2
1868 9 7

Output for the Sample Input

heisei 17 9 3
meiji 1 12 2
pre-meiji

Solution in Ruby (judge verdict: Accepted)

def leap? y
    leap = false
    leap = true if y % 4 == 0
    leap = false if y % 100 == 0
    leap = true if y % 400 == 0
    leap
end

def countdays y, m, d
    arr = [[31,29,31,30,31,30,31,31,30,31,30,31], [31,28,31,30,31,30,31,31,30,31,30,31]]
    sum = 0
    1.upto(y - 1){|i| sum += (leap?(i)) ? 366 : 365}
    1.upto(m - 1){|i| sum += (leap?(y)) ? arr[0][i - 1] : arr[1][i - 1]}
    1.upto(d){sum += 1}
    sum
end

meiji_firstday = countdays(1868, 9, 8)
taisho_firstday = countdays(1912, 7, 30)
showa_firstday = countdays(1926, 12, 25)
heisei_firstday = countdays(1989, 1, 8)
gengos = {"meiji"=>1867, "taisho"=>1911, "showa"=>1925, "heisei"=>1988}

while line = gets
    y, m, d = line.chomp.split.map(&:to_i)
    days = countdays(y, m, d)
    result, gengo = nil, nil
    if days < meiji_firstday
        result = "pre-meiji"
    elsif days < taisho_firstday
        gengo = "meiji"
    elsif days < showa_firstday
        gengo = "taisho"
    elsif days < heisei_firstday
        gengo = "showa"
    else
        gengo = "heisei"
    end
    y -= gengos[gengo] if gengo
    result = "#{gengo} #{y} #{m} #{d}" if result.nil?
    puts result
end