वह कौन सी तारीख है?


10

मेरी वेबसाइट पर, उपयोगकर्ता शैली में अपनी जन्म तिथि दर्ज करते हैं xx.xx.xx- तीन दो अंकों की संख्या डॉट्स द्वारा अलग। दुर्भाग्य से, मैं उपयोगकर्ताओं को यह बताना भूल गया कि किस प्रारूप का उपयोग करना है। मुझे पता है कि एक खंड महीने के लिए, एक तिथि के लिए, और एक वर्ष के लिए उपयोग किया जाता है। वर्ष निश्चित रूप से 20 वीं शताब्दी (1900-1999) में है, इसलिए प्रारूप का 31.05.75अर्थ है 31 May 1975। इसके अलावा, मुझे लगता है कि हर कोई ग्रेगोरियन या जूलियन कैलेंडर का उपयोग करता है।

अब, मैं अपने डेटाबेस के माध्यम से गंदगी को साफ करना चाहता हूं। मैं सबसे अस्पष्ट तारीखों के साथ उपयोगकर्ताओं के साथ काम करके शुरू करना चाहता हूं, अर्थात्, जहां संभव तिथियों की सीमा सबसे बड़ी है।

उदाहरण के लिए, तिथि का 08.27.53अर्थ 27 August 1953या तो ग्रेगोरियन या जूलियन कैलेंडर है। जूलियन कैलेंडर में तारीख 13 दिन बाद की है, इसलिए सीमा बस है 13 days

इसके विपरीत, अंकन 01.05.12कई संभावित तिथियों को संदर्भित कर सकता है। जल्द से जल्द है 12 May 1901 (Gregorian), और नवीनतम है 1 May 1912 (Julian)। सीमा है 4020 days

नियम

  • इनपुट प्रारूप में एक स्ट्रिंग है xx.xx.xx, जहां प्रत्येक फ़ील्ड दो अंकों और शून्य-गद्देदार है।
  • आउटपुट रेंज में दिनों की संख्या है।
  • आप मान सकते हैं कि इनपुट हमेशा एक मान्य तारीख होगी।
  • आप किसी भी अंतर्निहित दिनांक या कैलेंडर फ़ंक्शन का उपयोग नहीं कर सकते हैं।
  • सबसे छोटा कोड (बाइट्स में) जीतता है।

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

  • 01.00.31 => 12
  • 29.00.02=> 0(केवल संभावना है 29 February 1900 (Julian))
  • 04.30.00 => 13
  • 06.12.15 => 3291

है 5, May 1975होना चाहिए 31st? इसके अलावा, क्या हमें लीप इयर्स का हिसाब देना होगा?
माल्टसेन

@ मैल्टीसेन हाँ, निश्चित। हाँ।
यपनिप

यह 21 वीं सदी में क्यों नहीं हो सका?
एलिफेंटपहास

@ElefantPhace नियम बताता है कि 20 वीं शताब्दी मान ली गई है; अन्यथा कोई अधिकतम तारीख नहीं होगी।
Ypnypn

जवाबों:


6

पायथ, 118 बाइट्स

M++28@j15973358 4G&qG2!%H4FN.pmv>dqhd\0cz\.I&&&hN<hN13eN<eNhgFPNaYK+++*365JhtN/+3J4smghdJthNeNInK60aY-K+12>K60;-eSYhSY

इसे ऑनलाइन आज़माएँ: प्रदर्शन या टेस्ट सूट

जूलियन और ग्रेगोरियन कैलेंडर्स का आवश्यक ज्ञान

जूलियन और ग्रेगोरियन कैलेंडर काफी समान हैं। प्रत्येक कैलेंडर एक वर्ष को 12 महीनों में विभाजित करता है, प्रत्येक में 28-31 दिन होते हैं। एक महीने में सटीक दिन हैं [31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]। कैलेंडर के बीच एकमात्र अंतर एक लीप वर्ष की उनकी परिभाषा है। जूलियन कैलेंडर में किसी भी वर्ष 4 से विभाज्य एक लीप वर्ष है। ग्रेगोरियन कैलेंडर थोड़ा अधिक विशिष्ट है। किसी वर्ष 4 से विभाज्य एक लीप वर्ष है, वर्ष को छोड़कर 100 से विभाज्य और 400 से विभाज्य नहीं है।

इसलिए 20 वीं शताब्दी में केवल एक वर्ष अलग है। वर्ष 1900, जो जूलियन कैलेंडर में एक लीप वर्ष है, लेकिन ग्रेगोरियन कैलेंडर में एक लीप वर्ष नहीं है। तो केवल तारीख, जो एक कैलेंडर में मौजूद है, लेकिन दूसरे कैलेंडर में नहीं है 29.02.1900

अलग-अलग लीप वर्ष की परिभाषा के कारण, जूलियन कैलेंडर और ग्रेगोरियन कैलेंडर की तारीख में अंतर होता है। से पहले की तारीख के लिए 12 दिन का अंतर 29.02.1900, और तारीख के बाद के 13 दिनों का अंतर 29.02.1900

सरलीकृत छद्म कोड

Y = []  # empty list
for each permutation N of the input date:
   if N is valid in the Julian Calendar:
      K = number of days since 0.01.1900
      append K to Y
      if K != 60:  # 60 would be the 29.02.1900
         L = K - (12 if K < 60 else 13) 
         append L to Y
print the difference between the largest and smallest value in Y

विस्तृत कोड स्पष्टीकरण

पहला भाग M++28@j15973358 4G&qG2!%H4एक फ़ंक्शन को परिभाषित करता है g(G,H), जो जूलियन कैलेंडर में Gवर्ष के महीने में दिनों की संख्या की गणना करता है H

M                            def g(G,H): return
      j15973358 4               convert 15973358 into base 4
     @           G              take the Gth element
  +28                           + 28
 +                &qG2!%H4      + (G == 2 and not H % 4)

और अगला हिस्सा सिर्फ लूप के लिए है, और अगर। ध्यान दें कि मैं Nप्रारूप में व्याख्या करता हूं (month, year, day)। सिर्फ इसलिए कि यह कुछ बाइट्स बचाता है।

FN.pmv>dqhd\0cz\.
             cz\.        split input by "."
    mv>dqhd\0            map each d of ^ to: eval(d[d[0]=="0":])
FN.p                     for N in permutations(^):

I&&&hN<hN13eN<eNhgFPN   
I                          if 
    hN                        month != 0
   &                          and
      <hN13                   month < 13
  &                           and
           eN                 day != 0
 &                            and
             <eNhgFPN         day < 1 + g(month,year):

aYK+++*365JhtN/+3J4smghdJthNeN
          JhtN                    J = year
     +*365J   /+3J4               J*365 + (3 + J)/4
    +              smghdJthN      + sum(g(1+d,year) for d in [0, 1, ... month-2])
   +                        eN    + day
  K                               K = ^
aYK                               append K to Y

InK60aY-K+12>K60            
InK60                             if K != 60:
     aY-K+12>K60                    append K - (12 + (K > 60)) to Y

;-eSYhSY
;          end for loop
 -eSYhSY   print end(sorted(Y)) - head(sorted(Y))

0

पर्ल 5 , 294 बाइट्स

sub f{map/(\d\d)(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])/             #1             
      &&$3<29+($2==2?!($1%4):2+($2/.88)%2)                        #2  
      &&($j{$_}=++$j+12)                                          #3
      &&$j!#1=60?$g{$_}=++$g:0,'000101'..'991231'if!%g;           #4
      pop=~/(\d\d).(\d\d).(\d\d)/;                                #5
      @n=sort{$a<=>$b}                                            #6
         grep$_,                                                  #7
         map{($j{$_},$g{$_})}                                     #8
         ("$1$2$3","$1$3$2","$2$1$3","$2$3$1","$3$1$2","$3$2$1"); #9
      $n[-1]-$n[0]}                                               #10

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

298 बाइट्स जब रिक्त स्थान, newlines और टिप्पणियां हटा दी जाती हैं।

लाइन्स 1-4 इनिशियलाइज़ (यदि नहीं की गई हैं) %gऔर %jहैश जहाँ मान ग्रेगोरियन और जूलियन दिन संख्याएँ हैं तदनुसार तदनुसार जौनरी 1 1900 से 31 दिसंबर 1999 तक गिनती।

लाइन 5 $ 1, $ 2 और $ 3 में इनपुट तिथि डालता है।

लाइन 9 उन तीन इनपुट नंबरों के सभी छह क्रमांकन को सूचीबद्ध करता है।

पंक्ति 8 उन छः को दो संख्याओं में परिवर्तित करती है, ग्रेगोरियन और जूलियन दिन संख्याएँ, लेकिन केवल वे जो वैध दिनांक हैं।

लाइन 7 सुनिश्चित करता है कि, यह गैर अस्तित्व के दिन की संख्या को फ़िल्टर करता है।

लाइन 6 सबसे छोटी से सबसे बड़ी तक वैध तिथि संख्याओं की सूची को सॉर्ट करता है।

लाइन 10 रिटर्न फिर अंतिम और पहले (अधिकतम और न्यूनतम) के बीच अंतर है, जो कि वांछित सीमा थी।

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