80 lines
2.7 KiB
D
80 lines
2.7 KiB
D
import std.stdio, std.datetime, std.conv, std.string;
|
|
|
|
immutable seasons = ["Chaos", "Discord", "Confusion",
|
|
"Bureaucracy", "The Aftermath"],
|
|
weekday = ["Sweetmorn", "Boomtime", "Pungenday",
|
|
"Prickle-Prickle", "Setting Orange"],
|
|
apostle = ["Mungday", "Mojoday", "Syaday",
|
|
"Zaraday", "Maladay"],
|
|
holiday = ["Chaoflux", "Discoflux", "Confuflux",
|
|
"Bureflux", "Afflux"];
|
|
|
|
string discordianDate(in Date date) pure {
|
|
immutable dYear = text(date.year + 1166);
|
|
|
|
immutable isLeapYear = date.isLeapYear;
|
|
if (isLeapYear && date.month == 2 && date.day == 29)
|
|
return "St. Tib's Day, in the YOLD " ~ dYear;
|
|
|
|
immutable doy = (isLeapYear && date.dayOfYear >= 60) ?
|
|
date.dayOfYear - 1 :
|
|
date.dayOfYear;
|
|
|
|
immutable dsDay = (doy % 73)==0? 73:(doy % 73); // Season day.
|
|
if (dsDay == 5)
|
|
return apostle[doy / 73] ~ ", in the YOLD " ~ dYear;
|
|
if (dsDay == 50)
|
|
return holiday[doy / 73] ~ ", in the YOLD " ~ dYear;
|
|
|
|
immutable dSeas = seasons[(((doy%73)==0)?doy-1:doy) / 73];
|
|
immutable dWday = weekday[(doy - 1) % 5];
|
|
|
|
return format("%s, day %s of %s in the YOLD %s",
|
|
dWday, dsDay, dSeas, dYear);
|
|
}
|
|
|
|
unittest {
|
|
assert(Date(2010, 7, 22).discordianDate ==
|
|
"Pungenday, day 57 of Confusion in the YOLD 3176");
|
|
assert(Date(2012, 2, 28).discordianDate ==
|
|
"Prickle-Prickle, day 59 of Chaos in the YOLD 3178");
|
|
assert(Date(2012, 2, 29).discordianDate ==
|
|
"St. Tib's Day, in the YOLD 3178");
|
|
assert(Date(2012, 3, 1).discordianDate ==
|
|
"Setting Orange, day 60 of Chaos in the YOLD 3178");
|
|
assert(Date(2010, 1, 5).discordianDate ==
|
|
"Mungday, in the YOLD 3176");
|
|
assert(Date(2011, 5, 3).discordianDate ==
|
|
"Discoflux, in the YOLD 3177");
|
|
}
|
|
|
|
void main(string args[]) {
|
|
int yyyymmdd, day, mon, year, sign;
|
|
if (args.length == 1) {
|
|
(cast(Date)Clock.currTime).discordianDate.writeln;
|
|
return;
|
|
}
|
|
foreach (i, arg; args) {
|
|
if (i > 0) {
|
|
//writef("%d: %s: ", i, arg);
|
|
yyyymmdd = to!int(arg);
|
|
if (yyyymmdd < 0) {
|
|
sign = -1;
|
|
yyyymmdd = -yyyymmdd;
|
|
}
|
|
else {
|
|
sign = 1;
|
|
}
|
|
day = yyyymmdd % 100;
|
|
if (day == 0) {
|
|
day = 1;
|
|
}
|
|
mon = ((yyyymmdd - day) / 100) % 100;
|
|
if (mon == 0) {
|
|
mon = 1;
|
|
}
|
|
year = sign * ((yyyymmdd - day - 100*mon) / 10000);
|
|
writefln("%s", Date(year, mon, day).discordianDate);
|
|
}
|
|
}
|
|
}
|