RosettaCodeData/Task/Discordian-date/Prolog/discordian-date.pro

81 lines
2.3 KiB
Prolog

% See https://en.wikipedia.org/wiki/Discordian_calendar
main:-
test(2022, 4, 20),
test(2020, 5, 24),
test(2020, 2, 29),
test(2019, 7, 15),
test(2025, 3, 19),
test(2017, 12, 8).
test(Gregorian_year, Gregorian_month, Gregorian_day):-
ddate(Gregorian_year, Gregorian_month, Gregorian_day,
Discordian_date),
format('~|~`0t~d~2+-~|~`0t~d~2+-~|~`0t~d~2+: ~w~n', [Gregorian_year,
Gregorian_month, Gregorian_day, Discordian_date]).
ddate(Gregorian_year, 2, 29, Discordian_date):-
convert_year(Gregorian_year, Discordian_year),
swritef(Discordian_date, 'St. Tib\'s Day in the YOLD %w',
[Discordian_year]),
!.
ddate(Gregorian_year, Gregorian_month, Gregorian_day,
Discordian_date):-
convert_year(Gregorian_year, Discordian_year),
day_of_year(Gregorian_month, Gregorian_day, Daynum),
Season is Daynum//73,
Weekday is Daynum mod 5,
Day_of_season is 1 + Daynum mod 73,
season(Season, Season_name),
week_day(Weekday, Day_name),
(holy_day(Season, Day_of_season, Holy_day) ->
swritef(Discordian_date, '%w, day %w of %w in the YOLD %w. Celebrate %w!',
[Day_name, Day_of_season, Season_name, Discordian_year, Holy_day])
;
swritef(Discordian_date, '%w, day %w of %w in the YOLD %w',
[Day_name, Day_of_season, Season_name, Discordian_year])
).
convert_year(Gregorian_year, Discordian_year):-
Discordian_year is Gregorian_year + 1166.
day_of_year(M, D, N):-
month_days(M, Days),
N is Days + D - 1.
month_days(1, 0).
month_days(2, 31).
month_days(3, 59).
month_days(4, 90).
month_days(5, 120).
month_days(6, 151).
month_days(7, 181).
month_days(8, 212).
month_days(9, 243).
month_days(10, 273).
month_days(11, 304).
month_days(12, 334).
season(0, 'Chaos').
season(1, 'Discord').
season(2, 'Confusion').
season(3, 'Bureacracy').
season(4, 'The Aftermath').
week_day(0, 'Sweetmorn').
week_day(1, 'Boomtime').
week_day(2, 'Pungenday').
week_day(3, 'Prickle-Prickle').
week_day(4, 'Setting Orange').
holy_day(0, 5, 'Mungday').
holy_day(0, 50, 'Chaoflux').
holy_day(1, 5, 'Mojoday').
holy_day(1, 50, 'Discoflux').
holy_day(2, 5, 'Syaday').
holy_day(2, 50, 'Confuflux').
holy_day(3, 5, 'Zaraday').
holy_day(3, 50, 'Bureflux').
holy_day(4, 5, 'Maladay').
holy_day(4, 50, 'Afflux').