डेट रेंज में अंतराल का पता लगाना


15

दिनांक की एक सूची rको इनपुट, आउटपुट या रिटर्न के रूप में दी गई कोई सीमा नहीं दी गई है r

इस उदाहरण के लिए, इनपुट YYYY-MM-DDप्रारूप में होगा ।

मान लीजिए कि आपके पास तीन दिनांक सीमाएँ हैं:

[2019-01-01, 2019-02-01]
[2019-02-02, 2019-04-05]
[2019-06-01, 2019-07-01]

आप देख सकते हैं कि बीच में एक गैप है 2019-04-05और 2019-06-01

आउटपुट वह गैप होगा: [2019-04-06, 2019-05-31]

नियम

  • इनपुट और आउटपुट किसी भी उचित तिथि या संग्रह प्रारूप में हो सकते हैं, जब तक यह सुसंगत हो।
  • मान लें कि इनपुट का आदेश नहीं दिया गया है।
  • आपकी तिथि सीमा नहीं होनी चाहिए [latest, earliest], लेकिन इसे नियम 2 का पालन करना होगा।
  • मान लें कि इनपुट में कोई अतिव्यापी दिनांक नहीं हैं

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

इनपुट: [[2019-01-01, 2019-02-01],[2019-02-02, 2019-04-05],[2019-06-01, 2019-07-01]]

आउटपुट: [[2019-04-06, 2019-05-31]]


इनपुट: [[2019-01-01, 2019-02-01],[2018-02-02, 2018-04-05],[2019-06-01, 2019-07-01]]

आउटपुट: [[2018-04-06, 2018-12-31], [2019-02-02, 2019-05-31]]


इनपुट: [[2019-01-01, 2019-02-01],[2019-02-02, 2019-03-02],[2019-03-03, 2019-07-01]]

आउटपुट: []


इनपुट: [[2019-01-01, 2019-02-01], [2019-11-02, 2019-11-20]]

आउटपुट: [[2019-02-02, 2019-11-01]]


इनपुट: [[2019-01-01, 2019-02-01],[2019-02-03, 2019-04-05]]

आउटपुट: [[2019-02-02, 2019-02-02]]या[[2019-02-02]]


5
मेरा सुझाव है कि आईएसओ प्रारूप में सभी उदाहरण तारीखों को फिर से लागू करें, YYYY-MM-DDक्योंकि वर्तमान प्रारूप दोनों कई लोगों के लिए विदेशी है, और महीने -12 के छोटे दिनों का उपयोग करने के कारण पार्स करने के लिए और भी कठिन बना दिया है।
15

@ Adám अच्छा विचार, अपडेट किया गया।
ओलिवर

क्या हम .NET OLE स्वचालन तिथियों के रूप में इनपुट ले सकते हैं?
शाम

@ Adám हां। कोई भी उचित दिनांक प्रारूप स्वीकार्य है।
ओलिवर

1
क्या तारीखों का आदेश दिया जाएगा? इसके अलावा, तारीखों की एक जोड़ी के भीतर, क्या बाद में अंतिम होगा?
अज्ञानता का अवतार

जवाबों:


4

एपीएल (Dyalog विस्तारित) , 28 25 24 बाइट्स

बेनामी tacit उपसर्ग समारोह। तर्क और परिणाम एक युग के बाद से दिन की संख्या के 2-कॉलम मैट्रिसेस हैं, प्रत्येक पंक्ति एक सीमा का प्रतिनिधित्व करती है।

1 ¯1+⍤1∘{⍵⌿⍨1<-⍨/⍵}1⌽⍢,∧

इसे ऑनलाइन आज़माएं! InIDN के एक 2-स्तंभ मैट्रिक्स के लिए 3-तत्व सूचियों (आईएसओ क्रम में दिनांक) के जोड़े की एक सूची से पूर्व प्रोसेसर समारोह धर्मान्तरित, अंतर्राष्ट्रीय दिवस नंबर (1899/12/31 के बाद से दिन)। Out3-तत्व सूचियों के एक मैट्रिक्स के लिए IDN के एक मैट्रिक्स के उत्तर-प्रोसेसर समारोह धर्मान्तरित।

 आरोही क्रमबद्ध करें

1⌽ चक्रीय रूप से तारीखों को घुमाते
⍢, हुए छोड़ दिया गया एक कदम (चपटा) - बाद में, मूल आकार में वापस आकार दें

1 ¯1+ परिणाम की
⍤1 प्रत्येक पंक्ति
के लिए उस सूची का उपयोग करके  एक और एक को जोड़ें
{... } निम्न लंबोदर:
 तर्क
-⍨/ दाएं हाथ की तारीख से बाएं हाथ की तारीख को घटाता है, पंक्ति-वार
1< मुखौटा जहां अंतर एक से अधिक होता है (यानी जहां सीमा आसन्न नहीं हैं)
⍵⌿⍨ फ़िल्टर उस नकाब से पंक्तियाँ


3

सी # (विज़ुअल सी # इंटरएक्टिव कंपाइलर) , 108 बाइट्स

n=>{n.Sort();for(int i=0;;)Write(n[i].b.AddDays(1)==n[++i].a?"":n[i-1].b.AddDays(1)+""+n[i].a.AddDays(-1));}

प्रारूप में मुद्रण द्वारा आउटपुट DD/MM/YYYY 12:00:00 AMDD/MM/YYYY 12:00:00 AM। एक IndexOutOfRange अपवाद का कारण होगा, जो प्रति मेटा सहमति के अनुसार ठीक है।

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

यदि हम यूनिक्स युग के बाद से दिनों के रूप में इनपुट लेते हैं, तो हम इसे नीचे प्राप्त कर सकते हैं ...

83 बाइट्स

n=>{n.Sort();for(int i=0;;)Print(n[i].b+1==n[++i].a?"":n[i-1].b+1+" "+(n[i].a-1));}

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

हम इसे /u:System.Arrayझंडे के साथ आगे भी नीचे गोल्फ कर सकते हैं , के लिए ...

78 बाइट्स

n=>{Sort(n);for(int i=0;;)Print(++n[i].b==n[++i].a--?"":n[i-1].b+" "+n[i].a);}

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




2

पर्ल 6 , 46 बाइट्स

{@_.sort[1..*-2].map:{$^a+1,$^b-1 if $b>$a+1}}

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

Dateजोड़े की एक सूची लेता है ।


किसी भी विचार क्यों यह संभव गोल्फ दिनांक उत्पादन में काम करता है?
जो किंग

@JoKing मैंने देखा कि, और भी बग दर्ज किया
nwellnhof

2

PHP, 208 197 190 177 बाइट्स

hunky chunky एक दीवार पर बैठ गया ... हालांकि नए दृष्टिकोण में कुछ गोल्फ की क्षमता थी।

function($a){sort($a);for($m=$x=$a[0][0];$f=$m<=$x;$f^$g&&print($g=$f)?"$m/":"$n
",$m=date("Y-m-d",strtotime($n=$m)+9e4))foreach($a as$d)$x=max($x,$d[1|$f&=$m<$d[0]|$m>$d[1]]);}

फ़ंक्शन आईएसओ प्रारूप में श्रेणियों [आरंभ, अंत] की सरणी लेता है, अंतराल अंतराल को प्रिंट करता है। इसे ऑनलाइन आज़माएं


टूट - फूट

function($a){
    sort($a);                           # sort ranges (for easy access to min date)
    for($m=$x=$a[0][0];$f=$m<=$x;       # loop from min date to max date, 1. set flag
        $f^$g&&print($g=$f)?"$m/":"$n\n",       # 4. flag changed: backup flag, print date
        $m=date("Y-m-d",strtotime($n=$m)+9e4)   # 5. backup and increment date
    )foreach($a as$d)
        $x=max($x,$d[1                          # 2. find max date
            |$f&=$m<$d[0]|$m>$d[1]              # 3. date found in ranges: clear flag
        ]);
}

1

जेली , 13 बाइट्स

FṢṖḊs2+Ø+>/Ðḟ

जेली (वर्तमान में) में कोई अंतर्निहित तिथियां नहीं हैं, इसलिए यह दिनों-दिन-युग का उपयोग करता है।
श्रेणियों की सूची (पूर्णांक के जोड़े) मिश्रित क्रम और मिश्रित दिशाओं में हो सकती है।
परिणाम आरोही क्रम में आरोही श्रेणियों की एक सूची है।

इसे ऑनलाइन आज़माएं! (के रूप में एक खाली सूची दिखाने के लिए पाद लेख प्रारूप[])

कैसे?

नोट: यह इस आश्वासन पर निर्भर करता है कि "इनपुट में कोई अतिव्यापी तारीखें नहीं हैं" जैसा कि नियमों में कहा गया है।

FṢṖḊs2+Ø+>/Ðḟ - Link: list of pairs of integers
F             - flatten
 Ṣ            - sort
  Ṗ           - pop (remove tail)
   Ḋ          - dequeue (remove head)
    s2        - split into twos
       Ø+     - literal [1,-1]
      +       - add (vectorises)
           Ðḟ - filter discard those for which:
          /   -   reduce by:
         >    -     greater than?

दिलचस्प है, मुझे नहीं पता था कि जेली के पास तारीख का समर्थन नहीं था। क्या यह सामान्य दृष्टिकोण है? युग के बाद के दिनों का उपयोग करें?
दना

चूंकि युग है, मेरा मानना ​​है कि कुछ प्रणालियों (एक्सेल हो सकता है) द्वारा उपयोग किया जाता है। युग के बाद से सेकंड अधिक आम है (जैसे यूनिक्स)। मैं बस कुछ चीजों के साथ गया था जो आवश्यकताओं को कवर करने के लिए लगता है, यद्यपि बहुत ही शिथिलता से।
जोनाथन एलन

बू, आप मैन्युअल रूप से तारीखों की गणना कर सकते हैं । ; पी दिनों के बाद से वास्तव में अधिक बार उन भाषाओं के लिए उपयोग किया जाता है जो तारीखों का समर्थन नहीं करते हैं। मुझे ऐसा लगता है कि यह इस चुनौती को बहुत आसान बनाता है, हालाँकि।
केविन क्रूज़सेन

@KevinCruijssen हेह, सहमत हुए।
जोनाथन एलन

1

सी # (विजुअल सी # इंटरएक्टिव कंपाइलर) , 103 बाइट्स

x=>{var(a,_)=x[0];foreach(var(b,c)in x.OrderBy(y=>y)){if(a<b)Print((a,b.AddDays(-1)));a=c.AddDays(1);}}

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

इनपुट स्टार्ट / एंड डेट टुपल्स की एक सूची है। STDOUT के लिए प्रत्येक लापता सीमा आउटपुट।

// x: input list of start/end date tuples
x=>{
  // variable definitions...
  // a: 1 day after the end date of the previous range
  // b: start of the current range
  // c: end of the current range

  // start by deconstructing the start date of the first tuple
  // into a. a will then be a DateTime and will contain a value
  // at least a large as the smallest start date.
  var(a,_)=x[0];
  // iterate over sorted ranges
  foreach(var(b,c)in x.OrderBy(y=>y)){
    // if the day after the end of the previous range is less
    // than the start of the current range, then print the
    // missing days.
    if(a<b)
      Print((a,b.AddDays(-1)));
    // save the day after the current range to a for next iteration
    a=c.AddDays(1);
  }
}


Hah - यदि आप इग्नोरेंस के अवतार की तरह प्रिंट करते हैं तो आप वास्तव में छोटे हो सकते हैं - इसे ऑनलाइन आज़माएं!
दना

अच्छा लगा। इसके अलावा बाद के दो के लिए उनकी इनपुट विधि wtf
केवल

वास्तव में ... जो वास्तव में गलत लगता है
केवल

1
हाँ जो अब ठीक लग रहा है
केवल

1

आर , 88 बाइट्स

function(a,b=a[order(a$x),],d=c(b$x[-1]-b$y[-nrow(b)],0))data.frame(b$y+1,b$y+d-1)[d>1,]

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

यह इनपुट के रूप में तिथि सीमाओं का एक डेटा फ़्रेम लेता है और गायब होने वाली श्रेणियों के साथ डेटा फ़्रेम आउटपुट करता है। मुझे पूरा यकीन है कि यह अधिक गोल्फ हो सकता है, लेकिन मैं मुद्दों के साथ भाग गया c, cbindऔर दूसरों ने डेट क्लास छीन ली।

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