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 C# (judge verdict: Accepted)

using System;
using System.Text;

namespace AOJ.Volume0
{
    public class EraNameTransformation
    {
        private class Gengo
        {
            public DateTime StartDate { get; set; }
            public DateTime EndDate { get; set; }
            public string Name { get; set; }

            public Gengo(DateTime s, DateTime e, string n)
            {
                StartDate = s;
                EndDate = e;
                Name = n;
            }
        }

        public static int Main()
        {
            var list = new Gengo[4];
            list[0] = new Gengo(DateTime.Parse("1868/9/8"), DateTime.Parse("1912/7/29"), "meiji");
            list[1] = new Gengo(DateTime.Parse("1912/7/30"), DateTime.Parse("1926/12/24"), "taisho");
            list[2] = new Gengo(DateTime.Parse("1926/12/25"), DateTime.Parse("1989/1/7"), "showa");
            list[3] = new Gengo(DateTime.Parse("1989/1/8"), DateTime.MaxValue, "heisei");

            var output = new StringBuilder();
            while (true)
            {
                var input = Console.ReadLine();
                if (string.IsNullOrEmpty(input)) { break; }

                var data = input.Split(' ');
                int y = int.Parse(data[0]);
                int m = int.Parse(data[1]);
                int d = int.Parse(data[2]);
                var tmp = new DateTime(y, m, d);
                if(tmp < list[0].StartDate) { output.AppendLine("pre-meiji"); }
                else
                {
                    Gengo g = null;
                    if(tmp <= list[0].EndDate) { g = list[0]; }
                    else if(tmp <= list[1].EndDate) { g = list[1]; }
                    else if(tmp <= list[2].EndDate) { g = list[2]; }
                    else { g = list[3]; }
                    // ??´????????´
                    y = y - g.StartDate.Year + 1;

                    string era = g.Name + " " + y + " " + m + " " + d;
                    output.AppendLine(era);
                }
            }

            Console.Write(output);
            return 0;
        }
    }
}