Twoja funkcja lub program powinien zająć rok jako dane wejściowe i zwrócić (lub wydrukować) datę (w kalendarzu gregoriańskim) tych lat Wielkanocy (nie Wielkanoc prawosławna). Zwrócona data powinna być sformatowana zgodnie z ISO 8601, ale ze wsparciem dla lat większych niż 9999 (takich jak 312013-04-05 lub 20010130 ) i musi działać tylko z latami dłuższymi lub równymi 1583 (rok przyjęcie kalendarza gregoriańskiego) i lat krótszych lub równych 5701583 (kiedy to sekwencja dat wielkanocnych zaczyna się powtarzać).
Przykłady:
e(5701583) = 5701583-04-10
e(2013) = 2013-03-31
e(1583) = 1583-04-10
e(3029) = 30290322
e(1789) = 17890412
e(1725) = 17250401
Korzystanie z wbudowanych funkcji do zwracania daty Wielkanocy jest nudne i dlatego jest zabronione. Najkrótsza odpowiedź (w postaciach) wygrywa.
Zasoby:
Odpowiedzi:
GolfScript (85 znaków)
Przykładowe użycie:
Zauważ, że używa to innego algorytmu niż większość obecnych odpowiedzi. Mówiąc ściślej, dostosowałem algorytm przypisany Lichtenbergowi w zasobie powiązanym przez Seana Cheshire w komentarzu do pytania.
Oryginalny algorytm, zakładający rozsądne typy (tj. Nie liczby JavaScript) i z adaptacją, aby dać miesiąc * 31 + dzień (z przesunięciem dnia o 0) to
Wyodrębniłem wspólny podwyrażenie i dokonałem innych optymalizacji w celu zredukowania do
Podejście to ma nieco więcej operacji arytmetycznych niż drugie (algorytm 20 operacji Al Petrofsky'ego), ale ma mniejsze stałe; GolfScript nie musi martwić się dodatkowymi nawiasami, ponieważ jest oparty na stosie, a ponieważ każda wartość pośrednia w moim zoptymalizowanym układzie jest używana dokładnie dwukrotnie, dobrze pasuje do ograniczenia GolfScript w zakresie łatwego dostępu do trzech najlepszych pozycji na stosie.
źródło
Python 2 -
125120119 znakówOto odpowiedź Forsa bezwstydnie przeniesiona do Pythona.
Edytuj : Zmieniono ostatni wiersz z,
print"%d-0%d-%02d"%(y,b/31,b%31+1)
aby zapisać 5 znaków. Chciałbym reprezentować10000
jako1e4
, ale spowodowałoby to zmiennoprzecinkowe wymaganie wezwania doint
.Edycja2 : Podziękowania dla Petera Taylora za pokazanie, jak się go pozbyć
10000
i uratować 1 postać.źródło
10000
maksymalnie100*100
można postawić ostatnią linię w postaci Hornera jako(y*100+b/31)*100+b%31+1
. Wiodący nawias pozwala usunąć później miejsceprint
i można wyciągnąć trzy wystąpienia100
zmiennej do ogólnego oszczędności 1 znaku.e(y)
i zaoszczędzić kilka bajtówPHP 154
150 znaków, jeśli zmienię na RRRRMMDD zamiast RRRR-MM-DD.
Z podziałem linii:
Wykorzystanie:
php easter.php 1997
Wyjście:
1997-03-30
Wykorzystanie:
php easter.php 2001
Wyjście:
2001-04-15
źródło
<?=$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
zamiast1725-04-01
.dc: 106 znaków
Stosowanie:
Powinno to być możliwe do skrócenia za pomocą „d” i „r” zamiast wszystkich obciążeń i zapasów.
źródło
C:
151148 znakówI ten sam kod, ale lepiej sformatowany:
Istnieje przerażająco wiele algorytmów do obliczania daty Wielkanocy, ale tylko kilka z nich nadaje się do gry w golfa kodu.
źródło
JavaScript
162156145Zainspirowany rozwiązaniem PHP @ jdstankosky ... Zapewnia wynik RRRRMMDD ...
Teraz zawęził się do:
Teraz prosi o dane wejściowe ... zmniejszyłem literał ciąg „0” do 0 i pozwól luźnemu pisaniu działać na moją korzyść! :)
Zmniejszono dodatkowo, aby uwzględnić ES6 ...
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)
źródło
APL 132
Ten algorytm oblicza liczbę dni Wielkanocy w stosunku do początku marca. Data jest zwracana w formacie RRRRMMDD, jak dozwolone w pytaniu:
Biorąc oryginalne przypadki testowe:
źródło
Fortran (GFortran) , 179 bajtów
Wypróbuj online!
Wykorzystuje algorytm „Emended Gregorian Easter” (Al Petrofsky) z drugiego łącza zasobów. O dziwo, zawodzi w roku 5701583 (i najwyraźniej tylko w tym roku), przepowiadając Wielkanoc jak tydzień wcześniej. Drukuje datę w
YYYYYYYMMDD
formacie z kilkoma wiodącymi spacjami, jeśli rok ma mniej niż siedem cyfr.źródło