날짜 형식 분쟁 해결


17

날짜 형식 지정 순서는 오늘날 세계가 직면하는 가장 복잡하고 분열적인 문제 중 하나입니다. 우리 중 일부는 Month / Day / Year가 적절하다고 주장합니다. 다른 사람들은 일 / 월 / 년이 최고라는 것을 큰 소리로 선언합니다. 왜냐하면 그것들은 그들이 나타내는 기간의 오름차순으로 항을 넣기 때문입니다.

그만하면 충분 해. 컴퓨터는이 분쟁을 간단하고 공정하게 해결할 수 있습니다. 완전한 함수 또는 프로그램 인 코드는 슬래시로 구분 된 날짜 문자열을 사용합니다 (예 :) 12/1/2015. 이것은 선행 0이없고 끝에 4 자리 연도가있는 정확한 형식입니다.

  • 그것의 경우 확실히 월 / 일 / 년, 예를 들어 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.

입력 날짜가 Month / Day / Year 또는 Day / Month / Year (예 : 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
가치있는 일을 위해, 일-월-년을 주장하는 많은 사람들도 날짜 순서대로 말합니다. (물론, Real Programmers는 일 년 월 일을 주장합니다).
피터 테일러

확실하게 : without leading zeroes and with a four-digit year at the end암시year >= 1000
edc65

맞습니다.
Luke

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 30498288288 바이트

순수 또는 익명 함수, 즉 고유 이름이없는 함수를 사용합니다.

DateString날짜가 애매한 경우 오류 메시지를 반환합니다. Check모호성을 포착하고 문제의 날짜를로 전송하여 DateList3 개의 정수 (로 생각되는) 목록으로 변환합니다 {year, month, day}. 월 및 일 정수는 크기별로 정렬되며 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 년 Maust 6", "2012 년 9 월 10 일", "2012 년 1 월 1 일"}


나는 개인적으로 당신이 그 0을 제거하는 것을보고 싶지만, 투표가 떨어지는대로 내버려 둘 것입니다.
Luke

요청 된대로 "2012 년 1 월 1 일"을 반환합니다.
DavidC

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 개월 대신 두 달 이름을 생성합니다!

언 골프 드 :

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>he[i]e[+i], 마지막 삼항 연산자에서 불필요한 괄호를 제거, 또한 newDate해야한다 new Date.
user81655 5

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 바이트)

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)

파이썬 2는 정수 나누기와 괄호를 잃어 몇 바이트를 잘라야합니다 print.


1

파이썬, 558554 바이트

파이썬 에서이 작업을 수행하는 방법에 대한 정말, 정말, 정말 끔찍한 골프 예입니다. 미안, 나는이 골프 물건에 매우 나쁘다 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...). 또한 int단일 문자 대문자 변수 와 같이 자주 사용되는 통화를 설정하는 것이 유리할 수도 있습니다.
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)
cat

1
@ sysreq ok 내 마음이 공식적으로 날아갔습니다. 함수를 변수에 저장할 수 있다는 것을 몰랐습니다. 감사합니다. 나는 그것을 편집 할 것이다. 또한, 당신은 나에게 호의를 베풀고 내 코드 (골프 코드)를 실행 해보고 누가 루크가 나와 다른 결과를 얻는 것처럼 보이기 때문에 그것이 정상적으로 작동하는지 확인할 수 있습니까?
Ashwin Gupta

1
@sysreq 예 idk. 왜 다른가요? 어쨌든, 팁에 다시 한 번 감사드립니다. 그것은 여전히 ​​파이썬을 처음 사용하기 때문에 골프뿐만 아니라 일반적으로 도움이됩니다. 또한 방금 배열 요소를 내 스플리터에 직접 넣어서 o와 t의 초기 할당을 제거하고 4 바이트를 절약 할 수 있음을 깨달았습니다. 오늘 오후에이 모든 사항을 변경하겠습니다. 덕분에 새로운 바이트 수가 현저히 줄어 듭니다!
Ashwin Gupta

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.