취소 날짜 합법화


18

입력:

데이트하기가 (포함 dd, MMyyyy). 날짜 오브젝트 또는 세 개의 개별 정수도 입력으로 유효합니다.

산출:

각 부분 ( dd, MMyyyy)은 개별적으로 되돌려지고 가장 가까운 유효한 날짜로 반올림됩니다.

(형식 예 dd-MM-yyyy)
21-10-2016된다12-01-6102

도전 규칙 :

  • dd, MM, yyyy유효하지만 순서와 어떤 당신이 사용하는 별도의-기호는 자신의 선택입니다.
    따라서 다음은 유효한 형식 예입니다. dd-MM-yyyy; MM/dd/yyyy; yyyy MM dd; ddMMyyyy등입니다.
    다음은 일부 잘못된 형식 예입니다. dd MMM yyyy; dd-MM-'yy; 기타
  • 언어에서 날짜를 나타내는 문자열 대신 3 개의 정수 매개 변수 또는 언어를 지원하는 경우 날짜 개체 만 입력하도록 선택할 수도 있습니다.
  • 어떤 날짜 형식을 사용했는지 알려주십시오! (그리고 입력과 출력은 같은 형식이어야합니다.) 또한 모든 테스트 사례와 아래의 챌린지 규칙을 처리 할 수있는 경우 Date-object를 출력 할 수 있습니다.
  • 이 도전에서는 율리우스에서 그레고리력으로의 전환이 무시됩니다. 따라서 1582유효한 역년이됩니다 2851.
    유효한 모든 연도, 월 및 일에 대한 도전 정보 / 팁을 참조하십시오.
  • 2 월을 다른 달과 반대로 뒤집을 수 없기 때문에 윤년에 대해 걱정할 필요가 없습니다.

모든 역년, 월 및 일 :

  • 연도는 문제없이 0001 (역전 1000)에서 9999 (유지 9999) 까지 항상 역전 될 수 있습니다 . (따라서 0000유효한 입력이 아니며 테스트 사례도 없습니다.)
  • 당신이 취소 할 수있는 유일한 달은 다음과 같습니다 : 1 월 (10 월에서 반전 / 10); 10 월 (1 월에서 반전 / 01); 11 월 (11 월 / 일 11); 그리고 12 월 (격월에서 반전 / 02- 09, 12).
  • 되돌릴 수있는 유일한 날은 다음과 같습니다 : 01 (에서 반전 10), 02 (에서 반전 20), 03 (에서 반전 30), 10 (에서 반전 01), 11 (남은 11), 12 (에서 반전 21), 13 (에서 반전 31) , 20 (로부터 반전 02) (21) (역에서 12) 22 (유적 22) (30) (역에서 03또는 동일한 31 11 월!) (31) 에서 반전 ( 04- 09/ 13-19/ 23- 29).

일반 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙 이 귀하의 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수와 함께 함수 / 방법 및 반환 문 / 출력, 전체 프로그램을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 링크를 추가하십시오.
  • 또한 필요한 경우 설명을 추가하십시오.

테스트 사례 ( dd-MM-yyyy형식) :

21-07-2016   ->   12-12-6102
12-11-1991   ->   21-11-1991
01-01-2000   ->   10-10-0002
27-08-1875   ->   31-12-5781
18-12-2010   ->   31-12-0102
13-01-1981   ->   31-10-1891
04-11-1671   ->   30-11-1761  // Semi-tricky case, since November has 30 days
28-11-2036   ->   30-11-6302  // Semi-tricky case, since November has 30 days
14-06-1855   ->   31-12-5581
30-10-9999   ->   03-01-9999
01-01-2851   ->   10-10-1582

@ LegionMammal978 아니요, 로 반올림되어 21-07-2016되돌아갑니다 . 당신이 결과를 얻는 방법을 잘 모르겠다 ..12-70-610212-12-6102##-10-6107
Kevin Cruijssen

@KevinCruijssen 좋아, 나는 70년이 증가 하면서 달이 감겨 있다고 생각했다 .
LegionMammal978

10-10-2세 번째 경우에 유효 출력은?
Luis Mendo

@LuisMendo 그래. 다른 사람들도 그렇게하는 것을 보았습니다. 문제는 입력 또는 출력 형식보다 날짜를 올바르게 뒤집고 반올림하는 것입니다.
Kevin Cruijssen

세 개의 문자열을 사용하고 선행 0을 기대할 수 있습니까?
JustinM-복원 모니카

답변:


3

볼록 , 23 바이트

바이트 수는 CP-1252 인코딩을 가정합니다.

qS/Wf%_1=:=31^sCs¶.e<S*

I / O 형식은 dd mm yyyy입니다.

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

이것은 내 CJam 답변 의 직접 포트입니다 . Convex는 CJam을 기반으로하므로 유일하게 다른 점은 Convex의 연산자를 사용 하여 상위 2 개의 스택 요소를 목록으로 감싸서 바이트를 절약하는 것 [...]입니다.


8

CJam, 24 바이트

qS/Wf%[_1=:=31^sCs].e<S*

I / O 형식은 dd mm yyyy입니다.

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

동일한 바이트 수, I / O 형식 mm dd yyyy:

qS/Wf%_0=:=1231^s2/.e<S*

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

설명

qS/     e# Read input, split around spaces.
Wf%     e# Reverse each component.
[       e# Set marker for new list.
  _1=   e#   Duplicate reversed strings, extract reversed month.
  :=    e#   Check for equality of the characters. This gives 1 for
        e#   November (11) and 0 for everything else.
  31^   e#   XOR the result with 31, giving 30 for November and 31
        e#   for everything else.
  s     e#   Convert the result to a string, "30"/"31".
  Cs    e#   Push 12, convert to string, "12".
]       e# Wrap "30"/"31" and "12" in a list.
.e<     e# Element-wise minimum. This clamps the day and month to their
        e# respective maxima.
S*      e# Join the result with spaces.

다른 버전은 우리가 정수에서 시작하는 것을 제외하고, 유사하게 작동 1230또는 1231으로 변환하기 전에 ["12" "30"]["12" "31"].


2
날짜가 내장 된 언어 ...
Leaky Nun

1
@LeakyNun 이것은 내장 날짜를 사용하지 않으며 그것이 어떻게 도움이되는지 보지 못합니다.
Martin Ender

그렇다면 11 월에 30 일이 있다는 것을 어떻게 알 수 있습니까?
Leaky Nun

2
@LeakyNun 나중에 설명을 추가하지만 역월을 1=가져 와서 :=숫자가 같은지 확인 ^하고 결과를 31로 xors하여 월 30을 11, 31을 다른 모든 것에 제공합니다.
Martin Ender

아, 나는 사양을 읽지 않았다 ...
Leaky Nun

5

Pyth, 55 53 46 43 41 바이트

APJ_Mczd = HhS, 12sH = GhS, sGC @. "❤❤ó»î"H % "% 02d % 02d % s"[GHeJ 
APJ_Mczd = hS, 12sH = hS, sGC @. "❤❤ó»î"H % "% 02d % 02d % s"[GHeJ 
APJ_Mcz \-% "% 02d % 02d % s"[hS, sGx31q11sHhS, 12sHeJ 
APJ_Mczdjd [> 2+ \ 0hS, sGx31q11sH> 2+ \ 0hS, 12sHeJ
APJ_Mczdjd. [L \ 02 [`hS, sGx31q11sH`hS, 12sHeJ

여기서 ❤❤U + 001C와 U + 001F라는 두 가지 인쇄 할 수없는 위치 가있었습니다.

테스트 스위트.


3

파이썬 3, 82 바이트

lambda x:[min(x[0][::-1],['31','30'][x[1]=='11']),min(x[1][::-1],'12'),x[2][::-1]]

인수를 통해 날짜를 양식의 문자열 목록으로 입력 ['dd', 'mm', 'yyyy']하고 유효성이 검증 된 역 날짜를 동일한 형식으로 반환 하는 익명 함수입니다 .

작동 원리

파이썬은 문자와 문자열을 유니 코드 코드 포인트로 비교합니다. 이는 두 개 이상의 정수를 비교할 때 해당 정수를 문자열로 비교할 때와 동일한 결과를 반환 함을 의미합니다. 따라서 min두 정수를 문자열로 호출 하면 가장 작은 정수를 문자열로 반환합니다. 반전 된 날짜 부분을 하나의 인수로 사용하고 최대 값을 다른 인수로 취하면 일 및 월이 원하는 범위로 고정됩니다. 날짜 - 부품의 단계들에 의해 인덱스 반전 -1( [::-1]), 및 월의 최대 값은 변경 '31''30'달 조건부의 부울 결과리스트로 인덱싱 11 월 경우.

Ideone에서 사용해보십시오


2

Dyalog APL , 32 33 바이트

⍕¨{⍵-3↑31 11≡2↑⍵}31 12 1E4⌊⍎∊⍕⌽¨⎕

I / O는 세 개의 문자열 ( 'dd' 'mm' 'yyyy') 목록입니다 .

TryAPL 이지만 온라인 입력을 가능하게 하기 위해 (입력 프롬프트)로 바뀌고 전체 줄이 {... }로 묶여 있으며 임의의 코드 실행이 차단 되어 (실행 식)이 2⊃⎕VFI(입력 확인 및 수정) 으로 대체되었습니다. .


2

C 번호 314 305 299 249 232 223 바이트

using System.Linq;string f(int d,int m,int y){Func<int,string>r=i=>string.Concat((""+i).PadLeft(2,'0').Reverse());Func<string,int,string>x=(j,k)=>int.Parse(j)>k?""+k:j;return x(r(d),m==11?30:31)+"-"+x(r(m),12)+"-"+r(y);}

변수 선언을 줄임으로써 앨리어싱 문자열이 약간의 바이트를 절약 할 수 있음을 지적한 @KevinCruijssen에게 감사드립니다.

반올림에 대해 동일한 작업을 수행하고 변수 선언을 제거하여 재사용을위한 반전 기능과 다른 13을 저장하는 50 바이트를 저장했습니다.

마지막 업데이트는 앨리어싱 문자열을 더 이상 바이트 세이버로 만들지 않습니다.

언 골프 버전 :

using System.Linq;
    string dateReverse(int day, int month, int year)
{
    //setup a resuable function to reverse
    Func<int, string> reverse = intToReverse => string.Concat((""+intToReverse).PadLeft(2, '0').Reverse());

    //another function for rounding
    Func<string, int, string> round = (strToRound, maxVal) => int.Parse(strToRound) > maxVal ? "" + maxVal : strToRound;

    //Join the strings into the "dd-mm-yyyy" date format
    return 
        //Round down the day value, if november cap to 30 otherwise cap to 31
        round(reverse(day), month == 11 ? 30 : 31) + "-" +

        //Round the month down
        round(reverse(month), 12) + "-" +

        //we can use the reverse function here too and pad left just won't do anything
        reverse(year);
}

여기에서 테스트


using System.Linq;와 함수 사이의 공백을 무시할 수 있으므로 -1 바이트입니다. 또한 var n=...;var e=...;이것을 대신 사용하여 1 바이트로 골프를 칠 수 있습니다. string n=...,e=...;별로 많지 않지만 여전히 -2 바이트입니다. ;)
Kevin Cruijssen

내 바이트 수는 실제로 그것을 계산하지 않은 것처럼 보이지만 그 공간을 잘 잡으면 복사 붙여 넣기 문제가 발생합니다. 또한 변수 선언 스타일을 사용하면 문자열 별칭을 사용하여 몇 바이트 더 이길 수 있다고 생각합니다.
JustinM-복원 모니카

2

자바 스크립트, 106 (105) 94 바이트

d=>d.split`,`.map((a,b,r)=>(e=[...a].reverse().join``,f=!b?r[1]==11^31:b<2&&12,f&&f<e?f:e))+''

테스트 스위트 (개정판 3)


설명

d=>d.split`,`                 // split into sections by `,`

.map((a,b,r)=>(               // map each section

e=[...a].reverse().join``,    // spread a date section into array and reverse and 
                              // join with `` to get string result

f=!b?r[1]==11^31              // if section being mapped is day (section 0), 
                              // then max (f) is 30 for November(month 11) or else 31

:b<2&&12,                     // if part being mapped is month (section 1), then max (f) is 12

f&&f<e?f:e))                  // if there is a max (f)
                              // and the max (f) is less than the reversed string (e),
                              // then return the max (f), 
                              // else return the reversed string (e)

+''                           // join all the sections back together with `,` 
                              // (concatenating [] with a string will do this)

에 1 바이트를 저장해 준 @KevinCruijssen에게 감사 b==1합니다 b<2. ES6 템플릿 리터럴 및 ,구분 기호를 제안하여 11 바이트를 절약 해 준 @Neil에게 감사드립니다 .


나는 JS에 꽤 나쁘다. 그래서 내가 잘못 말하면 수정하지만 바이트를 저장하기 위해 b==1골프를 칠 b<2수는 없습니까? !b?코드 부분 에서 이미 확인 했으므로 더 이상 0이 될 수 없습니다 . 변경하면 테스트 스위트에서 작동하는 것 같습니다.
Kevin Cruijssen

@KevinCruijssen 네, 맞습니다, 감사합니다! 방금 간과했습니다. 나는 자바 스크립트로 골프를
쳐본 적이 없어서

* 나는 '매우 오래'을 의미하고 '매우보기'를 의미하지 않습니다
CShark

2
- 당신이 ES6을 대상으로하고, 당신은 당신의 코드를 단축하는 템플릿 문자열을 사용할 수있는 join``대신에 join(''), 예를 들면 -하지만 당신은 사용하여 좀 더 절약 할 수 있습니다 ,사용하실 수 있습니다 분리기로 +''함께 세 값에 가입 할 수 있습니다.
Neil

@Neil ,입력의 구분 기호로 사용 하시겠습니까?
CShark

1

루비, 92 84 + 1 ( -p플래그) = 93 85 바이트

-분리기로 사용합니다 .

d,m,y=chomp.split(?-).map &:reverse
$_=[[d,m=="11"?"30":"31"].min,[m,"12"].min,y]*?-


0

파이썬 2, 154 바이트

z=input().split("-");r=[x[::-1]for x in z];z[1]=r[1]if r[1]<'12'else '12';z[0]=r[0]if r[0]<'31'else '30'if z[1]=='11'else '31';z[2]=r[2];print "-".join(z)

입력을 문자열로 취하므로 "11-04-2016"과 같이 입력에 따옴표를 지정해야합니다.


파이썬 골퍼가 아니기 때문에 기본적인 개선 사항 : z=[x[::-1]for x in z];z[1]=min(z[1],'12');z[0]=min(z[0],['31','30'][z[1]=='11']);print"-".join(z). 기본적으로, 당신은 사용할 필요가 없습니다 r전혀, 그리고 min당신이 원하는 일을 많이 수행합니다.
가치 잉크

0

05AB1E , 24 바이트

#íÐÅsË31^12‚øεßт+¦}sθªðý

@MartinEnder 의 CJam 응답 포트는 또한 형식의 문자열로 입력 및 출력됩니다 dd MM yyyy.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

#                         # Split the (implicit) input by spaces
                          #  i.e. "04 11 1671" → ["04","11","1671"]
                          #  i.e. "20 01 2000" → ["20","01","2000"]
 í                        # Reverse each string
                          #  i.e. ["04","11","1671"] → ["40","11","1761"]
                          #  i.e. ["20","01","2000"] → ["02","10","0002"]
  Ð                       # Triplicate this list
   Ås                     # Pop one of them, and push it's middle element (the months)
                          #  i.e. ["40","11","1761"] → "11"
                          #  i.e. ["02","10","0002"] → "10"
     Ë                    # Check if the digits are the same (1 for 11; 0 otherwise)
                          #  i.e. "11" → 1 (truthy)
                          #  i.e. "10" → 0 (falsey)
      31^                 # Bitwise-XOR with 31 (30 for November, 31 for other months)
                          #  i.e. 1 → 30
                          #  i.e. 0 → 31
         12              # Pair it with 12
                          #  i.e. 30 → [30,12]
                          #  i.e. 31 → [31,12]
            ø             # Zip/transpose; swapping rows and columns
                          # (implicitly removes year)
                          #  i.e. ["40","11","1761"] and [30,12] → [["40",30],["11",12]]
                          #  i.e. ["02","10","0002"] and [31,12] → [["02",31],["10",12]]
             ε    }       # Map each pair to:
              ß           # Get the minimum (implicitly converts to integer unfortunately)
                          #  i.e. [["40",30],["11",12]] → [30,11]
                          #  i.e. [["02",31],["10",12]] → [2,10]
               т+         # Add 100
                          #  i.e. [30,11] → [130,111]
                          #  i.e. [2,10] → [102,110]
                 ¦        # Remove the first character
                          #  i.e. [130,111] → ["30","11"]
                          #  i.e. [102,110] → ["02","10"]
                   s      # Swap so the triplicated list is at the top of the stack again
                    θ     # Pop and only leave it's last element (the year)
                          #  i.e. ["40","11","1761"] → "1761"
                          #  i.e. ["02","10","0002"] → "0002"
                     ª    # Append it to the list
                          #  i.e. ["30","11"] and "1761" → ["30","11","1761"]
                          #  i.e. ["02","10"] and "0002" → ["02","10","0002"]
                      ðý  # Join the list by spaces (and output implicitly)
                          #  i.e. ["30","11","1761"] → "30 11 1761"
                          #  i.e. ["02","10","0002"] → "02 10 0002"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.