Aby wyrównać szanse między językami z wbudowanymi bibliotekami dat i tymi bez, pracujmy z fikcyjnym kalendarzem. Forgotten Realms to ustawienie kampanii ( ? ) Dla Dungeons & Dragons. Oczywiście każdy z nich ma swój własny kalendarz.
Kalendarz Harptos
Dogodnie rok w Forgotten Realms ma również 365 dni. Ponadto kalendarz ma również 12 miesięcy. Tutaj jednak robi się ciekawie. Każdy miesiąc trwa dokładnie 30 dni. Pozostałe 5 dni to święta przypadające między miesiącami. Oto miesiące i święta w kolejności (z wcięciami urlopowymi):
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
Zauważ, że wstawiłem szóste wakacje w nawiasach. To dzień przestępny, który pojawia się tylko co cztery lata (tak, to jest to - z wiekami nie ma żadnych dodatkowych shenaniganów).
Uwaga dodatkowa na temat nazw miesięcy: każdy miesiąc ma formalną i wspólną nazwę. Powyżej są pospolite nazwy. Wybrałem je, ponieważ myślę, że pozwalają one na bardziej interesującą kompresję.
Istnieje kilka numeracji lat, ale najbardziej rozpowszechnioną jest Dalereckoning , w skrócie DR . (Co roku ma co najmniej jedno imię , ale nie będziemy się tym przejmować.)
Składniki daty powinny być oddzielone przecinkiem i spacją. W sumie poprawna data może wyglądać następująco:
4, The Melting, 1491 DR
lub
Shieldmeet, 1464 DR
Pamiętaj, że nie ma numeru dnia świątecznego. (Przypuszczam 4th of The Melting
, że byłoby ładniej na kilka dni, ale nie chcę przeciągać do tego liczb porządkowych).
Przypis: Wymyśliłem to, gdy xnor narzekał, że każde wyzwanie związane z datą wymaga obliczenia roku przestępnego. Nie udało mi się go całkowicie wyeliminować, ale przynajmniej jest to tylko jeden moduł w tym kalendarzu.
Wyzwanie
Biorąc pod uwagę prawidłową datę Kalendarza Harptos, a także liczbę całkowitą D
, wypisz datę D
później. Pamiętaj, że D
może być negatywne, w takim przypadku powinieneś zwrócić datę D
wcześniej.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Możesz założyć, że rok jest dodatni i krótszy niż 2000.
Obowiązują standardowe zasady gry w golfa .
Przypadki testowe
Około kilkunastu pierwszych przypadków testowych powinno przetestować wszystkie przypadkowe przypadki otaczające wakacje i lata przestępne. Następnym zestawem jest testowanie, które obejmuje wiele lat pracy i wszystkie miesiące i święta zostały wdrożone. Druga połowa to znowu te same przypadki testowe, ale z przesunięciami ujemnymi.
"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"