내 자유 형식 날짜를 읽으십시오


10

다음 형식 중 하나로 작성된 날짜 (동일한 프로그램에서 모두 처리해야 함)가 있으면 유효한로 구문 분석하십시오 yyyy/mm/dd date.

17th May 2012
March 14th, 2016
20 February 2014
September 14, 2017
Sunday, June 8, 2015

규칙

  • 날짜는 때때로 유효하지 않습니다. 한 달의 월 또는 월 수가 틀린 경우 두 경우를 모두 처리해야합니다. 일관된 잘못된 값을 오류로 표시하거나 반환하여 선택합니다. (그러나 위의 템플릿 형식을 고수합니다)
  • 10 자리 미만의 일 및 월에 대한 패딩을 사용하여 두 자리 출력을 작성해야합니다.
  • 월 이름은 항상 전체 이름이되며 3 자로 단축되지 않습니다.
  • 연도가 항상 0000-9999 범위 내에 있다고 가정 할 수 있습니다.
  • 음수는 처리 할 필요가 없습니다.
  • 전체 프로그램 또는 함수를 작성하여 출력을 모든 형식으로 만들거나 콘솔에 인쇄하거나 함수에서 리턴 할 수 있습니다.
  • 입력은 항상 문자열이되고, 출력이 배열에서 단일 인수로 사용하는 것이 더 짧은 경우 출력은 항상 문자열이어야합니다. ["17th May 2012"]그렇게 할 수 있고 출력은 동일 할 수 있습니다["2012/05/17"]
  • 입력의 철자가 올바른 것으로 가정 할 수 있습니다.

보너스 : 여기 도전을 좋아하지 않는 친구들;)

입력 형식도 허용 할 수 The Fourteenth of March, 2016있거나 최종 바이트 수가 1 미만인 코드에서 20 바이트를March the Fourteenth, 2016 추가로 빼면 1이됩니다.

철자에 대한 혼동을 피하기 위해 각 요일에 대한 전체 서면 번호는 다음과 같습니다.

First, Second, Third, Fourth, Fifth, Sixth, Seventh, Eighth, Nineth, Tenth, Eleventh, Twelfth, Thirteenth, Fourteenth, Fifteenth, Sixteenth, Seventeenth, Eighteenth, Nineteenth, Twentieth, Twenty First, Twenty Second, Twenty Third, Twenty Fourth, Twenty Fifth, Twenty Sixth, Twenty Seventh, Twenty Eighth, Twenty Nineth, Thirtieth, Thirty First

테스트 사례

INPUT                           | Output
17th May 2012                   | 2012/05/17
March 14th, 2016                | 2016/03/14
20 February 2014                | 2014/02/20
September 14, 2017              | 2017/09/14
Sunday, June 8, 2015            | 2015/06/08
1st January 1918                | 1918/01/01

The Fourteenth of March, 2016   | 2016/03/14
March the Fourteenth, 2016      | 2016/03/14
November the Seventeenth, 2019  | 2019/11/17
The Thirtieth of April, 2016    | 2016/04/30

30 February 2014                | Invalid
September 99, 2017              | Invalid
Sunday, June8, 2015             | Invalid

The Thirty First of April, 2016 | Invalid


10
" 여기서 도전을 좋아하지 않는 사람들 "-그들이 보너스의 형태로 올 때, 우리 모두는 그렇지 않습니다! 그리고 입력 유효성 검사를 부울합니다.
Shaggy

3
Mr.Xcoder 나는 전체 과제는 복수의 입력 형식을 지원하는 것입니다 생각 @ .. 상황이 좋아하는 20 February 2014최신 파서의 많은 지원 기본이지만, 17th그리고 Sunday, June 8, 2015좀 더 어려운 (언어에 따라) 구문 분석 할 수 있습니다.
Kevin Cruijssen '

1
@ Mr.Xcoder 나는 그것이 재미 있고 지루하고, 쉬움 / 어려우며, 좋고 / 나쁜 코드-골프 도전이라고 결코 말하지 않았다. 나는 챌린지에서 읽은 것을 기반으로 여러 입력 형식 지원이 챌린지의 주요 목표 인 것 같습니다. 나는 5 개의 입력 형식 또는 1 년, 월 및 일 (현재 내 접근 방식)을 추출하는 정규식의 경우 if-else 일 것입니다.
Kevin Cruijssen

3
요일은 항상 정확합니까? 겠습니까 Thursday, August 25, 2017유효? DOW를 무시한 제출물이 보입니다.
벤자민 Cuningham

답변:


4

레일, 41 , 37 35 바이트

->x{x.to_date.strftime('%Y/%m/%d')}

Rails의 온라인 통역사를 모르지만 다음은이 절차를 보여주는 스크린 샷입니다.

여기에 이미지 설명을 입력하십시오


온라인 통역사 링크?
Jonathan Allan

1
이것은 실제로 모든 형식에서 작동합니까? : o
완전히 인간적인

@totallyhuman 결과를 보여주는 스크린 샷을 추가했습니다. 불행히도 나는 온라인 통역사를 모른다 :(
Suever

8

PowerShell , 91 89 91 56 바이트

date("$args"-replace'th|rd|st|(\b.*)day|,')-f yyyy/MM/dd

온라인으로 사용해보십시오!

입력을 문자열로받습니다. a -replace를 사용하여 정크를 제거한 다음 내장 Get-Date명령을 -format 플래그 와 함께 사용하여 필요한 yyyy/MM/dd형식 을 지정하십시오 . 해당 문자열은 파이프 라인에 남아 있으며 출력은 암시 적입니다.

Mr Xcoder 덕분에 2 바이트를 절약했습니다. TessellatingHeckler의 정규식 골프 덕분에 엄청난 덩어리가 절약되었습니다.


1
경쟁적인 PowerShell 제출을보십시오!
Outgolfer Erik

@EriktheOutgolfer 날짜 조작은 PowerShell의 장점 중 하나입니다.
AdmBorkBork


@ Mr.Xcoder "모든 것"= 2. lol. 감사!
AdmBorkBork

''날짜 형식에서 -2를 제거 할 수 있습니다 . "맞춤법이 맞습니다"를 고려하여 접근 방식을 고수하려는 경우 바꿀 수 'th|rd|st|(\b.*)day|,'있으며 56 바이트로 떨어지고 같은 경우를 처리 할 수 있습니다 . 요일을 삭제하면 Sunday, June8, 2015 | Invalid월요일이므로 케이스를 수령 할 수 없기 때문에 잘못되었다고 생각합니다 . 오류가 발생하지만 유효한 것으로 구문 분석합니다. 그 결정이 무엇인지, 다른 사람들이 그것을 확인하고 있는지 확실하지 않습니다.
TessellatingHeckler

4

PHP, 73 164 + 1 바이트

for(preg_match("#(\d+)[^\d]+(\d+)#",$d=$argn,$r);$m++<12;)strpos(_.$d,date(F,strtotime($r[2].-$m)))&&printf(checkdate($m,$r[1],$r[2])?"$r[2]/%02d/%02d":E,$m,$r[1]);

파이프로 실행 -nR하거나 온라인으로 사용해보십시오 .

날짜 확인은 정말 비쌌습니다. 내장을 사용하기 전에 날짜를 분해 한 다음 달 이름을 시도하고 오류를 범해야했습니다.


하나만 아니라 모든 형식을 지원해야한다고 생각합니까?
Outgolfer Erik

1
@EriktheOutgolfer 않습니다. 그러나 보너스 형식은 아닙니다.
Titus

@EriktheOutgolfer 모든 형식을 처리합니다.
Mr. Xcoder

1
유효하지 않은 날짜에 대해서는 실패합니다. 30 February 2014을 반환합니다 2014/03/02. 일관된 잘못된 값을 오류로 표시하거나 반환하여 선택합니다. (그러나 그들은 위의 템플릿 형식을 고수 할 것입니다)
Mr. Xcoder

@ Mr.Xcoder 그것은 꽤 그것을 파괴 ...
Titus

3

파이썬 3 + ParseDateTime을 라이브러리 (152) 139 155 153 바이트

Jonathan Allan 덕분에 13 바이트 절약

유효하지 않은 길이의 날짜를 처리하기 위해 16 바이트를 추가했습니다.

람다 할당을 제거하여 2 바이트 절약

lambda s:re.search(f'(^| ){str(h(s)[0].tm_mday)[:2]}[^\d]',s)and time.strftime('%Y/%m/%d',h(s)[0])
import parsedatetime as p,time,re
h=p.Calendar().parse

온라인으로 사용해보십시오!

보너스 날짜를 지원하지 않습니다


PPCG에 오신 것을 환영합니다! 좋은 첫 번째 게시물. 다음 을 사용하여 13 바이트 를 절약하십시오 None. import ...as; & A lambda재이용 parseh.
Jonathan Allan


1

자바 (OpenJDK 8) , 190 + 26 = 216 바이트

import java.time.format.*;

s->DateTimeFormatter.ofPattern("uuuu/MM/dd").format(DateTimeFormatter.ofPattern("[EEEE, ][d ]MMMM [d, ]uuuu").withResolverStyle(ResolverStyle.STRICT).parse(s.replaceAll("(\\d)[a-z].","$1")))

온라인으로 사용해보십시오!

중요 사항 : 요일을 버리지 않고 요일을 확인하는 것이 더 짧아서 확인이 포함되었습니다!

나는 SimpleDateFormat2 월 30 일과 같은 날짜를 모두 받아 들인 명백한 경우를 넘어서 시도하지 않았다 . 그래서 나는 그것을 버리고 Java 8을 사용했습니다 DateTimeFormatter.

설명

"[EEEE, ][d ]MMMM [d, ]uuuu"

이 형식은 다음을 의미합니다.

  • 선택적인 요일 다음에 쉼표와 공백 [EEEE, ]()이 발생합니다 Sunday, ....
  • 공백이있는 선택적 요일이 뒤 따릅니다 [d ].
  • 전체 문자 MMMM와 공백으로 한 달 뒤에
  • 쉼표와 공백이있는 선택적 요일이 뒤 따릅니다 [d, ].
  • 그 다음 해에 이어 uuuu파서에게 우리가 그레고리오 시대에 있다는 것을 알립니다.

암호:

import java.time.format.*;                                     // Required for DateTimeFormatter, *and* ResolverStyle

s->DateTimeFormatter.ofPattern("uuuu/MM/dd")                   // Output format
  .format(
    DateTimeFormatter.ofPattern("[EEEE, ][d ]MMMM [d, ]uuuu")  // Input format
      .withResolverStyle(ResolverStyle.STRICT)                 // Invalidates xxxx-02-30 instead of transforming it into xxxx-02-28
      .parse(
        s.replaceAll("(\\d)[a-z].","$1")                       // remove st, nd, rd, th
       )
    )

크레딧

  • Neil 덕분에 정규 표현식에서 2 바이트.

1
replaceAll패턴에 괄호가 필요 합니까?
Neil

내가 아닌 것 같습니다. 감사합니다, @Neil!
Olivier Grégoire

1

자바 스크립트 (ES6) 124 122 바이트

f=
s=>(d=new Date(s.replace(/.[dht]\b/,'')+' +0')).getDate()==s.match(/\d\d?/)&&d.toISOString().replace(/-(..)(T.*)?/g,'/$1')
<input oninput=o.textContent=f(this.value)><pre id=o>


(UTC 문제? UTC + 2에 있음) 및 또는 중 하나를 반환 2015/06/07합니다 . June 8, 2015falseSunday, June 8, 2015Monday, June 8, 2015
Olivier Grégoire

1
@ OlivierGrégoire 지적 해 주셔서 감사합니다. 나는 서머 타임 이외의 영국에서 날짜 만 시도 했으므로 이미 UTC를 사용하고 있었고 평일로 끝나는 시도하지 않았습니다 nday.
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.