日付形式の紛争の解決


17

日付のフォーマット順序は、今日世界が直面している最も複雑で分裂的な問題の1つです。私たちの一部は、月/日/年が適切であると激しく主張します。他の人は、日/月/年が最高であると大声で宣言しています。

いい加減にしろ。コンピューターはこの論争を簡単かつ公正に解決できます。完全な関数またはプログラムであるコードは、スラッシュなどで区切られた日付文字列を取ります12/1/2015。これは正確な形式であり、先頭にゼロを付けず、末尾に4桁の年を付けます。

  • それはなら間違いなく月/日/年、例えば10/31/1998、出力完全な月名、日、年で、この正確な形式でその日付のテキスト表現:October 31, 1998
  • それはなら間違いなく日/月/年、例えば25/12/1989、出力テキスト表現の同じ種類:December 25, 1989
  • 月/日/年か日/月/年かがあいまいな場合は、次のように2つの可能な日付を組み合わせてあいまいさを解決する日付を出力します。
    1. 名前の最初の半分取ることによって、新しい月の名前を作成して、以前の月をし、後半追加後の月を。長さが奇数の月の場合、前半には余分な文字が付きます。明示的には、数ヶ月の最初の半分でありJanuFebrMarAprMaJuJuAugSepteOctoNove、およびDece第二半部は、したがってありaryuarychilynelyustmberbermber、およびmber
    2. 2つの可能な日を平均して日を計算し、平均が整数でない場合に床を取ります。
    3. for 10/8/2011、outputなど、この日付のテキスト表現を出力します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
+∞2012年9月10日のために
ev3commander

回答:


1

Pyth-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

Mathematica 341 304 298 288 293バイト

これは、純粋な関数または匿名関数、つまり独自の名前のない関数を使用します。

DateString日付があいまいな場合、エラーメッセージを返します。Checkあいまいさをキャッチし、問題の日付をに送信DateListします{year, month, day}。これにより、3つの整数のリストに変換されます(これはであると思われます)。月と日の整数はサイズでソートされ、OPの指示に従って月と日を決定するために使用されます。

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

{「1998年10月31日」、「1989年12月25日」、「2011年8月9日」、「1957年6月6日」、「2012年9月10日」、「2012年1月1日」}


私は個人的にあなたがその0を排除するのを楽しみにしていますが、投票をできる限り減らすようにします。
ルーク

リクエストに応じて「2012年1月1日」を返すようになりました。
DavidC

3

Javascript(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個すべてではなく2個の月名を生成するようになりました!

ゴルフをしていない:

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')
);

:おかげ
@ user81655274 => 246バイト
@ edc65246 => 238のバイト


1
私は非常に徹底的に見ていないが、ここであなたが作ることができ、いくつかの改良点です:変更Math.ceil(e[c].length/2)(r=e[c].length/2)+r%1Array(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

JavaScript 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

Python 3(290バイト)

Ashwin Guptaの答えに似ていますが、Pythonのカレンダーモジュールを利用して、すべての月名を書き出すことを避けます。

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)

Python 2は、整数除算で数バイトを切り取り、の括弧を失いますprint


1

Python、558 554バイト

Pythonでこれを行う方法の、本当に、本当に、本当に恐ろしいほどゴルフの例です。申し訳ありませんが、私はこのゴルフ用品に非常に悪いですD:。それでも動作します。これを簡単にする方法はたくさんあると思うので、コメントで知らせてください。 ゴルフ:

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)

非ゴルフ

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...)。また、int1文字の大文字のvarsのように頻繁に使用される呼び出しを設定することは冒険的かもしれません
cat

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つ)を実行して、それが正常に動作するかどうかを確認してください。
アシュウィングプタ

1
@sysreqええidk。なぜ彼にとって違うのか。とにかく、ヒントをありがとう、私はまだPythonが初めてなので、ゴルフだけでなく一般的にも本当に役立ちます。また、oとtの初期割り当てを削除し、配列要素をスプリッターに直接配置することで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));}

Javascriptの答えに対抗できると思った。しかたがない。

小さくすることができ、あいまいな日付に使用したコードが気に入らないと思います。もっと良い方法があると思います。

ゴルフをしていない:

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.