दिनांक घटनाएँ


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, जहां inputJSON ऑब्जेक्ट है।

{"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

आप परीक्षण के लिए इस JSFiddle का उपयोग कर सकते हैं ।

ये है , इसलिए सबसे छोटा समाधान (प्रत्येक भाषा में) जीतता है।



2
@LuisfelipeDejesusMunoz इनपुट फॉर्मेट महत्वपूर्ण नहीं है, जैसा कि पीपीसीजी पर यहां बताया गया है।
मेगो

क्या ऊपरी सीमा के लिए कोई प्रतिबंध है y, mऔर d(उदाहरण के dलिए 2147483000 हो सकता है?)
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

perl -MDate :: Calc =: all -E, 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 1बजाय रिटर्न 2001 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) को जोड़े जाने वाले मानों के लिए लेता है ।

उत्पादन प्रीपेंड के साथ आता है 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समारोह जो अनिवार्य रूप से लागू करता है क्या प्रश्न के लिए पूछता है।

TIO नहीं है lubridateतो आप कर सकते हैं यह यहाँ की कोशिश करो इसके बजाय साथ f <-परीक्षण मामलों के साथ साथ ऊपर समारोह के लिए prepended:

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

PHP , 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

मुझे यकीन नहीं है कि यह मायने रखता है, लेकिन मैं वर्ष समायोजन, महीना समायोजन, उसके बाद दिन के बाद आवेदन कर रहा हूं। सभी परीक्षण मूल्यों की जाँच करें।

हमारे IO मानकों के अनुसार , इनपुट को एक पूर्व-मौजूदा तालिका t से लिया गया है जिसमें दिनांक फ़ील्ड a और पूर्णांक फ़ील्ड y , m और d है

दिलचस्प रूप से ध्यान दें कि यह वह कैपिटलाइज़ेशन नहीं है जो दिनांक प्रकार कोड ( D , M , और Y ) और मेरे इनपुट मानों ( d , m , और y ) के बीच मायने रखता है , बस SQL DATEADDफ़ंक्शन में मापदंडों का क्रम ।


1
क्या यह पास केस 6 है? चूँकि यह नियम 4 को लागू नहीं करता है, मुझे लगता है कि यह इनपुट 6. के 2001 3 1बदले देगा2001 2 28
sundar - Reinstate Monica

@sundar लगता है कि आप सही हैं; मुझे लगा कि मैंने सभी परीक्षण मामलों को पास कर लिया है। मैं देखूंगा कि क्या इसे ठीक किया जा सकता है ...
ब्रैड जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.