Fungsi atau program Anda harus mengambil satu tahun sebagai input dan mengembalikan (atau mencetak) tanggal (dalam kalender Gregorian) tahun Paskah itu (bukan Paskah Ortodoks Timur). Tanggal yang dikembalikan harus diformat sesuai dengan ISO 8601, tetapi dengan dukungan untuk tahun yang lebih besar dari 9999 (seperti 312013-04-05 atau 20010130 ), dan hanya perlu bekerja dengan tahun yang lebih besar atau sama dengan 1583 (tahun adopsi kalender Gregorian), dan tahun-tahun kurang dari atau sama dengan 5701583 (seperti saat urutan tanggal Paskah mulai terulang).
Contoh:
e(5701583) = 5701583-04-10
e(2013) = 2013-03-31
e(1583) = 1583-04-10
e(3029) = 30290322
e(1789) = 17890412
e(1725) = 17250401
Penggunaan fungsi bawaan untuk mengembalikan tanggal paskah membosankan dan karenanya dilarang. Jawaban terpendek (dalam karakter) menang.
Sumber:
Jawaban:
GolfScript (85 karakter)
Penggunaan sampel:
Perhatikan bahwa ini menggunakan algoritma berbeda untuk sebagian besar jawaban saat ini. Untuk lebih spesifik, saya telah mengadaptasi algoritma yang dikaitkan dengan Lichtenberg di sumber daya yang dihubungkan oleh Sean Cheshire dalam komentar pada pertanyaan.
Algoritma asli, dengan asumsi jenis yang masuk akal (yaitu bukan angka JavaScript) dan dengan adaptasi untuk memberikan bulan * 31 + hari (menggunakan day offset 0) adalah
Saya mengekstraksi subekspresi umum dan melakukan beberapa optimasi lain untuk mengurangi
Pendekatan ini memiliki operasi aritmatika sedikit lebih dari yang lain (algoritma Al-Petrofsky 20-op), tetapi memiliki konstanta yang lebih kecil; GolfScript tidak perlu khawatir dengan tanda kurung tambahan karena itu berbasis tumpukan, dan karena setiap nilai menengah dalam tata letak yang dioptimalkan digunakan tepat dua kali, ini cocok dengan batasan GolfScript untuk akses mudah ke tiga item teratas di tumpukan.
sumber
Python 2 -
125120119 karakterIni adalah jawaban Fors tanpa malu-malu porting ke Python.
Sunting : Mengubah baris terakhir dari
print"%d-0%d-%02d"%(y,b/31,b%31+1)
untuk menyimpan 5 karakter. Aku akan senang untuk mewakili10000
sebagai1e4
, tapi itu akan menghasilkan floating point memerlukan panggilan keint
.Sunting2 : Terima kasih kepada Peter Taylor untuk menunjukkan cara menyingkirkan itu
10000
dan menyimpan 1 karakter.sumber
10000
hingga100*100
Anda dapat menempatkan baris terakhir dalam bentuk Horner sebagai(y*100+b/31)*100+b%31+1
. Tanda kurung utama memungkinkan Anda untuk menghapus spasi setelahnyaprint
, dan Anda bisa menarik tiga contoh dari100
ke variabel untuk penghematan keseluruhan 1 char.e(y)
dan menyimpan beberapa bytePHP 154
150 karakter jika saya beralih ke YYYYMMDD bukan YYYY-MM-DD.
Dengan Line Breaks:
Penggunaan:
php easter.php 1997
Output:
1997-03-30
Penggunaan:
php easter.php 2001
Output:
2001-04-15
sumber
<?=$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
bukan1725-04-01
.dc: 106 karakter
Pemakaian:
Ini harus dapat dipersingkat dengan menggunakan 'd' dan 'r' alih-alih semua beban dan toko.
sumber
C:
151148 karakterDan kode yang sama, tetapi lebih baik diformat:
Ada banyak algoritma yang menakutkan untuk menghitung tanggal Paskah, tetapi hanya beberapa yang cocok untuk kode golf.
sumber
Javascript
162156 156145Terinspirasi oleh solusi PHP @ jdstankosky ... Memberikan hasil YYYYMMDD ...
Sekarang dipersempit menjadi:
Sekarang minta input ... string string "0" menjadi berkurang dan biarkan pengetikan yang longgar menguntungkan saya! :)
Dikurangi lebih jauh untuk memperhitungkan 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)
sumber
APL 132
Algoritma ini menghitung jumlah hari Paskah terletak relatif terhadap awal Maret. Tanggal dikembalikan dalam format YYYYMMDD sebagaimana diizinkan dalam pertanyaan:
Mengambil kasus uji asli:
sumber
Fortran (GFortran) , 179 byte
Cobalah online!
Menggunakan algoritma "Emended Gregorian Easter" (Al Petrofsky) dari tautan sumber daya kedua. Anehnya, itu gagal untuk tahun 5701583 (dan, tampaknya, hanya untuk tahun ini), memprediksi Paskah satu minggu sebelumnya. Mencetak tanggal dalam
YYYYYYYMMDD
format, dengan beberapa spasi terkemuka jika tahun memiliki kurang dari tujuh digit.sumber