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ę Dpóźniej. Pamiętaj, że Dmoże być negatywne, w takim przypadku powinieneś zwrócić datę Dwcześ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"