ईस्टर की तारीख की गणना करें


13

आपके फ़ंक्शन या प्रोग्राम को इनपुट के रूप में एक वर्ष लेना चाहिए और उस वर्ष ईस्टर (पूर्वी रूढ़िवादी ईस्टर नहीं) की तारीख (ग्रेगोरियन कैलेंडर में) प्रिंट (या प्रिंट) करना चाहिए। लौटाई गई तारीख को आईएसओ 8601 के अनुसार स्वरूपित किया जाना चाहिए, लेकिन 9999 (जैसे 312013-04-05 या 20010130 ) से अधिक वर्षों तक समर्थन के साथ , और इसे केवल 1583 (वर्ष के बराबर) से अधिक वर्षों के साथ काम करने की आवश्यकता है ग्रेगोरियन कैलेंडर को अपनाना), और 5701583 के बराबर या उससे कम वर्षों (जैसा कि जब ईस्टर की तारीखों का क्रम खुद को दोहराना शुरू होता है)।

उदाहरण:

e(5701583) = 5701583-04-10
e(2013)    = 2013-03-31
e(1583)    = 1583-04-10
e(3029)    = 30290322
e(1789)    = 17890412
e(1725)    = 17250401

ईस्टर की तारीख को लौटाने के लिए अंतर्निहित कार्यों का उपयोग उबाऊ है और इसलिए अस्वीकृत है। सबसे छोटा जवाब (पात्रों में) जीतता है।

संसाधन:


क्या आपको पता है कि कुछ भाषाओं में ऐसा करने के लिए एक अंतर्निहित कार्य होता है?
पीटर टेलर

जैसे कि? केवल एक ही जिसके बारे में मैं जानता हूं कि PHP है, लेकिन easter_date और easter_days फ़ंक्शन काफी सीमित हैं, easter_date केवल 1970 के बाद के वर्षों के लिए काम करता है और easter_days 1753 से पहले के वर्षों के लिए सही मात्रा में दिन वापस नहीं करता है। लेकिन मैं प्रश्न को संपादित करूंगा ऐसे कार्यों के उपयोग को रोकना।
फोर्स


1
तो यह ग्रेगोरियन और जूलियन नहीं है? इसके अलावा, मैं कैथोलिक नहीं हूं, "कैथोलिक परंपरा" क्या है?
jdstankosky

जवाबों:


3

गोल्फस्क्रिप्ट (85 वर्ण)

~:^100/.)3*4/.@8*13+25/-^19%.19*15+@+30%.@11/+29/23--.@-^.4/++7%97--^0@.31/100*\31%)+

नमूना उपयोग:

$ golfscript.rb codegolf11132.gs <<<2013
20130331

ध्यान दें कि यह अधिकांश वर्तमान उत्तरों के लिए एक अलग एल्गोरिथ्म का उपयोग करता है। विशिष्ट होने के लिए, मैंने प्रश्न पर एक टिप्पणी में सीन चेशायर द्वारा लिंक किए गए संसाधन में लिचेंबर्ग को जिम्मेदार ठहराया एल्गोरिदम को अनुकूलित किया है ।

मूल एल्गोरिथ्म, समझदार प्रकार (यानी जावास्क्रिप्ट संख्या नहीं) और एक अनुकूलन के साथ महीने * 31 + दिन (0 का ऑफसेट दिन का उपयोग करके) देने के लिए है

K = Y/100
M = 15 + (3*K+3)/4 - (8*K+13)/25
S = 2 - (3*K+3)/4
A = Y%19
D = (19*A+M) % 30
R = (D + A/11)/29
OG = 21 + D - R
SZ = 7 - (Y + Y/4 + S) % 7
OE = 7 - (OG-SZ) % 7
return OG + OE + 92

मैंने एक सामान्य उपसंचाई निकाली और कम करने के लिए कुछ अन्य अनुकूलन किए

K = y/100
k = (3*K+3)/4
A = y%19
D = (19*A+15+k-(8*K+13)/25)%30
G = 23+D-(D+A/11)/29
return 97+G-(G+y+y/4-k)%7

इस दृष्टिकोण में अन्य एक (अल पेट्रोफ़्स्की के 20-ऑप एल्गोरिथ्म) की तुलना में थोड़ा अधिक अंकगणितीय ऑपरेशन हैं, लेकिन इसमें छोटे स्थिरांक हैं; GolfScript को अतिरिक्त कोष्ठकों के बारे में चिंता करने की आवश्यकता नहीं है क्योंकि यह स्टैक-आधारित है, और चूंकि मेरे अनुकूलित लेआउट में प्रत्येक मध्यवर्ती मान का उपयोग दो बार किया जाता है, यह पूरी तरह से स्टैक पर शीर्ष तीन वस्तुओं तक आसान पहुंच के GolfScript की सीमा के साथ फिट बैठता है।


यह एक छोटा सा मुद्दा है, जब ईस्टर की तारीख अप्रैल और अप्रैल की 10 वीं तारीख के बीच होती है, यह 1725041 जैसे तारीखें लौटती है, जब इसे 17250401 वापस करना चाहिए। लेकिन अलग दृष्टिकोण के लिए अपवित्र!
फोर्स

@ फोर्स, उफ़। अब तय हो गया।
पीटर टेलर

5

पायथन 2 - 125 120 119 चार्ट

यह फर्स का जवाब है बेशर्मी से अजगर के लिए रखी गई है।

y=input()
a=y/100*1483-y/400*2225+2613
b=(y%19*3510+a/25*319)/330%29
b=148-b-(y*5/4+a-b)%7
print(y*100+b/31)*100+b%31+1

संपादित करें : print"%d-0%d-%02d"%(y,b/31,b%31+1)5 वर्णों को बचाने के लिए अंतिम पंक्ति बदली गई । मैं के 10000रूप में प्रतिनिधित्व करने के लिए प्यार होता 1e4, लेकिन यह एक बिंदु की आवश्यकता होती है जो फ्लोटिंग पॉइंट का उत्पादन करेगा int

Edit2 : पीटर टेलर का धन्यवाद कि कैसे छुटकारा पाएं 10000और 1 चरित्र को बचाएं।


1
यदि आप अलग 10000हो जाते हैं 100*100तो अंतिम पंक्ति को हॉर्नर के रूप में डाल सकते हैं (y*100+b/31)*100+b%31+1। अग्रणी कोष्ठक आपको बाद में अंतरिक्ष को हटाने की अनुमति देता है print, और आप 100एक चर की कुल बचत के लिए एक चर के तीन उदाहरणों को बाहर निकाल सकते हैं ।
पीटर टेलर

@PeterTaylor: उत्कृष्ट सुझाव। मेरे उत्तर को अपडेट किया।
स्टीवन रंबलस्की

आप इसे एक फंक्शन बना सकते हैं e(y)और कुछ बाइट्स बचा सकते हैं
sagiksp

4

PHP 154

यदि मैं YYYYMMDD के बजाय YYYYMMDD पर स्विच करता हूं, तो 150 वर्ण।

<?$y=$argv[1];$a=$y/100|0;$b=$a>>2;$c=($y%19*351-~($b+$a*29.32+13.54)*31.9)/33%29|0;$d=56-$c-~($a-$b+$c-24-$y/.8)%7;echo$d>31?"$y-04-".($d-31):"$y-03-$d";

लाइन ब्रेक के साथ:

<?
$y = $argv[1];
$a = $y / 100 |0;
$b = $a >> 2;
$c = ($y % 19 * 351 - ~($b + $a * 29.32 + 13.54) * 31.9) / 33 % 29 |0;
$d = 56 - $c - ~($a - $b + $c - 24 - $y / .8) % 7;
echo $d > 31 ? "$y-04-".($d - 31) : "$y-03-$d";

उपयोग: php easter.php 1997
आउटपुट:1997-03-30

उपयोग: php easter.php 2001
आउटपुट:2001-04-15


1
महान एल्गोरिथ्म गोल्फ, इतना महान कोड गोल्फ नहीं। मुझे 18 बाइट्स से बाहर निकलने की आजादी <?=$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 के 1725-04-1बजाय यह आउटपुट देता है 1725-04-01
क्रिस्टोफ

4

dc: 106 अक्षर

?[0n]smdndsy100/1483*ly400/2225*-2613+dsa25/319*ly19%3510*+330/29%sb148lb-5ly*4/la+lb-7%-d31/0nn31%1+d9>mp

उपयोग:

> dc -e "?[0n]smdndsy100/1483*ly400/2225*-2613+dsa25/319*ly19%3510*+330/29%sb148lb-5ly*4/la+lb-7%-d31/0nn31%1+d9>mp"
1725
17250401
>

यह सभी भारों और दुकानों के बजाय 'd' और 'r' का उपयोग करके छोटा किया जाना चाहिए।


3

C: 151 148 वर्ण

y;a;b;main(){scanf("%d",&y);a=y/100*1483-y/400*2225+2613;b=(y%19*3510+a/25*319)/330%29;b=148-b-(y*5/4+a-b)%7;printf("%d-0%d-%02d\n",y,b/31,b%31+1);}

और एक ही कोड, लेकिन बेहतर स्वरूपित:

#include <stdio.h>

int y, a, b;

int main() {
    scanf("%d", &y);

    a = y/100*1483 - y/400*2225 + 2613;
    b = (y%19*3510 + a/25*319)/330%29;
    b = 148 - b - (y*5/4 + a - b)%7;

    printf("%d-0%d-%02d\n", y, b/31, b%31 + 1);
}

ईस्टर की तारीख की गणना के लिए भयावह रूप से कई एल्गोरिदम हैं, लेकिन उनमें से कुछ कोड गोल्फ के लिए अच्छी तरह से अनुकूल हैं।


3

जावास्क्रिप्ट 162 156 145

function e(y){alert(y+"0"+((d=56-(c=(y%19*351-~((b=(a=y/100|0)>>2)+a*29.32+13.54)*31.9)/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))}

@ Jdstankosky के PHP समाधान से प्रेरित ... YYYYMMDD परिणाम प्रदान करता है ...

अब नीचे संकुचित:

alert((y=prompt())+0+((d=56-(c=(y%19*351-~((b=(a=y/100|0)>>2)+a*29.32+13.54)*31.9)/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))

अब इनपुट के लिए पूछता है ... "0" के शाब्दिक स्ट्रिंग को घटाकर 0 कर दें और अपने लाभ के लिए ढीले टाइपिंग कार्य करें! :)

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)


2

एपीएल 132

यह एल्गोरिदम उन दिनों की संख्या की गणना करता है जो ईस्टर मार्च की शुरुआत के सापेक्ष आते हैं। प्रश्न में अनुमति के अनुसार YYYYMMDD प्रारूप में तारीख वापस आ गई है:

E y                                                   
(a b)←⌊((3 8×⌊y÷100)+¯5 13)÷4 25                           
c←7|y+(⌊y÷4)-a-e←⌊d-((19×d←30|(227-(11×c)-a-b))+c←19|y)÷543
+/(10*4 2 0)×y,(3+i>31),(61⍴⍳31)[i←e+28-c] 

मूल परीक्षण मामलों को लेना:

      E 2013
20130331
      E 1583
15830410
      E 3029
30290322
      E 1789
17890412         

0

फोरट्रान (GFortran) , 179 बाइट्स

READ*,I
J=I/100*2967-I/400*8875+7961
K=MOD(MOD(I,19)*6060+(MOD(MOD(J/25,59),30)+23)*319-1,9570)/330
L=K+28-MOD(I*5/4+J+K,7)
WRITE(*,'(I7,I0.2,I0.2)')I,(L-1)/31+3,MOD(L-1,31)+1
END

इसे ऑनलाइन आज़माएं!

दूसरे संसाधन लिंक से "एमेज़्ड ग्रेगोरियन ईस्टर" एल्गोरिथम (अल पेट्रोफ़्स्की) का उपयोग करता है। अजीब तरह से, यह वर्ष 5701583 के लिए विफल रहता है (और, जाहिर है, केवल इस वर्ष के लिए), एक सप्ताह पहले ईस्टर की भविष्यवाणी करते हुए। YYYYYYYMMDDप्रारूप में तारीख को प्रिंट करता है , कुछ प्रमुख स्थानों के साथ यदि वर्ष कम है तो सात अंक।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.