namespace MyCalendar
{
using System;
using System.Linq;
using System.Collections.Generic;
internal sealed class Calendar
{
private static readonly List<String> Wdays = new List<string>() { "日", "月", "火", "水", "木", "金", "土" };
private static readonly Int32 Nwdays = Wdays.Count;
private readonly Int32 year;
private readonly Int32 month;
internal Calendar(Int32 year, Int32 month)
{
this.year = year;
this.month = month;
}
private Int32 GetDaysInMonth()
{
switch (this.month)
{
case 2:
if (this.year % (this.year % 25 != 0 ? 4 : 16) < 1)
{
return 29;
}
else
{
return 28;
}
case 4:
case 6:
case 9:
case 11:
return 30;
default:
return 31;
}
}
private Int32 Zeller()
{
var y = this.year;
var m = this.month;
if (m < 3)
{
y--;
m += 12;
}
return (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + 1) % 7;
}
internal void Show()
{
Console.WriteLine(" {0}年{1}月", this.year, this.month);
Wdays.ForEach(v => Console.Write("{0} ", v));
Console.WriteLine("");
Int32 sw = 1;
Int32 dow = Zeller();
Int32 max = dow + this.GetDaysInMonth();
Enumerable.Range(1, max)
.ToList()
.ForEach(i =>
{
if (i > dow)
{
Console.Write("{0, 2} ", sw++);
}
else
{
Console.Write(" ");
}
if (i % Nwdays == 0)
{
Console.WriteLine("");
}
});
Console.WriteLine("");
}
}
internal sealed class Program
{
static void Main(string[] args)
{
Int32 year;
while (true)
{
if (Int32.TryParse(Console.ReadLine(), out year) && year >= 1582)
{
break;
}
Console.WriteLine("正しい入力ではありません。");
}
Int32 month;
while (true)
{
if (Int32.TryParse(Console.ReadLine(), out month) && month >= 1 && month <= 12)
{
break;
}
Console.WriteLine("正しい入力ではありません。");
};
new Calendar(year, month).Show();
}
}
}
bmFtZXNwYWNlIE15Q2FsZW5kYXIKewogICAgdXNpbmcgU3lzdGVtOwogICAgdXNpbmcgU3lzdGVtLkxpbnE7CiAgICB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCiAgICBpbnRlcm5hbCBzZWFsZWQgY2xhc3MgQ2FsZW5kYXIKICAgIHsKICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMaXN0PFN0cmluZz4gV2RheXMgPSBuZXcgTGlzdDxzdHJpbmc+KCkgeyAi5pelIiwgIuaciCIsICLngasiLCAi5rC0IiwgIuacqCIsICLph5EiLCAi5ZyfIiB9OwogICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEludDMyIE53ZGF5cyA9IFdkYXlzLkNvdW50OwoKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEludDMyIHllYXI7CiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJbnQzMiBtb250aDsKCiAgICAgICAgaW50ZXJuYWwgQ2FsZW5kYXIoSW50MzIgeWVhciwgSW50MzIgbW9udGgpCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnllYXIgPSB5ZWFyOwogICAgICAgICAgICB0aGlzLm1vbnRoID0gbW9udGg7CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIEludDMyIEdldERheXNJbk1vbnRoKCkKICAgICAgICB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5tb250aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnllYXIgJSAodGhpcy55ZWFyICUgMjUgIT0gMCA/IDQgOiAxNikgPCAxKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjg7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMwOwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwcml2YXRlIEludDMyIFplbGxlcigpCiAgICAgICAgewogICAgICAgICAgICB2YXIgeSA9IHRoaXMueWVhcjsKICAgICAgICAgICAgdmFyIG0gPSB0aGlzLm1vbnRoOwoKICAgICAgICAgICAgaWYgKG0gPCAzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB5LS07CiAgICAgICAgICAgICAgICBtICs9IDEyOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gKHkgKyB5IC8gNCAtIHkgLyAxMDAgKyB5IC8gNDAwICsgKDEzICogbSArIDgpIC8gNSArIDEpICUgNzsKICAgICAgICB9CgogICAgICAgIGludGVybmFsIHZvaWQgU2hvdygpCiAgICAgICAgewogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAgICB7MH3lubR7MX3mnIgiLCB0aGlzLnllYXIsIHRoaXMubW9udGgpOwogICAgICAgICAgICBXZGF5cy5Gb3JFYWNoKHYgPT4gQ29uc29sZS5Xcml0ZSgiezB9ICIsIHYpKTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOwoKICAgICAgICAgICAgSW50MzIgc3cgPSAxOwogICAgICAgICAgICBJbnQzMiBkb3cgPSBaZWxsZXIoKTsKICAgICAgICAgICAgSW50MzIgbWF4ID0gZG93ICsgdGhpcy5HZXREYXlzSW5Nb250aCgpOwogICAgICAgICAgICBFbnVtZXJhYmxlLlJhbmdlKDEsIG1heCkKICAgICAgICAgICAgICAgICAgICAgIC5Ub0xpc3QoKQogICAgICAgICAgICAgICAgICAgICAgLkZvckVhY2goaSA9PgogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gZG93KQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiezAsIDJ9ICIsIHN3KyspOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgICAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICUgTndkYXlzID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIiKTsKICAgICAgICB9CiAgICB9CgogICAgaW50ZXJuYWwgc2VhbGVkIGNsYXNzIFByb2dyYW0KICAgIHsKICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICAgICAgewogICAgICAgICAgICBJbnQzMiB5ZWFyOwogICAgICAgICAgICB3aGlsZSAodHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEludDMyLlRyeVBhcnNlKENvbnNvbGUuUmVhZExpbmUoKSwgb3V0IHllYXIpICYmIHllYXIgPj0gMTU4MikKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgi5q2j44GX44GE5YWl5Yqb44Gn44Gv44GC44KK44G+44Gb44KT44CCIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEludDMyIG1vbnRoOwogICAgICAgICAgICB3aGlsZSAodHJ1ZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKEludDMyLlRyeVBhcnNlKENvbnNvbGUuUmVhZExpbmUoKSwgb3V0IG1vbnRoKSAmJiBtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyKQogICAgICAgICAgICAgICAgeyAgIAogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCLmraPjgZfjgYTlhaXlipvjgafjga/jgYLjgorjgb7jgZvjgpPjgIIiKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIG5ldyBDYWxlbmRhcih5ZWFyLCBtb250aCkuU2hvdygpOwogICAgICAgIH0KICAgIH0KfQo=