2014年永恒-PCG.SE新年拼图2015


29

因此,现在是2015年,去年难题中的许多答案 现在开始产生无效的输出,是时候来讨论涉及数字2015的问题了。

除了...为什么?如果您对上一年问题的基于日期的答案仍然有效,您是否不喜欢它?我们为什么不更改日历以使其永远不会是 2015年,而我们只是继续生活到2014年,直到永远?

让我们定义一个新的日期符号,称为Eternal 2014符号,如下所示:

  • 对于2014年及之前的日期,该日期将与多长时间公历中的日期相同
  • 这是多年来2015年及以后的日期,今年将保持到2014年,该月将是这将是,如果在2014年同月周期要继续永远过去一个月12.所以数量2015-02-082014-14-08,并且2020-12-312014-85-02。请注意,由于2014年不是a年,因此不考虑leap日。

您的任务是构建一个程序或函数,该程序或函数将以朱利安天文数据作为输入,并以Eternal 2014表示法以YYYY-MM-DDDD/MM/YYYY格式返回一个字符串,该字符串的日期与该朱利安日期相对应。

您可能会假设输入的儒略日始终是1721426(1月1日,1日)至2914695(3268年1月23日,包括)的整数。年份可能包含前导零以填充至4位数字,但月和日必须始终具有前导零以填充至两位数(并且年份可能不包含前导零以填充至除4之外的任何数字)。

以下是所有可接受格式的一些示例输入及其输出:

> 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票赞成。
JoeZ。2015年

Answers:


12

Python 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(1,41214)到给定的日期,这每天循环,从而使当前的日期,月份和年份随时间增加。最后一个测试用例在我的计算机上花费了大约一秒钟。

输出以第二种格式打印:

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

空载(公顷):

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.