롤오버 캘린더


17

Sandbox에서 Downgoat의 질문 중 하나에서 영감을 얻었습니다 .4 월 31 일이 일 / 월 형식을 사용하는 사람들을 위해 Pi 날로 포함하고 4 월 31 일이 없다고 알려주기 만하면됩니다.

유효하지 않은 월 / 일 형식 의 날짜 문자열 이 제공되면 롤오버를 사용하여 올바른 날짜를 출력하십시오. (매월 롤오버 한 다음 하루 롤오버).

예 :

"15/43" -15 개월 째 43 일로 읽습니다. 먼저, 다음 달에 내년으로 이월하여 3 (3 월)으로 끝납니다. 이제 3 월에는 31 일만 있기 때문에 추가 날짜를 4 월로 롤오버하므로 실제 날짜는 "4/12" (4 월 12 일)로 출력됩니다.

"3/16" -유효한 날짜입니다 (3 월 16 일). 그대로 반환하십시오.

"12/64" -아, 12 월 64 일부터 너무 많은 추억이 있습니다. 12 월은 31 일, 1 월은 31 일입니다. 그래서 정말로 의미하는 것은 "2/2" (2 월 2 일)입니다.

"19/99" -먼저, 19는 7 (7 월)이됩니다. 7 월은 31 일, 8 월은 31 일, 9 월은 30 일이므로 출력은 "10/7" (10 월 7 일)입니다.

"1/99999" -1 년은 365 일입니다. 99999 (mod 365) = 354. 일년 중 354 일은 "12/20" 입니다.

"9999999/10" -분명히 9999999 (mod 12) = 3이므로 "3/10" (3 월 10 일)입니다.

기준 :

입력 월은 0보다 큰 정수입니다. 입력 일은 0보다 큰 정수입니다. 처리 할 윤년이 없으므로 연도를 지정할 필요가 없습니다.

최신 정보:

과제를 과도하게 단순화한다고 생각할 때 Java Calendar 클래스 와 같은 캘린더 기능 은 금지됩니다. 날짜 구문 분석 / 포맷 기능은 여전히 ​​허용됩니다.



1
또 다른 중요한 테스트 사례는 8 년 넘게 롤업 할 수있는 충분한 날짜가있는 것이므로 내장 기능을 사용하는 답변은 윤년을 사용하는 내장 기능에주의를 기울여야합니다.
Martin Ender

오, 그 대답은 ... 나는 내장을 사용하는 Mathematica 답변을 게시하려고했습니다. : /
Martin Ender

@Martin 죄송합니다;).
geokavel

참고로 Mathematica 솔루션의 길이는 여전히 90 바이트 (문자열 처리에 의해 지배적이지만)입니다. 그럼에도 불구하고 그러한 테스트 사례를 추가 1/99999하려면 항복해야 12/19한다고 생각합니다.
Martin Ender

답변:


11

LabVIEW, 32 개 LabVIEW 프리미티브


그것은 빠르다.
Addison Crump

여기에 사용 된 캘린더 기능이 없음을 보증 할 수 있습니까?
geokavel

LabVIEW의 좋은 점은 기본적으로 그것이 보이는 것입니다. 먼저 문자열 2 모듈로에서 숫자를 스캔하면 상자는 28, 30 또는 31을주는 스위치 케이스 구조이며 다시 문자열로 구성됩니다.
Eumel

4

C #, 269 223

string v(string n){var x=new[]{31,28,31,30,31,30,31,31,30,31,30,31};var s=n.Split('/');Func<string,int> p=int.Parse;var m=p(s[0]);var d=p(s[1]);m=m>=12?m%12:m;while(d>x[m]){d-=x[m];m=++m>=12?m%12:m;}return(m==0?1:m)+"/"+d;}

편집 : 24/1, 36/1 등과 같은 경우에 작동하고 약간 골프를 치도록 수정되었습니다. 의견 주셔서 감사합니다, 내가 조금 저장 한 곳이 몇 있습니다!

언 골프 드 :

string v(string n)
{
    var x = new [] { 31 ,28, 31, 30, 31, 30,31, 31, 30, 31, 30, 31 };

    var s = n.Split('/');
    Func<string,int> p = int.Parse;
    var m = p(s[0]);
    var d = p(s[1]);
    m = m >= 12 ? m % 12 : m;
    while (d > x[m])
    {
        d -= x[m];
        m = ++m >= 12 ? m % 12 : m;
    }
    return (m==0?1:m) + "/" + d;
}

우선 : 커뮤니티에 오신 것을 환영합니다! 루프에 사전을 할당하거나 스위치 기능을 사용하여 일부 바이트를 절약 할 수 있다고 생각합니다 (여기서는 C # pro 없음). 또한 ´m + "/"+ d´를 직접 인쇄하면 약간 도움이 될 수 있습니다. 그리고 인수에서 문자열 대신 char *를 사용하여 마지막으로 (작동하거나 작동하지 않을 수 있음).
유멜

예를 들어 특정 테스트 사례에서는 실패합니다 24/1.
군단 포유류 978

@Eumel 감사합니다! Console.Write보다 많은 용도 를 직접 인쇄 return하고 C #에서는 char[]에 대한 대체물로 사용 string하지만 같은 양의 문자이므로 /더 문제가 있습니다. 그러나 사전에 대한 당신의 메모는 나를 더 나은 버전으로 이끌었습니다!
DrewJordan

4

R, 208 182 바이트

m=c(31,28,31,30,31,30,31,31,30,31,30,31)
e=scan(sep="/");n=(e[1]/12-1)*12;if(!n%%12)n=12;if(n<0)n=e[1];j=e[2];while((j<-j-m[n])>0){n=n+1;if(n>12)n=1};j=m[n]+j;cat(n,j,sep="/")

음수를 얻을 때까지 현재 달의 일 수를 제거하고, 마지막 단계를 거꾸로 인쇄하여 반복하여 12를 나눈 다음 달을 가져옵니다.

여러 줄에서 (파일을 사용하고 소스를 만들어야 함) :

m=c(31,28,31,30,31,30,31,31,30,31,30,31)
e=scan(sep="/")
n=(e[1]/12-1)*12
if(!n%%12)n=12
if(n<0)n=e[1]
j=e[2]
while((j<-j-m[n])>0){n=n+1;if(n>12)n=1}
j=m[n]+j;cat(n,j,sep="/")

이것은 R에서 프로그램을 실행하려고 할 때 나타나는 메시지입니다. pastebin.com/dPh1n64a
geokavel

이상한 나중에 다시 확인하겠습니다
Tensibai

나도이 메시지를 받았습니다. 프로그램에 몇 달 동안 문제가있는 것 같습니다. 그렇지 않으면 실행 중입니다. pastebin.com/g3BCUDi8
geokavel

피드백을 주셔서 감사합니다. 실제로 도로에 있습니다. 수정하겠습니다
Tensibai

1
@ Tensibai 네 맞아, 내 나쁜 (나는 오류 메시지가 "실제"를 기대한다는 것을 기억해야합니다).
plannapus

3

PHP> = 5.5, 181 바이트

list($m,$d)=explode("/",$argv[1]);$m%=12;$d%=365;$i=0;while($d>100)$d-=[31,28,31,30,31,30,31,31,30,31,30,31][$i++];$m+=$i;echo date_create_from_format("m/d","$m/$d")->format("n/j");

PHP 는 날짜 구문 분석 및 형식 지정 명령만으로 롤오버를 거의 지원합니다. 예를 들면 다음과 같습니다.

echo date_create_from_format("m/d","12/64")->format("n/j"); // Output: 2/2

그러나 두 숫자 중 하나가 100보다 커지면 PHP는 파싱을 거부하고 (아마도 임의의 이유로) 오류를 반환합니다. 따라서이 답변의 이론은 PHP가 구문 분석 할 위치로 다시 가져 와서 제출하십시오 date_create_from_format().

언 골프 드 :

list($month, $day) = explode("/", $argv[1]);
$month = $month % 12;
$day = $day % 365;
$i = 0;
$days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
while($day > 31) $day -= $days[$i++];
$month += $i;
echo DateTime::createFromFormat("m/d", $month . "/" . $day)->format("n/j");

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


1
날짜 문자열을 입력하거나 함수로 만들 수있는 방법을 알려줘야합니다.
geokavel

PHP에서는 GET 매개 변수를 입력 방법으로 사용할 수 없습니다 . 이 함수를 함수로 만들고 입력을 함수 매개 변수로 전달 $argv하거나 STDIN 에서 입력을 가져와야합니다.
Mego

@ Mego Jeeze, OP가 입력에 대한 요구 사항을 명시하지 않았기 때문에 답변을 업데이트 할 시간을주십시오. 변경 $t하기 가 쉽고 $argv[1]명령 줄 입력에서 읽습니다.
nickb December

입력에 대한 OP 요구 사항 요구 사항은 관련이 없습니다. 챌린지 작성자가 모든 챌린지에 대해이를 지정할 필요가 없도록 허용되는 기본 허용 I / O 방법 (내가 링크 한) 목록이 있습니다.
Mego

2

자바 스크립트 (ES6), 106 바이트

s=>eval('q="030101001010";p=s.split`/`;for(d=i=p[1],m=p[0]-1;i--;d>n&&(m++,d-=n))n=31-q[m%=12];m+1+"/"+d')

설명

s=>
  eval(`              // use eval to enable for loop without needing to write {} or return
    q="030101001010"; // q = array of 31 - days in each month
    p=s.split\`/\`;   // p = array of [ month, day ]
    for(
      d=i=p[1],       // d = day
        m=p[0]-1;     // m = month - 1
      i--;            // loop for each day, this is more iterations than needed but extra
                      //     iterations do not affect the result and it's the shortest way
                      //     to guarantee all months have been subtracted from d, it also
                      //     ensures the loop runs at least once to get m % 12
      d>n&&(m++,d-=n) // if too many days, subtract the month's days and increment month
    )
      n=31-q[m%=12];  // n = number of days in month, get m % 12
    m+1+"/"+d         // return the result
  `)

테스트


1

비경쟁 답변-Bash + Coreutils, 55

date -d1-$[(${1%/*}-1)%12+1]-1+$[${1#*/}-1]day +%-m/%-d

"날짜 파싱 / 포맷 기능은 여전히 ​​허용됩니다." - date유틸리티가 허용 된다고 가정합니다 .

명령 행에서 입력을 읽습니다. 예 :

$ ./rollovercal.sh 15/43
4/12
$ 

date 명령이 다음과 같이 확장되어 여러 날이 추가되기 때문에 경쟁이 아닙니다.

date -d1-3-1+42day +%-m/%-d

date.add(875)날짜를 875 일씩 늘리는 것과 같은 일을하지 않는 한 허용됩니다 . 그것은 주로 내가 겪은 일입니다.
geokavel

@geokavel 아, 알겠습니다. 여기서 완전히 확장 된 date명령은 date -d1-3-1+42day +%-m/%-d이므로 정확히 수행합니다. 나는 이것이 :( 다음이 아닌 경쟁 답을 추측
디지털 외상
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.