首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算复活节日期

计算复活节日期
EN

Code Golf用户
提问于 2013-04-05 13:29:43
回答 5查看 2.4K关注 0票数 15

您的功能或程序应以一年作为输入,并返回(或打印)日期(在公历)的年份复活节(而不是东正教复活节)。返回的日期应按照ISO 8601格式化,但支持时间大于9999 (如312013-04-05或20010130),并且只需要处理大于或等于1583年(采用公历的年份)和小于或等于5701583的年份(因为复活节日期的顺序开始重复)。

示例:

代码语言:javascript
复制
e(5701583) = 5701583-04-10
e(2013)    = 2013-03-31
e(1583)    = 1583-04-10
e(3029)    = 30290322
e(1789)    = 17890412
e(1725)    = 17250401

使用内置函数返回复活节日期是无聊的,因此是不允许的。最短的答案(以字符表示)获胜。

资源:

  • http://en.wikipedia.org/wiki/Computus#Algorithms
  • http://web.archive.org/web/20150227133210/http://www.merlyn.demon.co.uk/estralgs.txt
EN

回答 5

Code Golf用户

回答已采纳

发布于 2013-04-10 22:43:31

GolfScript (85个字符)

代码语言:javascript
复制
~:^100/.)3*4/.@8*13+25/-^19%.19*15+@+30%.@11/+29/23--.@-^.4/++7%97--^0@.31/100*\31%)+

样本使用情况:

代码语言:javascript
复制
$ golfscript.rb codegolf11132.gs <<<2013
20130331

请注意,这使用了与大多数当前答案不同的算法。具体来说,我在西恩·切希尔所链接的资源中对Lichtenberg的算法进行了修改,在对这个问题的评论中。

最初的算法假设合理的类型(即不是JavaScript的数字),并根据给定的month*31+day (使用日偏移量为0)进行适配

代码语言:javascript
复制
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

我提取了一个常见的子表达式,并做了一些其他的优化来简化为

代码语言:javascript
复制
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的限制,即很容易访问堆栈的前三项。

票数 5
EN

Code Golf用户

发布于 2013-04-08 19:49:20

dc: 106个字符

代码语言:javascript
复制
?[0n]smdndsy100/1483*ly400/2225*-2613+dsa25/319*ly19%3510*+330/29%sb148lb-5ly*4/la+lb-7%-d31/0nn31%1+d9>mp

用法:

代码语言:javascript
复制
> 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’,而不是所有的负载和存储。

票数 4
EN

Code Golf用户

发布于 2013-04-08 10:06:36

APL 132

此算法计算复活节相对于3月初的天数。该日期按问题中允许的YYYYMMDD格式返回:

代码语言:javascript
复制
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] 

接受原始测试用例:

代码语言:javascript
复制
      E 2013
20130331
      E 1583
15830410
      E 3029
30290322
      E 1789
17890412         
票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/11132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档