Чтобы выровнять игровое поле между языками со встроенными библиотеками дат и без, давайте поработаем с вымышленным календарем. Забытые Королевства - это ( ? ) Кампания для Dungeons & Dragons. Конечно, у каждого свой календарь.
Календарь Гарптос
Удобно, что год в Забытых Царствах также имеет 365 дней. Кроме того, календарь также имеет 12 месяцев. Тем не менее, это то, где это становится интересным. Каждый месяц длится ровно 30 дней. Оставшиеся 5 дней являются выходными, которые выпадают между месяцами. Вот месяцы и праздники по порядку (с отступом):
1 Deepwinter
Midwinter
2 The Claw of Winter
3 The Claw of the Sunsets
4 The Claw of the Storms
Greengrass
5 The Melting
6 The Time of Flowers
7 Summertide
Midsummer
[Shieldmeet]
8 Highsun
9 The Fading
Highharvestide
10 Leaffall
11 The Rotting
The Feast of the Moon
12 The Drawing Down
Обратите внимание, что я вставил шестой праздник в скобках. Это високосный день, который происходит только каждые четыре года (да, вот и все - никаких дополнительных махинаций с веками).
Дополнительное примечание об названиях месяцев: у каждого месяца есть формальное и общее название. Выше приведены общие имена. Я выбрал их, потому что я думаю, что они допускают более интересное сжатие.
Существует несколько нумераций лет, но наиболее распространенной является Dalereckoning , сокращенная до DR . (Кроме того, каждый год имеет одно или несколько имен , но мы не будем беспокоиться об этом.)
Компоненты даты должны быть разделены запятой и пробелом. В общем, действительная дата может выглядеть так:
4, The Melting, 1491 DR
или
Shieldmeet, 1464 DR
Обратите внимание, что для праздников нет номера дня. (Я полагаю, что 4th of The Melting
было бы лучше для дней месяцев, но я не хочу перетаскивать порядковые числа в это.)
Сноска. Я придумал это, когда xnor пожаловался на то, что для каждой отдельной даты требуется вычисление високосного года. Мне не удалось полностью его устранить, но, по крайней мере, в этом календаре только один модуль.
Соревнование
Если задана правильная дата Календаря Гарптос, а также целое число D
, выведите дату D
через несколько дней. Обратите внимание, что это D
может быть отрицательным, и в этом случае вы должны вернуть дату D
дней раньше.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Вы можете предположить, что год положительный и меньше 2000.
Применяются стандартные правила игры в гольф .
Тестовые случаи
Первые дюжина или около того контрольных примеров должны проверять все крайние случаи, связанные с праздниками и високосными годами. Следующим набором является тестирование, которое охватывает несколько лет работы и все месяцы и праздники были реализованы. Во второй половине все те же тесты, но с отрицательными смещениями.
"30, Summertide, 1491 DR" 1 => "Midsummer, 1491 DR"
"30, Summertide, 1491 DR" 2 => "1, Highsun, 1491 DR"
"Midsummer, 1491 DR" 1 => "1, Highsun, 1491 DR"
"30, Summertide, 1492 DR" 1 => "Midsummer, 1492 DR"
"30, Summertide, 1492 DR" 2 => "Shieldmeet, 1492 DR"
"30, Summertide, 1492 DR" 3 => "1, Highsun, 1492 DR"
"Midsummer, 1492 DR" 1 => "Shieldmeet, 1492 DR"
"Midsummer, 1492 DR" 2 => "1, Highsun, 1492 DR"
"Shieldmeet, 1492 DR" 1 => "1, Highsun, 1492 DR"
"1, Highsun, 1490 DR" 365 => "1, Highsun, 1491 DR"
"1, Highsun, 1491 DR" 365 => "Shieldmeet, 1492 DR"
"Shieldmeet, 1492 DR" 365 => "Midsummer, 1493 DR"
"Midsummer, 1493 DR" 365 => "Midsummer, 1494 DR"
"Shieldmeet, 1500 DR" 365 => "Midsummer, 1501 DR"
"14, Deepwinter, 654 DR" 5069 => "The Feast of the Moon, 667 DR"
"Midwinter, 17 DR" 7897 => "15, The Fading, 38 DR"
"3, The Claw of Winter, 1000 DR" 813 => "25, The Claw of the Storms, 1002 DR"
"Greengrass, 5 DR" 26246 => "9, The Claw of the Sunsets, 77 DR"
"30, The Melting, 321 DR" 394 => "29, The Time of Flowers, 322 DR"
"17, The Time of Flowers, 867 DR" 13579 => "20, Highsun, 904 DR"
"Highharvestide, 1814 DR" 456 => "30, The Drawing Down, 1815 DR"
"23, The Rotting, 1814 DR" 3616 => "16, Leaffall, 1824 DR"
"1, Deepwinter, 1 DR" 730499 => "30, The Drawing Down, 2000 DR"
"Midsummer, 1491 DR" -1 => "30, Summertide, 1491 DR"
"1, Highsun, 1491 DR" -2 => "30, Summertide, 1491 DR"
"1, Highsun, 1491 DR" -1 => "Midsummer, 1491 DR"
"Midsummer, 1492 DR" -1 => "30, Summertide, 1492 DR"
"Shieldmeet, 1492 DR" -2 => "30, Summertide, 1492 DR"
"1, Highsun, 1492 DR" -3 => "30, Summertide, 1492 DR"
"Shieldmeet, 1492 DR" -1 => "Midsummer, 1492 DR"
"1, Highsun, 1492 DR" -2 => "Midsummer, 1492 DR"
"1, Highsun, 1492 DR" -1 => "Shieldmeet, 1492 DR"
"1, Highsun, 1491 DR" -365 => "1, Highsun, 1490 DR"
"Shieldmeet, 1492 DR" -365 => "1, Highsun, 1491 DR"
"Midsummer, 1493 DR" -365 => "Shieldmeet, 1492 DR"
"Midsummer, 1494 DR" -365 => "Midsummer, 1493 DR"
"Midsummer, 1501 DR" -365 => "Shieldmeet, 1500 DR"
"The Feast of the Moon, 667 DR" -5069 => "14, Deepwinter, 654 DR"
"15, The Fading, 38 DR" -7897 => "Midwinter, 17 DR"
"25, The Claw of the Storms, 1002 DR" -813 => "3, The Claw of Winter, 1000 DR"
"9, The Claw of the Sunsets, 77 DR" -26246 => "Greengrass, 5 DR"
"29, The Time of Flowers, 322 DR" -394 => "30, The Melting, 321 DR"
"20, Highsun, 904 DR" -13579 => "17, The Time of Flowers, 867 DR"
"30, The Drawing Down, 1815 DR" -456 => "Highharvestide, 1814 DR"
"16, Leaffall, 1824 DR" -3616 => "23, The Rotting, 1814 DR"
"30, The Drawing Down, 2000 DR" -730499 => "1, Deepwinter, 1 DR"