using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string calendar = "";
calendar = (from x in Enumerable.Range(1, 12)
group x by (x + 2) / 3 into g
select (BuildCalendar(DateTime.Now.Year, g.ToList()[0]).Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Union(new string[] { "\r\n" })
.Zip(BuildCalendar(DateTime.Now.Year, g.ToList()[1]).Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Union(new string[] { "\r\n" }), (x, y) => x.TrimEnd().PadRight(23, ' ') + y)
.Zip(BuildCalendar(DateTime.Now.Year, g.ToList()[2]).Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries).Union(new string[] { "\r\n" }), (x, y) => x.TrimEnd().PadRight(46, ' ') + y))
.Zip(Enumerable.Repeat("\r\n", 8), (x, y) => x + y)
.Aggregate((serials, current) => serials + current))
.Aggregate((serials, current) => serials + current);
Console.WriteLine(DateTime.Now.Year + "\r\n" + calendar);
}
static string BuildCalendar(int year, int month)
{
string calendar = new string[] { month.ToString(), "SU MO TU WE TH FR SA" }
.Union(Enumerable.Range(
1 - (int)new DateTime(year, month, 1).DayOfWeek,
new DateTime(year, month, 1).AddMonths(1).AddDays(-1).Day + (int)new DateTime(year, month, 1).DayOfWeek
)
.GroupBy(x => ((x + (int)(new DateTime(year, month, 1).DayOfWeek + 6)) / 7), (key, g) => new { GroupKey = key, Items = g })
.Select(x =>
x.Items.Select(y => y < 1 ? " " : Convert.ToString(y).PadLeft(2, '0') + " ")
.Aggregate((serials, current) => serials + current))
)
.Aggregate((serial, current) => serial + "\r\n" + current);
return calendar;
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UZXh0OwoKbmFtZXNwYWNlIENvbnNvbGVBcHBsaWNhdGlvbjEKewogICAgY2xhc3MgUHJvZ3JhbQogICAgewogICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgICAgICB7CiAgICAgICAgICAgIHN0cmluZyBjYWxlbmRhciA9ICIiOwogICAgICAgICAgICBjYWxlbmRhciA9IChmcm9tIHggaW4gRW51bWVyYWJsZS5SYW5nZSgxLCAxMikKICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgeCBieSAoeCArIDIpIC8gMyBpbnRvIGcKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IChCdWlsZENhbGVuZGFyKERhdGVUaW1lLk5vdy5ZZWFyLCBnLlRvTGlzdCgpWzBdKS5TcGxpdChuZXcgY2hhcltdIHsgJ1xyJywgJ1xuJyB9LCBTdHJpbmdTcGxpdE9wdGlvbnMuUmVtb3ZlRW1wdHlFbnRyaWVzKS5VbmlvbihuZXcgc3RyaW5nW10geyAiXHJcbiIgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlppcChCdWlsZENhbGVuZGFyKERhdGVUaW1lLk5vdy5ZZWFyLCBnLlRvTGlzdCgpWzFdKS5TcGxpdChuZXcgY2hhcltdIHsgJ1xyJywgJ1xuJyB9LCBTdHJpbmdTcGxpdE9wdGlvbnMuUmVtb3ZlRW1wdHlFbnRyaWVzKS5VbmlvbihuZXcgc3RyaW5nW10geyAiXHJcbiIgfSksICh4LCB5KSA9PiB4LlRyaW1FbmQoKS5QYWRSaWdodCgyMywgJyAnKSArIHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5aaXAoQnVpbGRDYWxlbmRhcihEYXRlVGltZS5Ob3cuWWVhciwgZy5Ub0xpc3QoKVsyXSkuU3BsaXQobmV3IGNoYXJbXSB7ICdccicsICdcbicgfSwgU3RyaW5nU3BsaXRPcHRpb25zLlJlbW92ZUVtcHR5RW50cmllcykuVW5pb24obmV3IHN0cmluZ1tdIHsgIlxyXG4iIH0pLCAoeCwgeSkgPT4geC5UcmltRW5kKCkuUGFkUmlnaHQoNDYsICcgJykgKyB5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlppcChFbnVtZXJhYmxlLlJlcGVhdCgiXHJcbiIsIDgpLCAoeCwgeSkgPT4geCArIHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5BZ2dyZWdhdGUoKHNlcmlhbHMsIGN1cnJlbnQpID0+IHNlcmlhbHMgKyBjdXJyZW50KSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5BZ2dyZWdhdGUoKHNlcmlhbHMsIGN1cnJlbnQpID0+IHNlcmlhbHMgKyBjdXJyZW50KTsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoRGF0ZVRpbWUuTm93LlllYXIgKyAiXHJcbiIgKyBjYWxlbmRhcik7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgc3RyaW5nIEJ1aWxkQ2FsZW5kYXIoaW50IHllYXIsIGludCBtb250aCkKICAgICAgICB7CiAgICAgICAgICAgIHN0cmluZyBjYWxlbmRhciA9IG5ldyBzdHJpbmdbXSB7IG1vbnRoLlRvU3RyaW5nKCksICJTVSBNTyBUVSBXRSBUSCBGUiBTQSIgfQogICAgICAgICAgICAgICAgLlVuaW9uKEVudW1lcmFibGUuUmFuZ2UoCiAgICAgICAgICAgICAgICAgICAgMSAtIChpbnQpbmV3IERhdGVUaW1lKHllYXIsIG1vbnRoLCAxKS5EYXlPZldlZWssCiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGVUaW1lKHllYXIsIG1vbnRoLCAxKS5BZGRNb250aHMoMSkuQWRkRGF5cygtMSkuRGF5ICsgKGludCluZXcgRGF0ZVRpbWUoeWVhciwgbW9udGgsIDEpLkRheU9mV2VlawogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLkdyb3VwQnkoeCA9PiAoKHggKyAoaW50KShuZXcgRGF0ZVRpbWUoeWVhciwgbW9udGgsIDEpLkRheU9mV2VlayArIDYpKSAvIDcpLCAoa2V5LCBnKSA9PiBuZXcgeyBHcm91cEtleSA9IGtleSwgSXRlbXMgPSBnIH0pCiAgICAgICAgICAgICAgICAuU2VsZWN0KHggPT4KICAgICAgICAgICAgICAgICAgICB4Lkl0ZW1zLlNlbGVjdCh5ID0+IHkgPCAxID8gIiAgICIgOiBDb252ZXJ0LlRvU3RyaW5nKHkpLlBhZExlZnQoMiwgJzAnKSArICIgIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgLkFnZ3JlZ2F0ZSgoc2VyaWFscywgY3VycmVudCkgPT4gc2VyaWFscyArIGN1cnJlbnQpKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgLkFnZ3JlZ2F0ZSgoc2VyaWFsLCBjdXJyZW50KSA9PiBzZXJpYWwgKyAiXHJcbiIgKyBjdXJyZW50KTsKICAgICAgICAgICAgcmV0dXJuIGNhbGVuZGFyOwogICAgICAgIH0KICAgIH0KfQ==