Lassen Sie uns mit einem fiktiven Kalender arbeiten, um die Wettbewerbsbedingungen zwischen Sprachen mit und ohne eingebaute Datumsbibliotheken auszugleichen. Die Vergessenen Reiche sind ein ( das? ) Kampagneneinstellung für Dungeons & Dragons. Natürlich hat jeder seinen eigenen Kalender.
Der Kalender von Harptos
Praktischerweise hat ein Jahr in den Vergessenen Reichen auch 365 Tage. Darüber hinaus hat der Kalender auch 12 Monate. Hier wird es jedoch interessant. Jeder Monat ist genau 30 Tage lang. Die restlichen 5 Tage sind Feiertage, die zwischen den Monaten liegen. Hier sind die Monate und Feiertage in Reihenfolge (mit eingerückten Feiertagen):
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
Beachten Sie, dass ich einen sechsten Feiertag in Klammern eingefügt habe. Dies ist der Schalttag, der nur alle vier Jahre stattfindet (ja, das ist es - es gibt keine zusätzlichen Spielereien mit den Jahrhunderten).
Randnotiz zu Monatsnamen: Jeder Monat hat einen formalen und einen gemeinsamen Namen. Das Obige sind die gebräuchlichen Namen. Ich habe diese ausgewählt, weil ich denke, dass sie eine interessantere Komprimierung ermöglichen.
Es gibt mehrere Nummerierungen der Jahre, aber die am weitesten verbreitete ist Dalereckoning , abgekürzt auf DR . (Außerdem hat jedes Jahr einen oder mehrere Namen , aber wir werden uns nicht darum kümmern.)
Die Komponenten eines Datums sollten durch ein Komma und ein Leerzeichen getrennt werden. Alles in allem könnte ein gültiges Datum so aussehen:
4, The Melting, 1491 DR
oder
Shieldmeet, 1464 DR
Beachten Sie, dass für die Feiertage keine Tagesnummer vorhanden ist. (Ich nehme an, 4th of The Melting
dass es für die Tage der Monate schöner wäre, aber ich möchte keine Ordnungszahlen hinein ziehen.)
Fußnote: Ich kam auf diese Idee, als sich xnor beschwerte, dass jede einzelne Datumsherausforderung die Schaltjahrberechnung erfordert. Ich habe es nicht vollständig beseitigt, aber zumindest ist es nur ein einziges Modulo in diesem Kalender.
Die Herausforderung
Wenn ein gültiges Datum des Harptos-Kalenders sowie eine Ganzzahl angegeben sind D
, geben Sie das Datum D
Tage später aus. Beachten Sie, dass D
dies negativ sein kann. In diesem Fall sollten Sie das Datum D
Tage früher zurückgeben.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Sie können davon ausgehen, dass das Jahr positiv ist und weniger als 2000.
Es gelten die Standardregeln für Code-Golf .
Testfälle
Die ersten rund ein Dutzend Testfälle sollten alle Randfälle rund um Feiertage und Schaltjahre testen. Im nächsten Satz soll getestet werden, dass Bereiche über mehrere Jahre hinweg arbeiten und alle Monate und Feiertage implementiert wurden. In der zweiten Hälfte sind wieder alle Testfälle gleich, jedoch mit negativen Offsets.
"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"
quelle
Antworten:
Ruby,
543523521498511509 BytesUm mehr Antworten auf diese Frage zu erhalten, werde ich eine Ruby-Version meiner Python-Antwort veröffentlichen, da ich angenommen habe, dass sie kürzer sein würde. Diese Antwort ist kürzer, aber nicht viel. Kannst du es besser machen?
Edit: Mit Dank an Martin Büttner und seinem Vorschlag hier .
Edit: Ich habe die "Anzahl der Tage in einem Monat" -Liste erheblich gesenkt.
Bearbeiten: Beim Golfspielen, wie ich
d[10]=r%4<1?1:0
esd[10]=0**(r%4)
für ein Byte gemacht habe, ist mir aufgefallen, dass ich beim Golfspielen einen Fehler entdeckt habed
, nämlich die Anzahl der Tage, die Shieldmeet aus Versehen 30 Tage hatte. Und so ist die Byteanzahl zurückgekehrt. Ich werde auch die Python-Antwort bearbeiten, um diesen Fehler dort zu beheben.Edit: Ich habe vergessen, dass Funktionen in dieser Frage nicht benannt werden müssen.
Ungolfed:
quelle
Python 3,
712652636567563552550548529540 BytesEndlich fand ich Zeit, eine Antwort auf diese ausgezeichnete Frage zu schreiben. Es ist noch nicht sehr erfolgreich (die Liste der Monatsnamen
und der Anzahl der Tageist in diesem Fall besonders ungeheuerlichund die Tatsache, dass für die Bearbeitung von Negativen), aber es ist zumindest eine Antwort.D
eine separate while-Schleife erforderlich istBearbeiten: Beheben eines Fehlers
Ungolfed:
quelle