영원한 2014 — PCG.SE 새해 퍼즐 2015


29

이제 2015 년이었고 작년 퍼즐의 많은 답변 이 이제 잘못된 출력 생성하기 시작했습니다 . 이는 2015 년 숫자와 관련된 질문의 시간입니다.

왜 ... 왜? 작년 문제에 대한 날짜 기반 답변이 계속 유효하다면 마음에 들지 않습니까? 2015 년 이 되지 않도록 달력을 바꾸지 말고 2014 년에 영원히 그리고 영원히 계속 살아가는 것이 어떻겠습니까?

Eternal 2014 notation 이라는 새로운 날짜 표기법 을 다음과 같이 정의 해 보겠습니다 .

  • 2014 년과 그 이전의 날짜는 날짜가 다발성 그레고리력 과 동일 합니다.
  • 2015 년 및 이후의 날짜를 들어, 올해는 2014있을 것, 그리고 달은 2014 년 같은 달의주기가 영원히 지난 달 12 그래서 계속한다면 될 수있을 것이다 2015-02-082014-14-08, 그리고 2020-12-31것이다 2014-85-02. 2014 년이 윤년이 아니므로 윤일은 계산되지 않습니다.

임무는 율리우스 천문 날짜 를 입력으로 사용하고 Eternal 2014 표기법으로 해당 율리우스 날짜에 해당하는 날짜 가 포함 된 프로그램 또는 함수를 형식 YYYY-MM-DD또는 DD/MM/YYYY형식으로 반환 하는 프로그램 또는 함수를 작성하는 것 입니다.

입력 한 율리우스 일은 항상 1721426(1 월 1, 1)에서 2914695(3268 년 1 월 23 일)까지 의 정수라고 가정 할 수 있습니다 . 연도는 앞에 오는 0을 4 자리 숫자로 포함하거나 포함하지 않을 수 있지만, 월과 일에는 항상 앞에있는 0을 두 자리 숫자로 채워야합니다.

다음은 모든 허용 가능한 형식의 입력 및 출력 예입니다.

> 1721426
1-01-01
01/01/1
0001-01-01
01/01/0001

> 2086302
999-12-31
31/12/999
0999-12-31
31/12/0999

> 2456659
2014-01-01
01/01/2014

> 2456789
2014-05-11
11/05/2014

> 2457024
2014-13-01
01/13/2014

> 2457389
2014-25-01
01/25/2014

> 2469134
2014-411-07
07/411/2014

> 2567890
2014-3657-29
29/3657/2014

> 2914695
2014-15059-23
23/15059/2014

귀하의 언어로 된 내장 날짜 처리 라이브러리를 사용할 수 없습니다. 모든 계산은 프로그램의 소스 코드 자체 내에서 알고리즘 적으로 수행해야합니다.

어떤 언어로든 이것을 달성하는 가장 짧은 프로그램 (바이트)이 이깁니다.


3
하하,이 질문은 윈터 배쉬가 시작하자마자 25 개의 찬사를 받는다.
Joe Z.

답변:


12

파이썬 2, 166 바이트

n=input()
d=m=y=1
M=([3]+[3,2]*3)*2
while n>1721426:
 n-=1;d+=1;M[2]=y%400<1or y%4<1<y%100
 if d>M[m%12]+28:m+=1;d=1
 if m>12<2014>y:y+=1;m=1
print'%02d/'*2%(d,m)+`y`

이 날짜는 1 월 1 일 1 일 (1721426)부터 지정된 날짜까지 매일 순환하며 현재 날짜, 월 및 연도를 증가시킵니다. 마지막 테스트 사례는 컴퓨터에서 1 초 정도 걸립니다.

출력은 두 번째 형식으로 인쇄됩니다.

01/01/1
31/12/999
23/15059/2014

3

타조 0.5.0 , 197 바이트

G~:J1401+4J*274227+146097/F3*4/F+38~+:f4*3+:e1461:p%4/F:g5*2+:h153:s%5/F1+:D;hs/F2+12:n%1+:M;ep/F4716-n2+M-n/F+:Y;{2014:Y;D365+:D;{M1-12%[31:x28x 30:yxyxxyxyx]=:dD<.{Dd-:D;M1+:M;}*}(}Y2014-*D"/M"/Y

언 골프 (ha) :

G~:J;
4716:y;1401:j;2:m;12:n;4:r;1461:p;3:v;5:u;153:s;2:w;274277:B;38~:C;
Jj+4J*B+146097/F3*4/F+C+:f;
rf*v+:e;
ep%r/F:g;
ug*w+:h;
hs%u/F1+:D;
hs/Fm+n%1+:M;
ep/Fy-nm+M-n/F+:Y;
{
2014:Y;
D365+:D;
{
M1-12%[31 28 31 30 31 30 31 31 30 31 30 31]=:d
D<.{Dd-:D;M1+:M;}*
}(
}Y2014-*
D"/M"/Y

나는 ... 새해 복 많이 받으세요. 그렇기 때문에 골프를 많이하지 않았습니다. 나중에 더 나아지기 위해 돌아올 수도 있고 아닐 수도 있습니다.

https://en.wikipedia.org/wiki/Julian_day#Gregorian_calendar_from_Julian_day_number의 알고리즘


0

PHP (278)

를 사용하여 명령 행에서 실행하십시오 php -R '<code>'. 플래그는 한 문자로 계산됩니다.

if(0<$N=($n=$argn-1721426)-735233){$n=$N%365+735233;$o=12*($N/365|0);}for($y=1+400*($n/146097|0)+100*(($n%=146097)/36524|0)+(($n%=36524)/1461<<2)+(($n%=1461)/365|0);($n%=365)>=$d=@++$m-2?30+($m+($m>>3)&1):29-($y%4||!($y%100)&&$y%400);)$n-=$d;printf("$y-%02d-%02d",$m+@$o,$n+1);

더 읽기 쉬운 버전 (filename없이 사용하고 -R) :

<?php

// step 1: read the input and fix up 2014 dates
if (0 < $N = ($n = fgets(STDIN) - 1721426) - 735233) {
    $n = $N % 365 + 735233; // wrap around to 2014-01-01
    $o = 12 * ($N / 365 | 0); // compute month offset
}

for (

// step 2: extract year
$y = 1
    + 400 * ($n / 146097 | 0)
    + 100 * (($n %= 146097) / 36524 | 0)
    + (($n %= 36524) / 1461 << 2)
    + (($n %= 1461) / 365 | 0);

// step 3: extract month and day
($n %= 365) >= $d = @++$m - 2
    ? 30 + ($m + ($m >> 3) & 1)
    : 29 - ($y % 4 || !($y % 100) && $y % 400);

) $n -= $d;

// step 4: print date string, adding the month offset
// previously computed in step 1.
printf("$y-%02d-%02d", $m + @$o, $n + 1);

0

C (... gcc 허용) 183

비표준에 대한 많은 경고와 아마도 믿을 수 없을 정도로 휴대하기 쉽지는 않지만 오늘날 내 컴퓨터에서 작동합니다.

y=1;m;d;main(n,a){for(n=atoi(a[1]);n-->1721426;)++d>((m%12<7?m%2==0:m%2!=0)?30:m%12-1?29:y%(y%100?4:400)?27:28)&&(++m,d=0,m>11&&y<2014)&&(++y,m=0);printf("%d-%02d-%02d\n",y,m+1,d+1);}

@grc의 Python 2 답변과 동일한 알고리즘을 사용합니다.

컴파일 후의 출력은

test2014 2086302
999-12-31

test2014 2456659
2014-01-01

test2014 2456789
2014-05-11

test2014 2457024
2014-13-01

test2014 2457389
2014-25-01

test2014 2469134
2014-411-07

test2014 2567890
2014-3657-29

test2014 2914695
2014-15059-23
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.