ইস্টার এর তারিখ গণনা করুন


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

ইস্টারটির তারিখ ফিরিয়ে দেওয়ার জন্য অন্তর্নির্মিত ফাংশনগুলির ব্যবহার বিরক্তিকর এবং তাই এটিকে মঞ্জুরিপ্রাপ্ত নয়। সংক্ষিপ্ত উত্তর (অক্ষরগুলিতে) জিতেছে।

সম্পদ:


আপনি কি বুঝতে পেরেছেন যে কিছু ভাষার এটি করার জন্য একটি অন্তর্নির্মিত ফাংশন রয়েছে?
পিটার টেলর

যেমন? আমি কেবল অবগত যে পিএইচপি, তবে ইস্টার_ডেট এবং ইস্টার_ডেস ফাংশনগুলি বেশ সীমাবদ্ধ, ইস্টার_ডেট কেবল ১৯ 1970০ এর পরে বছর ধরে কাজ করে এবং ইস্টার_ডেসগুলি 1753 এর আগের বছরের জন্য সঠিক পরিমাণে ফেরত দেয় না But তবে আমি প্রশ্নটি সম্পাদনা করব এই জাতীয় ফাংশন ব্যবহার নিষিদ্ধ করা।
Fors


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-অপার অ্যালগরিদম), তবে এটির সামান্য ধ্রুবক রয়েছে; গল্ফস্ক্রিপ্টকে অতিরিক্ত বন্ধনী সম্পর্কে উদ্বিগ্ন হওয়ার দরকার নেই কারণ এটি স্ট্যাক-ভিত্তিক, এবং আমার অনুকূলিত লেআউটে প্রতিটি মধ্যবর্তী মানটি স্ট্যাকের উপরের তিনটি আইটেমে সহজেই অ্যাক্সেসের গল্ফস্ক্রিপ্টের সীমাবদ্ধতার সাথে যথাযথভাবে ফিট হয়।


এটি একটি ছোট সমস্যা রয়েছে, যখন ইস্টারের তারিখটি এপ্রিলের প্রথম থেকে এপ্রিলের 10 তারিখের মধ্যে থাকে তখন এটি 1725041 এর মতো তারিখগুলি ফেরত পাঠায়, যখন এটি 17250401 ফিরে আসবে But তবে ভিন্ন পদ্ধতির জন্য উত্সাহিত!
Fors

@ ফারস, উফ! এখন স্থির।
পিটার টেলর

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

সম্পাদনা 2 : কীভাবে এর থেকে মুক্তি পাবেন 10000এবং 1 টি অক্ষর সংরক্ষণ করবেন তা দেখানোর জন্য পিটার টেলরকে ধন্যবাদ ।


1
আপনি বিভক্ত তাহলে 10000পর্যন্ত 100*100আপনি Horner এর ফর্ম মধ্যে শেষ লাইনটি লাগাতে পারেন (y*100+b/31)*100+b%31+1। নেতৃস্থানীয় প্রথম বন্ধনী আপনাকে স্থান সরিয়ে দেওয়ার পরে অনুমতি দেয় printএবং আপনি 1001 চরের সামগ্রিক সাশ্রয়ের জন্য একটি পরিবর্তনশীলের তিনটি উদাহরণ বের করতে পারেন ।
পিটার টেলর

@ পিটারটেলর: দুর্দান্ত পরামর্শ। আমার উত্তর আপডেট।
স্টিভেন রাম্বালস্কি

আপনি এটিকে একটি ফাংশন করতে e(y)এবং কয়েকটি বাইট সংরক্ষণ করতে পারেন
sagiksp

4

পিএইচপি 154

আমি যদি YYYY-MM-DD এর পরিবর্তে YYYYMMMMD তে স্যুইচ করি তবে 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

ডিসি: 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
>

এটি সমস্ত লোড এবং স্টোরের পরিবর্তে 'ডি' এবং 'আর' ব্যবহার করে সংক্ষিপ্ত করতে সক্ষম হওয়া উচিত।


3

সি: 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);
}

ইস্টের তারিখ গণনা করার জন্য ভয়াবহভাবে অনেক অ্যালগরিদম রয়েছে তবে তাদের মধ্যে কয়েকটি মাত্র কোড গল্ফিংয়ের জন্য উপযুক্ত for


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 এর পিএইচপি সমাধান দ্বারা অনুপ্রাণিত ... ওয়াইওয়াইওয়াইএমএমডিডি ফলাফল সরবরাহ করে ...

এখন সংকুচিত এটিকে:

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

এই অ্যালগরিদম মার্চ শুরুর তুলনায় ইস্টার পড়ে থাকা দিনের সংখ্যা গণনা করে। প্রশ্নটিতে অনুমতি অনুসারে তারিখটি ওয়াইওয়াইওয়াইএমএমডিডি ফর্ম্যাটে ফেরত দেওয়া হয়েছে:

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

ফোর্টরান (জিএফোর্টরান) , 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ফর্ম্যাটে তারিখটি মুদ্রণ করে , কিছু নেতৃস্থানীয় স্পেস সহ যদি বছরের কম হয় তবে সাতটি সংখ্যা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.