তারিখ ফর্ম্যাট বিরোধ নিষ্পত্তি করা


17

তারিখের বিন্যাসের ক্রমটি আজ বিশ্বের সবচেয়ে জটিল এবং বিভাজনযুক্ত সমস্যা। আমাদের মধ্যে কেউ কেউ দৃ ve়তার সাথে যুক্তি দেয় যে মাস / দিন / বছর উপযুক্ত, আমরা সেইভাবে বিবেচনা করি যে তারিখগুলি উচ্চস্বরে বলা হচ্ছে। অন্যরা উচ্চস্বরে ঘোষণা করেন যে দিন / মাস / বছরটি সেরা, কারণ এটি শর্তগুলি উপস্থাপিত করে তার সময়কালকে আরোহণের ক্রমে রাখে।

যথেষ্ট যথেষ্ট. কম্পিউটারগুলি এই বিরোধটি সহজ এবং সুষ্ঠুভাবে সমাধান করতে পারে। আপনার কোড, একটি সম্পূর্ণ ফাংশন বা প্রোগ্রাম, একটি স্ল্যাশ দ্বারা বিস্মৃত তারিখের স্ট্রিং গ্রহণ করবে, যেমন 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
এটির মূল্যের জন্য, যারা দিন-মাস-বছরের জন্য তর্ক করেন তাদের মধ্যে অনেকেই সেই ক্রমে তারিখগুলিও বলে থাকেন। (অবশ্যই, রিয়েল প্রোগ্রামাররা বছর-মাস-দিনের জন্য তর্ক করে)।
পিটার টেলর 19

কেবলমাত্র নিশ্চিত হতে হবে: without leading zeroes and with a four-digit year at the endবোঝানো হয়েছেyear >= 1000
edc65

এটাই সঠিক.
লুক

1
+ September সেপ্টেম্বর 10, 2012
ev3 কম্যান্ডার

উত্তর:


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

জাভাস্ক্রিপ্ট (ES6), 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')
);

ধন্যবাদ:
@ ব্যবহারকারী 81655 , 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
ব্যবহারকারী 81655

1
চলুন Math.ceilব্যবহারb=c=>e(c).length+1>>1
edc65

2

জাভাস্ক্রিপ্ট ES6, 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
@ সিসেরিক ঠিক আছে আমার মন আনুষ্ঠানিকভাবে ফুঁকছে। আমি জানতাম না যে আপনি কোনও চলকতে ফাংশন সংরক্ষণ করতে পারেন। ধন্যবাদ. আমি এটিকে সম্পাদনা করব Also এছাড়াও, আপনি কি আমার পক্ষে একটি অনুগ্রহ করতে পারেন এবং আমার কোডটি চালানোর চেষ্টা করতে পারেন (এটি একটি গল্ফড) এবং এটি দেখতে এটির মতো কাজ হচ্ছে কিনা তা দেখায় লূক আমার চেয়ে ভিন্ন ভিন্ন ফলাফল পাচ্ছে বলে আমি কেবল দেখতে চাই।
আশ্বিন গুপ্ত

1
@ সিসেরেক হ্যাঁ ইড্কি কেন এটি তার পক্ষে আলাদা। যাইহোক, টিপসের জন্য আবারও ধন্যবাদ, এটি কেবল গল্ফিংয়ের জন্যই নয় তবে সাধারণভাবে যেহেতু আমি এখনও পাইথনে নতুন। এছাড়াও, আমি কেবল বুঝতে পেরেছি যে আমি আমার ও ও টি এর প্রাথমিক অ্যাসাইনমেন্টগুলি সরিয়ে ফেলতে পারি এবং তিনি সরাসরি আমার স্প্লিটারে অ্যারের উপাদানটি রেখে 4 বাইট সংরক্ষণ করতে পারেন। আমি এই বিকেলে এই সমস্ত পরিবর্তন করব। আপনাকে ধন্যবাদ নতুন বাইট গণনা উল্লেখযোগ্যভাবে কম হবে!
আশ্বিন গুপ্ত

0

পিএইচপি, 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));
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.