दिनांक स्वरूप विवाद को हल करना


17

तारीखों का प्रारूपण क्रम आज दुनिया के सामने आने वाले सबसे जटिल और विभाजनकारी मुद्दों में से एक है। हममें से कुछ लोगों का तर्क है कि महीना / दिन / वर्ष उचित है, यह देखते हुए कि हम कैसे कहते हैं कि तारीखें ज़ोर से पड़ती हैं। अन्य लोग जोर से घोषणा करते हैं कि दिन / महीना / वर्ष सबसे अच्छा है, क्योंकि यह शर्तों को उस अवधि के आरोही क्रम में रखता है जिसका वे प्रतिनिधित्व करते हैं।

अब बहुत हो गया है। कंप्यूटर इस विवाद को सरल और निष्पक्ष रूप से हल कर सकते हैं। आपका कोड, एक पूर्ण फ़ंक्शन या प्रोग्राम, स्लैश द्वारा सीमांकित तारीख स्ट्रिंग लेगा, जैसे 12/1/2015। ध्यान दें कि यह सटीक प्रारूप है, प्रमुख शून्य के बिना और अंत में चार अंकों के वर्ष के साथ।

  • यदि यह निश्चित रूप से महीना / दिन / वर्ष है, उदाहरण के लिए 10/31/1998, पूरे महीने के नाम, दिन और वर्ष के साथ इस सटीक प्रारूप में उस तिथि का एक पाठ प्रतिनिधित्व आउटपुट करें:October 31, 1998
  • यदि यह निश्चित रूप से दिन / महीना / वर्ष है, उदाहरण के लिए 25/12/1989, एक ही तरह का पाठ प्रतिनिधित्व आउटपुट December 25, 1989:।
  • यदि यह अस्पष्ट है कि क्या यह महीना / दिन / वर्ष या दिन / महीना / वर्ष है, तो दो संभावित तिथियों के संयोजन से अस्पष्टता को हल करने वाली तिथि इस प्रकार है:
    1. के नाम की पहली छमाही लेने के द्वारा एक नया माह नाम बनाएँ पहले महीने और की दूसरी छमाही संलग्न बाद में महीने। विषम लंबाई वाले महीनों के लिए, पहले छमाही को अतिरिक्त पत्र मिलता है। स्पष्ट होना करने के लिए, महीने के पहले आधी होती हैं Janu, Febr, Mar, Apr, Ma, Ju, Ju, Aug, Septe, Octo, Nove, और Deceऔर दूसरे हिस्सों इसलिए कर रहे हैं ary, uary, ch, il, y, ne, ly, ust, mber, ber, mber, और mber
    2. दो संभावित दिनों के औसत से दिन की गणना करें, जब औसत पूर्णांक नहीं है, तो फर्श ले रहा है।
    3. इस दिनांक के पाठ प्रतिनिधित्व को आउटपुट करें, उदाहरण के लिए 10/8/2011, आउटपुट Augber 9, 2011

इनपुट तारीख नहीं किया जा सकता है, तो महीना / दिन / वर्ष या दिन / माह / वर्ष (उदाहरण के लिए 13/13/2013या यहां तक कि 2/30/2002), किसी भी व्यवहार स्वीकार्य है। यह कोड गोल्फ, सबसे छोटा कोड जीतता है!

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

10/31/1998 देता है October 31, 1998

25/12/1989 देता है December 25, 1989

10/8/2011 देता है Augber 9, 2011

8/5/1957 देता है Maust 6, 1957

9/12/2012 (विचित्र रूप से पर्याप्त) देता है September 10, 2012

1/1/2000 देता है January 1, 2000



20
जो इसके लायक है, उसके लिए बहुत से लोग जो दिन-महीने-साल के लिए बहस करते हैं, उस क्रम में तारीखें भी कहते हैं। (बेशक, रियल प्रोग्रामर साल-महीने के लिए तर्क देते हैं)।
पीटर टेलर

बस सुनिश्चित करें: without leading zeroes and with a four-digit year at the endतात्पर्यyear >= 1000
edc65

यह सही है।
लूका

1
10 सितंबर, 2012 के लिए + 10
ev3commander

जवाबों:


1

पायथ - 156 बाइट्स

वास्तव में बुरा कोड, और पैक्ड स्ट्रिंग्स का उपयोग करने की आवश्यकता होगी, लेकिन इसकी कुछ।

Kc"January February March April May June July August September October November December"dJhM.g>k12=GsMcz\/?<eJ32++@KthJdtP`,eJeGss[@VCcL2KStMPGdPt`,s.OPGeG

टेस्ट सूट


3

गणितज्ञ 341 304 298 288 293 बाइट्स

यह एक शुद्ध या अनाम फ़ंक्शन का उपयोग करता है, अर्थात्, अपने स्वयं के नाम के बिना एक फ़ंक्शन।

DateStringयदि तिथि अस्पष्ट है, तो त्रुटि संदेश देता है। Checkअस्पष्टता को पकड़ता है और आपत्तिजनक तारीख को भेजता है DateList, जो इसे 3 पूर्णांक (जो इसे मानता है {year, month, day}) की सूची में बदल देता है । महीने और दिन पूर्णांक आकार द्वारा क्रमबद्ध किए जाते हैं और ओपी के निर्देशों के अनुसार महीने और दिन का निर्धारण करने के लिए उपयोग किया जाता है।

Quiet मौन त्रुटि मुद्रण।

t=StringSplit;v=ToString;x=t[#,"-"]&/@t["Janu-ary Febr-uary Mar-ch Apr-il Ma-y Ju-ne Ju-ly Aug-ust Septe-mber Octo-ber Nove-mber Dece-mber"];
Quiet@Check[#~DateString~{"MonthName"," ","DayShort",", ","Year"},
{m,n,o}=DateList@#;{p,q}=Sort@d[[2;;3]];x[[p,1]]<>x[[q,2]]<>" "<>v@Floor@Mean@{n,o}<>", "<>v@d[[1]]]&

t=StringSplit;v=ToString;x=t[#,"-"]&/@t["Janu-ary Febr-uary Mar-ch Apr-il Ma-y Ju-ne Ju-ly Aug-ust Septe-mber Octo-ber Nove-mber Dece-mber"];
Quiet@Check[#~DateString~{"MonthName"," ","DayShort",", ","Year"},
{m,n,o}=DateList@#;{p,q}=Sort@d[[2;;3]];x[[p,1]]<>x[[q,2]]<>" "<>v@Floor@Mean@{n,o}<>", "<>v@d[[1]]]& /@ 
{"10/31/1998","25/12/1989", "10/8/2011", "8/5/1957", "9/12/2012", "1/1/2012"}

{"31 अक्टूबर, 1998", "25 दिसंबर, 1989", "ऑगबर 9, 2011", "मैस्ट 6, 1957", "10 सितंबर, 2012", "1 जनवरी, 2012"}


मैं व्यक्तिगत रूप से आपको उस 0 को खत्म करते हुए देखना पसंद करूंगा, लेकिन मैं वोटों को गिरने दूंगा जैसा कि वे कर सकते हैं।
ल्यूक

यह अब अनुरोध के अनुसार "1 जनवरी, 2012" लौटाता है।
डेविड डिक

3

जावास्क्रिप्ट (ईएस 6), 311 295 282 274 246 238 बाइट्स

a=>(a=a.split`/`,b=c=>e(c).length+1>>1,d=' ',e=f=>new Date(99,a[+f]-1).toLocaleString('en',{month:'long'}),g=+a[0],h=+a[1],i=g>h,j=g>12,k=h>12,(j&&!k?e(1)+d+g:k&&!j?e(0)+d+h:e(i).slice(0,b(i))+e(1-i).slice(b(1-i))+d+((g+h)>>1))+', '+a[2])

संपादित करें:toLocaleString महीने के नाम उत्पन्न करने के लिए उपयोग करता है। विभिन्न स्थानों में महीने के नामों का उपयोग करके परिणाम प्राप्त करने के लिए स्थान बदलें!

संपादित करें 2: अब सभी 12 के बजाय दो महीने के नाम उत्पन्न करता है!

Ungolfed:

func = inp => (
    inp = inp.split `/`,
    get = arg => months(arg).length + 1 >> 1,
    space = ' ',
    months = key => new Date(99, inp[+key] - 1).toLocaleString('en', { month: 'long' }),
    tmp1 = +inp[0],
    tmp2 = +inp[1],
    first = tmp1 > tmp2,
    t1greater = tmp1 > 12,
    t2greater = tmp2 > 12,
    (t1greater && !t2greater ?
        months(1) + space + tmp1
    :
        t2greater && !t1greater ?
            months(0) + space + tmp2
        :
            months(first).slice(0, get(first)) + months(1 - first).slice(get(1 - first)) + space + ((tmp1 + tmp2) >> 1)
    )
    + ', ' + inp[2]
)

उदाहरण:

console.log(
    func('10/31/1998') + '\n' +
    func('25/12/1989') + '\n' +
    func('10/8/2011') + '\n' +
    func('8/5/1957') + '\n' +
    func('9/12/2012') + '\n' +
    func('1/1/2000')
);

इसके लिए धन्यवाद:
@ user81655 , 274 => 246 बाइट्स
@ edc65 , 246 => 238 बाइट्स


1
मैं बहुत अच्छी तरह से देखा नहीं है, लेकिन यहाँ आप कर सकते हैं कुछ सुधार है: परिवर्तन Math.ceil(e[c].length/2)करने के लिए (r=e[c].length/2)+r%1, Array(2).fill().map((_,f)=>...)करने के लिए f=>...और हर e[n]के लिए e(n), i=+(g>h)करने के लिए i=g>hऔर e[i]करने के लिए e[+i], पिछले त्रिगुट ऑपरेटर में अनावश्यक कोष्ठक निकालने के लिए, इसके अलावा, newDateहोना चाहिए new Date
user81655

1
Math.ceilप्रयोग करने से बचेंb=c=>e(c).length+1>>1
edc65

2

जावास्क्रिप्ट ईएस 6, 204

x=>(s=x=>x.split`/`,[a,b,y]=s(x).sort((a,b)=>a-b),(c=b)>12?c=a:b=a- -b>>1,s('/Janu/Febr/Mar/Apr/Ma/Ju/Ju/Aug/Septe/Octo/Nove/Dece')[a]+s('/ary/uary/ch/il/y/ne/ly/ust/mber/ber/mber/mber')[c]+` ${b}, `+y)

टेस्ट स्निपेट:

F=x=>(
  s=x=>x.split`/`,
  [a,b,y]=s(x).sort((a,b)=>a-b),
  (c=b)>12?c=a:b=a- -b>>1,
  s('/Janu/Febr/Mar/Apr/Ma/Ju/Ju/Aug/Septe/Octo/Nove/Dece')[a]
  +s('/ary/uary/ch/il/y/ne/ly/ust/mber/ber/mber/mber')[c]+` ${b}, `+y
)

console.log=x=>O.innerHTML+=x+'\n'

;['10/31/1998','25/12/1989','10/8/2011','8/5/1957','9/12/2012','1/1/2000']
.forEach(x=>console.log(x+' -> '+F(x)))
<pre id=O></pre>


2

पायथन 3 (290 बाइट्स)

अश्विन गुप्ता के जवाब के समान, लेकिन महीने के सभी नामों को लिखने से बचने के लिए पायथन के कैलेंडर मॉड्यूल का लाभ उठाना।

import calendar as C
M,I,P,S,L,A=C.month_name,int,print," ",len,", "
def d(i):
 w=i.split("/")
 f,s,y=I(w[0]),I(w[1]),w[2]
 if(f>12):P(M[s]+S+w[0]+A+y)
 elif(s>12):P(M[f]+S+w[1]+A+y)
 else:l,h=min(f,s),max(f,s);P(M[l][:I(L(M[l])/2+.5)]+M[h][I(L(M[h])/2+.5):]+S+str(I((f+s)/2))+A+y)

अजगर 2 को पूर्णांक विभाजन के साथ कुछ बाइट्स को ट्रिम करना चाहिए और इसके लिए कोष्ठक खोना चाहिए print


1

पायथन, 558 554 बाइट्स

अजगर में ऐसा करने के लिए वास्तव में, वास्तव में, वास्तव में बुरी तरह से गोल्फ का उदाहरण। क्षमा करें, मैं इस गोल्फ सामान में सुपर खराब हूं D:। हालांकि यह काम करता है। मुझे यकीन है कि इसे सरल बनाने के लिए बहुत सारे तरीके हैं इसलिए मुझे टिप्पणियों में बताएं। golfed:

import math
def d(i):
 l=["","January","February","March","April","May","June","July","August","September","October","November","December"]
 w=i.split('/')
 f=int(w[0])
 s=int(w[1])
 S=" "
 y=w[2]
 if(f>12):
  e=int(w[1])
  print(l[e]+S+w[0]+", "+y)
  elif(f<=12 and s>12):
   e=int(w[0])
   print(l[e]+S+w[0]+", "+y)
   else:
    if(f<s):
     o=l[f]
     t=l[s]
    else:
     o=l[s]
     t=l[f]
    o=o[0:int(math.ceil(len(o)/2))]
    t=t[int(math.ceil(len(t)/2)):len(t)]
    print(o+t+S +  str(math.floor((f + s)/2)) + ", " + y)

Ungolfed

import math
def d(i):
    l = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
    w = i.split('/')
    f = int(w[0])
    s = int(w[1])
    y = w[2]
    if(f > 12):
        e = int(w[1])
        print(l[e] + " " + w[0] + ", " + y)

    elif(f <= 12 and s > 12):
         e = int(w[0])
         print(l[e] + " " + w[0] + ", " + y)
    else:
         if(f < s):
            o=l[f]
            t=l[s]
         else:
            o=l[s]
            t=l[f]
         o = o[0:int(math.ceil(len(o)/2))]
         t = t[int(math.ceil(len(t)/2)):len(t)]
         print(o+t+" " +  str(math.floor((f + s)/2)) + ", " + y)

स्क्रीनशॉट: यहाँ छवि विवरण दर्ज करें


डाल S=" "शीर्ष पर है, तो के प्रत्येक उदाहरण की जगह " "के साथ S- कि बंद कुछ बाइट्स दाढ़ी होगा
बिल्ली

असाइनमेंट ( e= int[..., o = o...) के बाद कुछ अनावश्यक स्थान हैं । यह भी, यह intएकल-अक्षर अपरकेस वैर जैसे अक्सर इस्तेमाल की जाने वाली कॉल को सेट करने के लिए साहसी साबित हो सकता है
बिल्ली

1
यहां 447 बाइट्स हैं:from math import* I=int S=" " C="," L=len P=print def d(i): l=["","January","February","March","April","May","June","July","August","September","October","November","December"];w=i.split('/');f=I(w[0]);s=I(w[1]);y=w[2] if f>12:e=I(w[1]);P(l[e]+S+w[0]+C+S+y) elif f<13and s>12:e=I(w[0]);P(l[e]+S+w[0]+C+S+y) else: if f<s:o=l[f];t=l[s] else:o=l[s];t=l[f];o=o[0:I(ceil(L(o)/2))];t=t[I(ceil(L(t)/2)):L(t)] P(o+t+S+str(floor((f+s)/2))+C+S+y)
बिल्ली

1
@sysreq ठीक है मेरा मन आधिकारिक रूप से उड़ा दिया गया है। मुझे नहीं पता था कि आप किसी चर में फ़ंक्शंस स्टोर कर सकते हैं। धन्यवाद। मैं उसे संपादित करूंगा। इसके अलावा, क्या आप मुझ पर एक एहसान कर सकते हैं और मेरे कोड को चलाने की कोशिश कर सकते हैं (एक को गोल्फ में) और देखें कि क्या यह इस तरह काम कर रहा है क्योंकि ल्यूक को मुझसे अलग परिणाम मिल रहे हैं इसलिए मैं बस देखना चाहता हूं।
अश्विन गुप्ता

1
@sysreq हाँ आइडीके। उसके लिए अलग क्यों है। वैसे भी, फिर से सुझावों के लिए धन्यवाद, यह वास्तव में न केवल गोल्फिंग के लिए बल्कि सामान्य रूप से मैं पायथन के लिए अभी भी नया हूं। इसके अलावा, मुझे बस एहसास हुआ कि मैं अपने शुरुआती कार्य ओ और टी को हटा सकता हूं और 4 बाइट्स बचा सकता हूं ताकि वह सीधे मेरी फाड़नेवाला में तत्व डाल सके। मैं इन सभी को आज दोपहर में बदल दूंगा। आपके लिए धन्यवाद नई बाइट गिनती काफी कम होगी!
अश्विन गुप्ता

0

PHP, 301 294 बाइट्स

function r($t){$e='return date("F",mktime(0,0,0,$o));';list($a,$b,$c)=explode('/',$t);$o=min($a,$b);$m=eval($e);$o=max($a,$b);$n=eval($e);echo(($a|$b)<13)?substr($m,0,ceil(strlen($m)/2)).substr($n,ceil(strlen($n)/2))." ".floor(($a+$b)/2).", $c":date("F j, Y",strtotime(($a>12)?"$b/$a/$c":$t));}

मुझे लगा कि मैं जावास्क्रिप्ट उत्तर के साथ प्रतिस्पर्धा कर सकता हूं। ओह अच्छा।

मुझे लगता है कि मैं इसे छोटा बना सकता हूं और मुझे अस्पष्ट तिथियों के लिए उपयोग किए गए कोड पसंद नहीं हैं। मुझे लगता है कि इसे करने का एक बेहतर तरीका है।

Ungolfed:

function r($t){
    // Eval'd code to reduce char count
    $e='return date("F",mktime(0,0,0,$o));';

    // Split the date
    list($a,$b,$c)=explode('/',$t);

    // Get the earliest month
    $o=min($a,$b);
    $m=eval($e);

    // Get the latest month
    $o=max($a,$b);
    $n=eval($e);

    // If ambiguous
    if ($a<13 && $b<13) {
        print substr($m,0,ceil(strlen($m)/2)).substr($n,ceil(strlen($n)/2))." ".floor(($a+$b)/2).", $c";
    }
    else {
        print date("F j, Y",strtotime(($a>12)?"$b/$a/$c":$t));
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.