তারিখ ঘটনা


9

তিনটি অ-নেতিবাচক পূর্ণসংখ্যা প্রদান করা হয়েছে y, mএবং d(যার মধ্যে কমপক্ষে একটি ইতিবাচক হতে হবে) এবং একটি ইতিবাচক বছর সহ একটি বৈধ তারিখ (যে কোনও যুক্তিসঙ্গত বিন্যাসে বছর, মাস এবং দিন অন্তর্ভুক্ত রয়েছে এবং কোনও অতিরিক্ত তথ্য নেই), আউটপুট আউটপুট তারিখটি yবছর, mমাস এবং dমূল তারিখের পরের দিন।

গ্রেগরিয়ান ক্যালেন্ডারটি সমস্ত তারিখের জন্য ব্যবহার করতে হয় (গ্রেগরিয়ান ক্যালেন্ডার গ্রহণের আগেও তারিখ)।

পরের তারিখের গণনার পদ্ধতিটি নিম্নরূপ:

  1. yবছর যোগ করুন
  2. mমাসে যোগ করুন
  3. রোলওভার প্রয়োগ করে তারিখটি সাধারণ করুন (যেমন 2018-13-01-> 2019-01-01)
  4. যদি দিনটি মাসের শেষ দিনটি অতীত হয় তবে এটি মাসের শেষ দিনটিতে পরিবর্তন করুন (উদা 2018-02-30-> 2018-02-28)
  5. যোগ dদিন
  6. রোলওভার প্রয়োগ করে তারিখটি সাধারণ করুন (যেমন 2019-01-32-> 2019-02-01)

লিপ বছর (4 বছর দ্বারা বিভাজ্য বছর, তবে 100 দ্বারা বিভাজ্য নয় যদি না 400 দ্বারা বিভাজ্যও হয়) যথাযথভাবে পরিচালনা করতে হবে। সমস্ত ইনপুট এবং আউটপুটগুলি আপনার ভাষার প্রতিনিধিত্বমূলক পূর্ণসংখ্যার ব্যাপ্তির মধ্যে থাকবে।

পরীক্ষার কেস

পরীক্ষার কেসগুলি ফর্ম্যাটটিতে সরবরাহ করা হয় input => output, যেখানে inputএকটি জেএসওএন অবজেক্ট।

{"date":"2018-01-01","add":{"d":1}} => 2018-01-02
{"date":"2018-01-01","add":{"M":1}} => 2018-02-01
{"date":"2018-01-01","add":{"Y":1}} => 2019-01-01
{"date":"2018-01-30","add":{"M":1}} => 2018-02-28
{"date":"2018-01-30","add":{"M":2}} => 2018-03-30
{"date":"2000-02-29","add":{"Y":1}} => 2001-02-28
{"date":"2000-02-29","add":{"Y":4}} => 2004-02-29
{"date":"2000-01-30","add":{"d":2}} => 2000-02-01
{"date":"2018-01-01","add":{"Y":2,"M":3,"d":4}} => 2020-04-05
{"date":"2018-01-01","add":{"Y":5,"M":15,"d":40}} => 2024-05-11

আপনি এই জেএসফিডেলটি পরীক্ষার জন্য ব্যবহার করতে পারেন ।

এই , সুতরাং সংক্ষিপ্ততম সমাধান (প্রতিটি ভাষায়) জিতেছে।



2
@ লুইসফেলিপডিজেসাস মুনোজ ইনপুট ফর্ম্যাটটি গুরুত্বপূর্ণ নয়, যেমনটি এখানে পিপিসিজির নিয়ম।
মেগো

সেখানে উপরের সীমা কোনো সীমাবদ্ধতা নেই y, mএবং d(যেমন পারে d2147483000 হতে?)
ErikF

@ এরিকএফAll inputs and outputs will be within the representable integer range of your language.
মেগো

1
আউটপুট ফর্ম্যাট সম্পর্কে কি? আমরা কি একটি তারিখ অবজেক্ট আউটপুট করতে পারি? আমরা কি একটি তারিখ অবজেক্ট নিতে পারি?
অসোন তুহিদ

উত্তর:


3

সি (জিসিসি) , 291 বাইট

জেএস বিল্টিনের মতো একই মানগুলি ফেরত পেতে এই একটি বেশ মজাদার ছিল।

z,m=0xEEFBB3;int*y;g(){z=28+(m>>y[1]*2&3)+!(y[1]-1)*(!(*y%4)&&(*y%100)||!(*y%400));}h(a){z=(a>g())?g():a;}j(){*y+=y[1]/12;y[1]%=12;y[2]=h(y[2]);}f(int*a){y=a+6;for(z=0;z<3;z++)y[z]=a[z];y[1]--;j();*y+=a[3];y[1]+=a[4];j();y[2]+=a[5];for(;y[2]>h(y[2]);(y[1]=++y[1]%12)||++*y)y[2]-=g();y[1]++;}

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

আন golfed:

// De No Oc Se Au Jl Jn Ma Ap Mr Fe Ja
// 31 30 31 30 31 31 30 31 30 31 28 31 = Month length
// 11 10 11 10 11 11 10 11 10 11 00 11 = Offset (2-bit representation)
//   E     E     F     B     B     3   = Hex representation

int m=0xEEFBB3; // Month lengths-28 in reverse order, stored as 2 bits/month
int *y; // Pointer to the output date, shared as a global between calls

// Regenerate month length and add leap day
int days_month(void) { 
  return 28+(m>>y[1]*2&3)+!(y[1]-1)*(!(*y%4)&&(*y%100)||!(*y%400));
}

int calendar_day(int day) { return day>days_month()?days_month():day; }

void truncate_date(void) {
  *y+=y[1]/12; y[1]%=12;
  y[2]=calendar_day(y[2]);
}

void f(int *a) {
  int z;
  y=a+6;
  for(z=0;z<3;z++)y[z]=a[z];y[1]--; // Convert month to 0-based
  truncate_date();
  *y+=a[3]; y[1]+=a[4]; truncate_date();
  y[2]+=a[5];
  for(;y[2]>calendar_day(y[2]);(y[1]=++y[1]%12)||++*y)
    y[2]-=days_month();
  y[1]++; // Return month to 1-based
}

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



1

পার্ল -এমডিট :: ক্যালক =: সমস্ত-ই, 28 বাইট

$,=$";say Add_Delta_YMD@ARGV

এটিতে 6 টি আর্গুমেন্ট লাগে: ইনপুট বছর, মাস এবং তারিখ (পৃথক যুক্তি হিসাবে), এবং যোগ করার জন্য বছর, মাস এবং দিনগুলির সংখ্যা।


2
এটি কাজটির উদ্দীপনা "নিয়ম 4" এর সাথে মোকাবেলা করে না, সুতরাং পরীক্ষার কয়েকটি ক্ষেত্রে ব্যর্থ হয় - যেমন, ওপি প্রত্যাশার পরিবর্তে perl -MDate::Calc=:all -E '$,=$";say Add_Delta_YMD@ARGV' -- 2000 2 29 1 0 0রিটার্ন দেয় (পরীক্ষার কেস 6)। 2001 3 12001 2 28
সূন্দর - মনিকা

1

আর , 88 বাইট

function(Y,M,D,y,m,d,o=M+m){while(is.na(x<-ISOdate(Y+y+o%/%12,o%%12,D)))D=D-1;x+864e2*d}

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

একটি ফাংশন যা Y,M,Dতারিখের জন্য 3 টি আর্গুমেন্ট ( ) এবং অন্যান্য 3 টি আর্গুমেন্ট ( y,m,d) যুক্ত করে takes

আউটপুট আগে লেখা দিয়ে আসে 12:00:00 GMT, যার জন্য ডিফল্ট ফরম্যাট ISOdateএর


1

পার্ল 6 ,  60 50 45  44 বাইট

{Date.new($^a).later(:$:year).later(:$:month).later(:$:day)}

এটি পরীক্ষা করুন (60)
ইনপুট হয়( "2000-02-29", year => 1, month => 0, day => 0 )


{$^a.later(:$:year).later(:$:month).later(:$:day)}

এটি পরীক্ষা করুন (50)
ইনপুট হয়( Date.new("2000-02-29"), year => 1, month => 0, day => 0 )


{$/=$^a;$/.=later(|$_) for |[R,] $^b.sort;$/}

এটি পরীক্ষা করুন (45)
ইনপুটটি ( Date.new("2000-02-29"), %( year => 1 ) )
(0 মানের সাথে কীগুলি অন্তর্ভুক্ত করার দরকার নেই)


{$/=$^a;$/.=later(|$_) for |[R,] %_.sort;$/}

এটি পরীক্ষা (44)
ইনপুট হয়( Date.new("2000-02-29"), year => 1 )

সম্প্রসারিত:

{  # bare block lambda

  $/ = $^a; # store only positional param into a modifiable scalar
            # (params are readonly by default)


  # do a loop over the data to add

  $/ .= later(    # add using Date.later()
    |$_           # turn current iterated Pair into a named parameter
  )

    for

      |           # flatten so that `for` will iterate

        [R,]      # shorter than `reverse` (year=>1, month=>0, day=>0)

          %_.sort # sort the named arguments (day=>0, month=>0, year=>1)
  ;

  # return new Date
  $/
}

আপনি for
জো


1

জাভা 8, 51 বাইট

(s,y,m,d)->s.plusYears(y).plusMonths(m).plusDays(d)

ইনপুট ( s) এবং আউটপুট উভয়ই java.time.LocalDate

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

ব্যাখ্যা:

(s,y,m,d)->        // Method with LocalDate and 3 int parameters and LocalDate return-type
  s.plusYears(y)   //  Add the years to the input start-Date
   .plusMonths(m)  //  Add the months as well
   .plusDays(d)    //  And add the days as well

1

আর , 65 বাইট

function(x,y){require(lubridate)
x%m+%period(y,c("ye","mo","d"))}

lubridateপ্যাকেজ ব্যবহার করে । %m+%পোতা অপারেটর জন্য চিনি নেই add_with_rollbackফাংশন যা মূলত প্রয়োগ কি প্রশ্ন জন্য অনুরোধ।

টিআইওর তেমন নেই lubridateযাতে আপনি পরীক্ষার কেসগুলির সাথে উপরের ফাংশনটিতে আরও চাপ দিয়ে পরিবর্তে এখানে চেষ্টা করে দেখতে পারেন f <-:

f(as.Date("2018-01-01"),c(0,0,1))
f(as.Date("2018-01-01"),c(0,1,0))
f(as.Date("2018-01-01"),c(1,0,0))
f(as.Date("2018-01-30"),c(0,1,0))
f(as.Date("2018-01-30"),c(0,2,0))
f(as.Date("2000-02-29"),c(1,0,0))
f(as.Date("2000-02-29"),c(4,0,0))
f(as.Date("2000-01-30"),c(0,0,2))
f(as.Date("2018-01-01"),c(2,3,4))
f(as.Date("2018-01-01"),c(5,15,40))

আপনি এতে দুটি বাইট সংরক্ষণ করতে পারবেন: function(x,y)x%m+%period(y,c("ye","mo","d")) require(lubridate)(ফাংশনটির
আউটসাইড

0

বাশ , 150 149 বাইট

a=$2+$5-1+b
y=$1+$4+a/12
m=1+a%12
d=date
$d -d@$[$($d +%s+$6*86400 -d$[y]-$[m]-$($d +$3%n%d -d@$[`b=1;$d +%s-86400 -d$[y]-$[m]-1`]|sort -n|head -1))]

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

কমান্ড লাইন আর্গুমেন্টের মাধ্যমে ইনপুট নেয়: পুরানো বছর, পুরানো মাস, পুরানো দিন। বছর পরিবর্তন, মাস পরিবর্তন, দিন পরিবর্তন। স্ট্রাউড মত স্ট্রিং আউটপুট Wed Feb 28 00:00:00 UTC 2018


0

পিএইচপি , 203 বাইট

<?list(,$a,$y,$m,$d)=$argv;$b=new DateTime($a);$j=$b->format('j');$b->modify("+$y year +$m month");$j==$b->format('j')?:$b->modify('last day of last month');$b->modify("+$d day");echo$b->format('Y-m-d');

এটি চালানোর জন্য:

php -n <filename> <date> <y> <m> <d>

উদাহরণ:

php -n date_occurrences.php 2018-01-01 5 15 40

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

পরীক্ষা: এটি অনলাইনে চেষ্টা করে দেখুন!


0

টি-এসকিউএল, 53 বাইট

SELECT DATEADD(D,d,DATEADD(M,m,DATEADD(Y,y,a)))FROM t

আমি নিশ্চিত যে এটি গুরুত্বপূর্ণ নয়, তবে আমি বছরের সামঞ্জস্যতাটি প্রয়োগ করছি, তারপরে মাসের সমন্বয় এবং দিবসটি অনুসরণ করব। সমস্ত পরীক্ষার মান পরীক্ষা করে দেখুন।

আমাদের আই মান অনুযায়ী , ইনপুট পূর্ব বিদ্যমান টেবিল থেকে নেওয়া হয় T তারিখ ক্ষেত্র একটি এবং পূর্ণসংখ্যা ক্ষেত্র Y , মি , এবং

আকর্ষণীয়ভাবে লক্ষ করুন যে এটি মূলধনের নয় যে তারিখের ধরণের কোড ( ডি , এম , এবং ওয়াই ) এবং আমার ইনপুট মানগুলির ( ডি , মি , এবং ওয়াই ) এর মধ্যে এটি এসকিউএল DATEADDফাংশনে কেবল প্যারামিটারের ক্রম ।


1
এই পাসের পরীক্ষায় কেস হয় 6? যেহেতু এটি বিধি 4 বাস্তবায়ন করে না, তাই আমি মনে করি এটি ইনপুট 6 এর 2001 3 1পরিবর্তে দিতে চাই2001 2 28
সূন্দর - মনিকা পুনরায় ইনস্টল করুন

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