您的功能或程序应以一年作为输入,并返回(或打印)日期(在公历)的年份复活节(而不是东正教复活节)。返回的日期应按照ISO 8601格式化,但支持时间大于9999 (如312013-04-05或20010130),并且只需要处理大于或等于1583年(采用公历的年份)和小于或等于5701583的年份(因为复活节日期的顺序开始重复)。
示例:
e(5701583) = 5701583-04-10
e(2013) = 2013-03-31
e(1583) = 1583-04-10
e(3029) = 30290322
e(1789) = 17890412
e(1725) = 17250401使用内置函数返回复活节日期是无聊的,因此是不允许的。最短的答案(以字符表示)获胜。
资源:
发布于 2013-04-10 22:43:31
~:^100/.)3*4/.@8*13+25/-^19%.19*15+@+30%.@11/+29/23--.@-^.4/++7%97--^0@.31/100*\31%)+样本使用情况:
$ golfscript.rb codegolf11132.gs <<<2013
20130331请注意,这使用了与大多数当前答案不同的算法。具体来说,我在西恩·切希尔所链接的资源中对Lichtenberg的算法进行了修改,在对这个问题的评论中。
最初的算法假设合理的类型(即不是JavaScript的数字),并根据给定的month*31+day (使用日偏移量为0)进行适配
K = Y/100
M = 15 + (3*K+3)/4 - (8*K+13)/25
S = 2 - (3*K+3)/4
A = Y%19
D = (19*A+M) % 30
R = (D + A/11)/29
OG = 21 + D - R
SZ = 7 - (Y + Y/4 + S) % 7
OE = 7 - (OG-SZ) % 7
return OG + OE + 92我提取了一个常见的子表达式,并做了一些其他的优化来简化为
K = y/100
k = (3*K+3)/4
A = y%19
D = (19*A+15+k-(8*K+13)/25)%30
G = 23+D-(D+A/11)/29
return 97+G-(G+y+y/4-k)%7这种方法比另一种方法有更多的算术运算( approach的20-op算法),但它的常数较小;GolfScript不需要担心额外的括号,因为它是基于堆栈的,而且由于我优化的布局中的每个中间值被使用了精确的两倍,所以它很好地符合GolfScript的限制,即很容易访问堆栈的前三项。
发布于 2013-04-08 19:49:20
?[0n]smdndsy100/1483*ly400/2225*-2613+dsa25/319*ly19%3510*+330/29%sb148lb-5ly*4/la+lb-7%-d31/0nn31%1+d9>mp用法:
> dc -e "?[0n]smdndsy100/1483*ly400/2225*-2613+dsa25/319*ly19%3510*+330/29%sb148lb-5ly*4/la+lb-7%-d31/0nn31%1+d9>mp"
1725
17250401
>这应该能够缩短使用'd‘和'r’,而不是所有的负载和存储。
发布于 2013-04-08 10:06:36
此算法计算复活节相对于3月初的天数。该日期按问题中允许的YYYYMMDD格式返回:
E y
(a b)←⌊((3 8×⌊y÷100)+¯5 13)÷4 25
c←7|y+(⌊y÷4)-a-e←⌊d-((19×d←30|(227-(11×c)-a-b))+c←19|y)÷543
+/(10*4 2 0)×y,(3+i>31),(61⍴⍳31)[i←e+28-c] 接受原始测试用例:
E 2013
20130331
E 1583
15830410
E 3029
30290322
E 1789
17890412 https://codegolf.stackexchange.com/questions/11132
复制相似问题