이 날짜 형식은 무엇입니까?


11

그레고리력의 경우 날짜 형식은 국가마다 다릅니다. 인식되는 세 가지 주요 형식이 있습니다.

  1. YY-MM-DD (빅 엔디안)
  2. DD-MM-YY (리틀 엔디안)
  3. MM-DD-YY (중간 엔디안)

당신의 임무는 날짜를 나타내는 입력 문자열이 주어지면이 문자열을 날짜로 해석 할 수있는 모든 가능한 날짜 형식을 출력하는 프로그램을 작성하는 것입니다.

규칙

  • 입력 날짜는 형식으로 xx-xx-xx되어 있으며 각 필드는 두 자리 숫자이며 0으로 채워집니다.
  • 날짜는 항상 유효합니다 (따라서 14-13-17과 같은 것을 얻을 수 없습니다)
  • 날짜는 항상 위의 형식 중 하나 이상이므로 17-14-11과 같은 것을 얻을 수 없습니다.
  • 우리는 실제로 평행 세계에 있기 때문에, 매월 31 일이 있으며 결과적으로 윤년이 없습니다.
  • 날짜는 2001 년 1 월 1 일과 2099 년 12 월 31 일 사이입니다.
  • 날짜에 하나의 형식 만있는 경우 코드는 해당 형식 만 인쇄해야합니다 (마지막 줄 바꿈 만 허용됨)
  • 날짜 형식이 여러 개인 경우 쉼표, 공백, 줄 바꿈 또는 이들의 조합으로 구분해야합니다.
  • 형식의 정확한 이름을 출력해야합니다. 고유 한 임의의 값을 사용할 수 없습니다.
  • 후행 공백 이외의 선행 또는 후행 문자는 허용되지 않습니다.
  • 출력은 소문자 여야합니다
  • 내장 날짜 또는 달력 기능을 사용할 수 없습니다
  • 출력 형식을 정렬 할 필요는 없습니다

Input      Output
30-05-17   big-endian, little-endian
05-15-11   middle-endian
99-01-02   big-endian
12-11-31   big-endian, little-endian, middle-endian
02-31-33   middle-endian

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다. 설명이 권장됩니다.


3
당신은 아마 확실히 답변이 이상한 경우를 지원하기 위해 월 31 일을 사용하여 테스트 케이스를 추가해야합니다 : P
ETHproductions

세 가지 유효한 형식에 대해 세 가지 고유 한 값을 출력 할 수 있습니까, 아니면 세 개의 정확한 문자열이어야합니까?
ETHproductions

3
there are 31 days for every month of the year, and consequently no leap years그렇다면 이것은 어떤 날짜 라이브러리도 효과적으로 쓸모가 없다는 것을 의미합니까?
TheLethalCoder 15:53에

1
@TheLethalCoder 예, 대부분의 날짜 라이브러리는 아마도 사용할 수 없습니다.
Jim

1
있습니다 더 많은 형식 이 아웃.
ugoren

답변:


3

05AB1E , 40 바이트

'-¡©2£13‹`®Á2£32‹*)˜“Œ±„¥„ê“#Ï’-„–ian’«»

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

설명

'-¡©                                      # split on "-" and store a copy in register
    2£13‹                                 # compare the first 2 elements to 13
         `                                # split as separate to stack
                                          # the bottom element is true if it is middle endian
                                          # the top value is true if it can be big/little
          ®Á                              # retrieve the list from register and rotate right
            2£32‹                         # compare the first 2 elements to 32
                 *                        # multiply with the result of the comparison to 13
                  )˜                      # wrap in a flattened list
                    “Œ±„¥„ê“#             # push the list ['middle', 'big', 'little']
                             Ï            # index into this with the flattened list
                                          # this leaves the types the date could be
                              ’-„–ian’«   # append "-endian" to each
                                       »  # join on newlines

4

파이썬 2 , 123 바이트

a,b,c=map(int,input().split('-'))
for a,b,c in[[b,c,'big'],[b,a,'little'],[a,b,'middle']]:print(c+'-endian')*(a<13)*(b<32),

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


Python 2 , 적은 입력 구문 분석, 123 바이트

d=input()
for a,b,c in[[3,6,'big'],[3,0,'little'],[0,3,'middle']]:print(c+'-endian')*(int(d[a:a+2])<13)*(int(d[b:b+2])<32),

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


줄 바꿈으로 구분할 수 있으므로 후행을 제거 할 수 있습니다 ,.
Jonathan Allan

4

자바 스크립트 (ES6) 121 119 118 112 바이트

후행 공백이있는 공백으로 구분 된 문자열을 반환합니다.

s=>['big','little','middle'].map((v,i)=>[b<13&c<32,b<13&a<32,a<13][i]?v+'-endian ':'',[a,b,c]=s.split`-`).join``

어떻게?

입력을 a , bc 로 나눕니다 . 날짜가 유효하기 때문에 b 가 32보다 작다는 것을 알고 있습니다 . 따라서 중간 엔디안 형식의 유효성을 검사하기 위해 a 가 13보다 작은 지 테스트하면 충분 합니다. 리틀 엔디안 및 빅 엔디안 형식은 b 가 13보다 작아야하고 ac대한 다른 테스트가 각각 하루를 확인해야합니다.

따라서 3 가지 테스트 :

  • 빅 엔디안 : b <13 & c <32
  • 리틀 엔디안 : b <13 & a <32
  • 중간 엔디안 : <13

테스트 사례


3

배시, 240 125 116 112 바이트

IFS=- read a b c<<<$1
d=-endian
((b<13))&&(((a<32))&&echo little$d;((c<32))&&echo big$d);((a<13))&&echo middle$d

골프.

몇 가지 팁을위한 manatwork 덕분에

Arendul 응답의 중간 엔디안에서 32 개 미만의 검증을 제거하여 9 바이트를 절약했습니다.

배열 대신 다른 변수를 사용하여 4 바이트 절약

그것을 테스트하십시오!


Bash의 골프 팁 에는 몇 가지 산술 관련 팁 이 있습니다. 약간 줄일 수 있습니다 : 온라인으로 사용해보십시오!
manatwork

@manatwork에게 감사합니다. 북마크에 추가 된 질문은 매우 유용합니다. 골프를
해보세요

1

C #, 180 바이트

t=(n,m)=>int.Parse(n)<13&int.Parse(m)<32;s=>{var a=s.Split('-');return$"{(t(a[1],a[2])?"big-endian":"")} {(t(a[1],a[0])?"little-endian":"")} {(t(a[0],a[1])?"middle-endian":"")}";};

공백으로 구분 된 값만있는 출력에는 선행 및 후행 공백이있을 수 있습니다. 필요한 경우 OP가 해당 지점에서 명확 해지면 업데이트됩니다.

풀 / 포맷 버전 :

Func<string, string, bool> t = (n, m) => int.Parse(n) < 13 & int.Parse(m) < 32;

Func<string, string> f = s =>
{
    var a = s.Split('-');

    return $"{(t(a[1], a[2]) ? "big-endian" : "")} {(t(a[1], a[0]) ? "little-endian" : "")} {(t(a[0], a[1]) ? "middle-endian" : "")}";
};

나는 그 규칙을보다 명확하게했다.No leading or trailing characters others than a trailing space are allowed
Jim


1

배치, 138 바이트

@echo off
set/ps=
call:l little %s:-= %
exit/b
:l
call:e big %4 %3
call:e middle %3 %2
:e
if %2 leq 31 if %3 leq 12 echo %1-endian

@ovs의 답변을 모호하게 모호하게합니다.


1

자바 232 바이트

(String s)=>{String[]i=s.split("-");String e="-endian",b="big"+e,m="middle"+e,l="little"+e;int p=Integer.valueOf(i[0]);System.out.print(p<13?Integer.valueOf(i[1])<13?Integer.valueOf(i[2])<32?b+","+m+","+l:m+","+l:m:p<32?b+","+l:b);}

여기 더 좋은 버전이 있습니다

String[] i = s.split("-");

String e = "-endian",
       b = "big" + e,
       m = "middle" + e,
       l = "little" + e;

int p = Integer.valueOf(i[0]);

이 부분을 어떻게 포맷해야할지 몰랐습니다 ...

System.out.print(
        p < 13 ? Integer.valueOf(I[1]) < 13 ? Integer.valueOf(I[2]) < 32 ? b + "," + m + "," + l
                                                                         : m + "," + l
                                            : m 

               : p < 32 ? b + "," + l 
                        : b
);

1
너무 많은 엔디 언 : String e="-endian",b="big"+e,m="middle"+e,l="little"+e;.
manatwork

좋은 점은, 그렇게하지 않기로 결정했을 때 바이트 수에 여분의 "문자열"을 포함하고있었습니다. @manatwork
cheemcheem

1

PHP, 131 바이트

[$a,$b,$c]=explode('-',$argn);foreach([[big,b,c],[little,b,a],[middle,a,b]]as[$t,$x,$y])echo$$x*$$y&&$$x<13&$$y<32?"$t-endian ":"";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.