রোলওভার ক্যালেন্ডার


17

এটি স্যান্ডবক্সে ডাওনগোটের একটি প্রশ্ন দ্বারা অনুপ্রাণিত, যেখানে আমি প্রস্তাব দিয়েছিলাম যে তিনি যে দিন / মাসের ফর্ম্যাট ব্যবহার করেন তাদের 31 শে এপ্রিলকে পাই দিবস হিসাবে অন্তর্ভুক্ত করা উচিত, কেবল তার জন্যই আমাকে জানান যে 31 এপ্রিল নেই!

মাস / দিনের বিন্যাসে একটি তারিখের স্ট্রিং দেওয়া হয়েছে যা অবৈধ হতে পারে, রোলওভার ব্যবহার করে সঠিক তারিখটি আউটপুট দেয়। (প্রথম মাসে রোলওভার করুন, তারপরে দিনটি রোলওভার করুন)।

উদাহরণ:

"15/43" - এটি 15 তম মাসের 43 তম দিন হিসাবে পড়ে। প্রথমত, আমরা পরের বছর মাস জুড়ে রোল করি, সুতরাং আমরা 3 (মার্চ) দিয়ে শেষ করব। এখন, মার্চের মাত্র 31 দিন রয়েছে, আমরা এপ্রিল পর্যন্ত অতিরিক্ত দিনগুলি রোলওভার করি, তাই আমরা আসল তারিখটিকে "4/12" (12 এপ্রিল) হিসাবে আউটপুট করি ।

"3/16" - এটি একটি বৈধ তারিখ (16 ই মার্চ)। এটি যেমন ফেরত দিন

"১২/6464" - আহা, December৪ শে ডিসেম্বর থেকে অনেক স্মৃত স্মৃতি ... ডিসেম্বরের ৩১ দিন রয়েছে, জানুয়ারিতে ৩১ দিন রয়েছে, তাই আমার সত্যিকার অর্থে যা বোঝাতে চাইছে তা হল "২/২" (২ রা ফেব্রুয়ারি)।

"19/99" - প্রথমত, 19 টি 7 (জুলাই) হয়ে যায়। জুলাইয়ের 31 দিন রয়েছে, আগস্টে 31 দিন রয়েছে, সেপ্টেম্বরে 30 দিন রয়েছে, সুতরাং আউটপুট "10/7" (October ই অক্টোবর)।

"1/99999" - এক বছরে 365 দিন থাকে। 99999 (মোড 365) = 354. বছরের 354 দিন "12/20"

"9999999/10" - দৃশ্যত, 9999999 (মোড 12) = 3, সুতরাং এটি "3/10" (10 ই মার্চ)।

নির্ণায়ক:

ইনপুট মাসটি একটি পূর্ণসংখ্যা> ০. ইনপুট দিনটি একটি পূর্ণসংখ্যক> ০ বছর কখনই নির্দিষ্ট করা দরকার না, কারণ এর সাথে লেনদেন করার জন্য কোনও লিপ বছর নেই।

হালনাগাদ:

যেহেতু আমি মনে করি এটি চ্যালেঞ্জকে অত্যধিক সরল করবে, জাভা ক্যালেন্ডার শ্রেণীর মতো ক্যালেন্ডার ফাংশনগুলি নিষিদ্ধ করা হয়েছে। তারিখ বিশ্লেষণ / ফর্ম্যাটিং ফাংশনগুলি এখনও অনুমোদিত।



1
আরও একটি গুরুত্বপূর্ণ পরীক্ষার ক্ষেত্রে 8 বছরেরও বেশি সময় কাটাতে পর্যাপ্ত দিন থাকবে, যেমন উত্তরগুলি অন্তর্নির্মিত উত্তরগুলি লিপ বছরগুলি ব্যবহার করে সেই বিল্ট-ইনগুলিতে মনোযোগ দিতে হবে।
মার্টিন এন্ডার

ওহ, যে উত্তর দেয় ... আমি একটি গণিত উত্তর পোস্ট করতে যাচ্ছি যা একটি অন্তর্নির্মিত ব্যবহার করে। : /
মার্টিন ইন্ডার

@ মার্টিন এর জন্য দুঃখিত;)।
জিওকাভেল

রেফারেন্সের জন্য, গাণিতিক সমাধানটি 90 বাইট দীর্ঘ ছিল (যদিও এটি স্ট্রিং প্রক্রিয়াজাতকরণের মাধ্যমে ব্যাপকভাবে প্রাধান্য পেয়েছিল)। তবুও আপনি যদি এই জাতীয় পরীক্ষার কেস যুক্ত করতে চান,1/99999 উত্পাদ উচিত 12/19আমি মনে করি।
মার্টিন ইন্ডার

উত্তর:


11

সেটা দ্রুত ছিল.
অ্যাডিসন ক্র্যাম্প

আপনি কি আমাকে নিশ্চিত করতে পারেন যে এখানে কোনও ক্যালেন্ডার ফাংশন ব্যবহার করা হয়নি?
জিওকাভেল

ল্যাবভিউ সম্পর্কে ভাল বিষয়টি হ'ল মূলত যা দেখতে দেখতে লাগে তাই। প্রথম জিনিসটি স্ট্রিং 2 টি মডিউল থেকে সংখ্যা স্ক্যান করে, বাক্সটি একটি স্যুইচ কেস স্ট্রাকচার যা 28,30 বা 31 দেয় এবং তারপরে আবার স্ট্রিং হিসাবে একসাথে রাখা হয়।
ইউয়েমেল

4

সি #, 269 223

string v(string n){var x=new[]{31,28,31,30,31,30,31,31,30,31,30,31};var s=n.Split('/');Func<string,int> p=int.Parse;var m=p(s[0]);var d=p(s[1]);m=m>=12?m%12:m;while(d>x[m]){d-=x[m];m=++m>=12?m%12:m;}return(m==0?1:m)+"/"+d;}

সম্পাদনা করুন : 24/1, 36/1, ইত্যাদির মতো ক্ষেত্রে কাজ করার জন্য স্থির এবং কিছুটা গল্ফ করেছে। মন্তব্যের জন্য ধন্যবাদ, বেশ কয়েকটি জায়গা আমি কিছুটা সংরক্ষণ করেছি!

Ungolfed:

string v(string n)
{
    var x = new [] { 31 ,28, 31, 30, 31, 30,31, 31, 30, 31, 30, 31 };

    var s = n.Split('/');
    Func<string,int> p = int.Parse;
    var m = p(s[0]);
    var d = p(s[1]);
    m = m >= 12 ? m % 12 : m;
    while (d > x[m])
    {
        d -= x[m];
        m = ++m >= 12 ? m % 12 : m;
    }
    return (m==0?1:m) + "/" + d;
}

সবার আগে: সম্প্রদায়টিতে আপনাকে স্বাগতম! আমি অনুমান করব আপনি অভিধানটি একটি লুপে বরাদ্দ করে বা একটি স্যুইচ ফাংশন (যদিও এখানে কোনও সি # প্রো নেই) ব্যবহার করে কিছু বাইট সংরক্ষণ করতে পারবেন। সরাসরি printingm + "/" + d´ মুদ্রণ করা কিছুটা সাহায্য করতে পারে। এবং সর্বশেষে (এটি সম্ভবত কাজ করতে পারে না) আর্গুমেন্টগুলিতে স্ট্রিংয়ের পরিবর্তে চর * ব্যবহার করে।
ইউমেল

এটি নির্দিষ্ট পরীক্ষার ক্ষেত্রে ব্যর্থ হয়, যেমন 24/1
LegionMammal978

ইমেল ধন্যবাদ! সরাসরি মুদ্রণ ব্যবহার করে Console.Writeযা বেশি return, এবং সি # তে আমি এর char[]প্রতিস্থাপন হিসাবে ব্যবহার করব string, তবে এটি একই পরিমাণ অক্ষর, এবং /আরও সমস্যাযুক্তকে বিভক্ত করে তোলে । কিন্তু, অভিধানে আপনার নোটটি আমাকে আরও ভাল সংস্করণে নিয়ে গেছে!
ড্রিউজর্ডান

4

আর, 208 182 বাইট

m=c(31,28,31,30,31,30,31,31,30,31,30,31)
e=scan(sep="/");n=(e[1]/12-1)*12;if(!n%%12)n=12;if(n<0)n=e[1];j=e[2];while((j<-j-m[n])>0){n=n+1;if(n>12)n=1};j=m[n]+j;cat(n,j,sep="/")

আপনি 12 টি দিয়ে ভাগ করে মাসটি পান, তারপরে লুপ করুন, চলতি মাসের দিনগুলির সংখ্যা সরিয়ে আপনি যতক্ষণ না নেতিবাচক সংখ্যা পাবেন,, বিপরীত শেষ পদক্ষেপ এবং মুদ্রণ করুন।

একাধিক লাইনে (একটি ফাইল ব্যবহার এবং এটি উত্স প্রয়োজন):

m=c(31,28,31,30,31,30,31,31,30,31,30,31)
e=scan(sep="/")
n=(e[1]/12-1)*12
if(!n%%12)n=12
if(n<0)n=e[1]
j=e[2]
while((j<-j-m[n])>0){n=n+1;if(n>12)n=1}
j=m[n]+j;cat(n,j,sep="/")

আর তে আপনার প্রোগ্রামটি চালানোর চেষ্টা করার সময় আমি এই বার্তাটি পেয়েছি: পেস্টবিন.
com

আজব আমি পরে আবার
যাচাই

আমি এই বার্তা পেয়েছি। আপনার প্রোগ্রামটি কয়েক মাস ধরে সমস্যা বলে মনে হচ্ছে। অন্যথায় এটি চলছে। পেস্টবিন.
com

সাহায্য করার জন্য ধন্যবাদ. আমি আসলে রাস্তায় আছি, আমি এটি সংশোধন করব
তেনসিবাই

1
@ তেনসিবাই হ্যাঁ আপনি ঠিক বলেছেন, আমার খারাপ (আমার মনে রাখা উচিত ছিল যে ত্রুটি বার্তাটি বলে যে এটি "বাস্তব" প্রত্যাশা করে)।
প্ল্যানাপাস

3

পিএইচপি> = 5.5, 181 বাইট

list($m,$d)=explode("/",$argv[1]);$m%=12;$d%=365;$i=0;while($d>100)$d-=[31,28,31,30,31,30,31,31,30,31,30,31][$i++];$m+=$i;echo date_create_from_format("m/d","$m/$d")->format("n/j");

পিএইচপি প্রায় একা ডেট পার্সিং এবং ফর্ম্যাট করার নির্দেশাবলী সহ রোলওভার সমর্থন করে। উদাহরণ স্বরূপ:

echo date_create_from_format("m/d","12/64")->format("n/j"); // Output: 2/2

তবে, একবারে সংখ্যাটি 100 এর চেয়ে বড় হয়ে গেলে, পিএইচপি এটি বিশ্লেষণকে প্রত্যাখ্যান করে এবং একটি ত্রুটি প্রদান করে (সম্ভবত কিছু স্বেচ্ছাচারী কারণে)। সুতরাং, এই উত্তর সহ তত্ত্বটি পিএইচপি যেখানে এটি বিশ্লেষণ করবে সেখানে ফিরে আসার পরে এটি জমা দিনdate_create_from_format()

Ungolfed:

list($month, $day) = explode("/", $argv[1]);
$month = $month % 12;
$day = $day % 365;
$i = 0;
$days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
while($day > 31) $day -= $days[$i++];
$month += $i;
echo DateTime::createFromFormat("m/d", $month . "/" . $day)->format("n/j");

এটি অনলাইনে চেষ্টা করুন


1
আপনাকে আমাকে তারিখের স্ট্রিং ইনপুট করার একটি উপায় প্রদান করতে হবে, বা এটি একটি ফাংশন করতে হবে।
জিওকাভেল

পিএইচপি-তে কোনও ইনপুট পদ্ধতি হিসাবে GET পরামিতি গ্রহণযোগ্য নয় । আপনাকে হয় $argvএটির একটি ফাংশন তৈরি করতে হবে এবং ফাংশন প্যারামিটার হিসাবে ইনপুটটি পাস করতে হবে, বা এসডিডিএন থেকে ইনপুট নেওয়া হবে।
মেগো

@ মেগো জিজে, আমাকে আমার উত্তরটি আপডেট করার জন্য কিছু সময় দিন যেহেতু ওপি ইনপুটটির জন্য কোনও প্রয়োজনীয়তা বর্ণনা করে না - এটি পরিবর্তন $tকরা যথেষ্ট সহজ $argv[1]এবং এখন এটি কমান্ড লাইন ইনপুট থেকে পড়ে।
নিক

ইনপুট জন্য ওপেন স্ট্যাটিং প্রয়োজনীয়তা অপ্রাসঙ্গিক; আমাদের ডিফল্ট গ্রহণযোগ্য I / O পদ্ধতিগুলির একটি তালিকা রয়েছে (যা আমি সংযুক্ত করেছি) যাতে চ্যালেঞ্জ লেখকরা প্রতিটি চ্যালেঞ্জের ক্ষেত্রে তাদের নির্দিষ্ট না করে।
মেগো

2

জাভাস্ক্রিপ্ট (ES6), 106 বাইট

s=>eval('q="030101001010";p=s.split`/`;for(d=i=p[1],m=p[0]-1;i--;d>n&&(m++,d-=n))n=31-q[m%=12];m+1+"/"+d')

ব্যাখ্যা

s=>
  eval(`              // use eval to enable for loop without needing to write {} or return
    q="030101001010"; // q = array of 31 - days in each month
    p=s.split\`/\`;   // p = array of [ month, day ]
    for(
      d=i=p[1],       // d = day
        m=p[0]-1;     // m = month - 1
      i--;            // loop for each day, this is more iterations than needed but extra
                      //     iterations do not affect the result and it's the shortest way
                      //     to guarantee all months have been subtracted from d, it also
                      //     ensures the loop runs at least once to get m % 12
      d>n&&(m++,d-=n) // if too many days, subtract the month's days and increment month
    )
      n=31-q[m%=12];  // n = number of days in month, get m % 12
    m+1+"/"+d         // return the result
  `)

পরীক্ষা


1

প্রতিযোগিতামূলক উত্তর - বাশ + কোর্টিলস, 55

date -d1-$[(${1%/*}-1)%12+1]-1+$[${1#*/}-1]day +%-m/%-d

"তারিখ পার্সিং / ফর্ম্যাটিং ফাংশনগুলি এখনও অনুমোদিত তবে" - আমি ধরে নিই এর অর্থ এটিdate ইউটিলিটি অনুমোদিত।

কমান্ড লাইন থেকে ইনপুট পড়া হয়, যেমন:

$ ./rollovercal.sh 15/43
4/12
$ 

এটি প্রতিযোগিতামূলক নয় কারণ ডেট কমান্ডটি এরকম কিছুতে প্রসারিত হয় যা বেশ কয়েকটি দিন যুক্ত করছে:

date -d1-3-1+42day +%-m/%-d

date.add(875)875 দিনের মধ্যে তারিখটি বাড়ানোর মতো কোনও কাজ না করা পর্যন্ত এটি অনুমোদিত । বেশিরভাগ ক্ষেত্রেই আমি যাচ্ছিলাম।
জিওকাভেল

@ জোকাভেল ওহ, আমি দেখছি সম্পূর্ণরূপে বর্ধিত dateকমান্ডটি এখানে date -d1-3-1+42day +%-m/%-d, তাই এটি ঠিক এটি করছে। আমি অনুমান করি যে এটি তখন একটি প্রতিদ্বন্দ্বিতামূলক উত্তর :(
ডিজিটাল ট্রমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.