Ihre Funktion oder Ihr Programm sollte ein Jahr als Eingabe benötigen und das Datum (im gregorianischen Kalender) des Osterjahres (nicht des ostorthodoxen Osterjahres) zurückgeben (oder ausdrucken). Das zurückgegebene Datum sollte gemäß ISO 8601 formatiert sein, jedoch mit Unterstützung für Jahre größer als 9999 (z. B. 312013-04-05 oder 20010130 ), und es muss nur mit Jahren größer als oder gleich 1583 (dem Jahr des zurückgegebenen Datums ) arbeiten Annahme des Gregorianischen Kalenders) und Jahre kleiner oder gleich 5701583 (da sich die Abfolge der Ostertermine zu wiederholen beginnt).
Beispiele:
e(5701583) = 5701583-04-10
e(2013) = 2013-03-31
e(1583) = 1583-04-10
e(3029) = 30290322
e(1789) = 17890412
e(1725) = 17250401
Die Verwendung der eingebauten Funktionen zur Rückgabe des Osterdatums ist langweilig und daher unzulässig. Kürzeste Antwort (in Zeichen) gewinnt.
Ressourcen:
Antworten:
GolfScript (85 Zeichen)
Beispielnutzung:
Beachten Sie, dass dies einen anderen Algorithmus verwendet als die meisten aktuellen Antworten. Um genau zu sein, habe ich den Algorithmus, der Lichtenberg in der von Sean Cheshire verlinkten Ressource zugeschrieben wird, in einem Kommentar zu der Frage angepasst .
Der ursprüngliche Algorithmus, der vernünftige Typen annimmt (dh keine JavaScript-Zahlen) und mit einer Anpassung, um Monat * 31 + Tag (unter Verwendung des Tagesversatzes von 0) anzugeben, ist
Ich habe einen allgemeinen Unterausdruck extrahiert und einige andere Optimierungen vorgenommen, um sie zu reduzieren
Dieser Ansatz hat etwas mehr arithmetische Operationen als der andere (Al Petrofskys 20-op-Algorithmus), aber kleinere Konstanten; GolfScript muss sich nicht um zusätzliche Klammern kümmern, da es stapelbasiert ist, und da jeder Zwischenwert in meinem optimierten Layout genau zweimal verwendet wird, passt es gut zu der Einschränkung von GolfScript, dass der Zugriff auf die drei obersten Elemente des Stapels einfach ist.
quelle
Python 2 -
125120119 ZeichenDies ist Fors Antwort, die schamlos auf Python portiert wurde.
Bearbeiten : Letzte Zeile von geändert
print"%d-0%d-%02d"%(y,b/31,b%31+1)
, um 5 Zeichen zu speichern. Am liebsten hätte ich10000
als dargestellt1e4
, aber das würde einen Gleitkommawert erzeugen, der einen Aufruf von erfordertint
.Edit2 : Danke an Peter Taylor, der gezeigt hat, wie man das loswird
10000
und 1 Charakter speichert.quelle
10000
, können100*100
Sie die letzte Zeile in Horners Form als einfügen(y*100+b/31)*100+b%31+1
. Mit der führenden Klammer können Sie das Leerzeichen danach entfernenprint
und die drei Instanzen von100
in eine Variable ziehen, um insgesamt 1 Zeichen zu sparen.e(y)
und ein paar BytesPHP 154
150 Zeichen, wenn ich zu JJJJMMTT anstelle von JJJJ-MM-TT wechsle.
Mit Zeilenumbrüchen:
Verbrauch:
php easter.php 1997
Output:
1997-03-30
Verbrauch:
php easter.php 2001
Output:
2001-04-15
quelle
<?=$y=$argv[1],"-0",3+$m=($d=56-($c=($y%19*351-~(($a=$y/100|0)*29.32+($b=$a>>2)+13.54)*31.9)/33%29)-~($a-$b+$c-24-$y/.8)%7)>>5,31*$m-$d;
1725-04-1
statt1725-04-01
.dc: 106 zeichen
Verwendung:
Dies sollte durch die Verwendung von 'd' und 'r' anstelle aller Lasten und Speicher verkürzt werden können.
quelle
C:
151148 ZeichenUnd der gleiche Code, aber besser formatiert:
Es gibt furchtbar viele Algorithmen zur Berechnung des Osterdatums, aber nur wenige eignen sich gut zum Code-Golfen.
quelle
Javascript
162156145Inspiriert von @ jdstankoskys PHP-Lösung ... liefert das Ergebnis JJJJMMTT ...
Jetzt eingegrenzt auf:
Bittet jetzt um Eingabe ... reduzierte den Literal-String von "0" auf 0 und ließ das lose Tippen zu meinem Vorteil wirken! :)
Wird weiter reduziert, um ES6 zu berücksichtigen ...
e=y=>y+"0"+((d=56-(c=(y%19*351-31.9*~((b=(a=y/100|0)>>2)+29.32*a+13.54))/33%29|0)-~(a-b+c-24-y/.8)%7)>(f=31)?4:3)+(d-f>0&d-f<10?0:"")+(d>f?d-f:d)
quelle
APL 132
Dieser Algorithmus berechnet die Anzahl der Tage, an denen Ostern relativ zu Anfang März liegt. Das Datum wird im Format JJJJMMTT zurückgegeben, wie in der Frage zulässig:
Nehmen Sie die Original-Testfälle:
quelle
Fortran (GFortran) , 179 Bytes
Probieren Sie es online!
Verwendet den Algorithmus "Emended Gregorian Easter" (Al Petrofsky) aus der zweiten Ressourcenverknüpfung. Seltsamerweise scheitert es für das Jahr 5701583 (und anscheinend nur für dieses Jahr) und sagt das Osterfest wie eine Woche zuvor voraus. Gibt das Datum im
YYYYYYYMMDD
Format mit einigen führenden Leerzeichen aus, wenn das Jahr weniger als sieben Stellen hat.quelle