首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >128年?假设闰年改革

128年?假设闰年改革
EN

Code Golf用户
提问于 2017-11-30 18:16:12
回答 3查看 1.8K关注 0票数 23

根据这段视频的数据,太阳年是365天、5小时、48分钟、45秒和138毫秒。在目前的公历中,闰年的规则如下:

代码语言:javascript
运行
复制
if      year is divisible by 400, LEAP YEAR
else if year is divisible by 100, COMMON YEAR
else if year is divisible by 4,   LEAP YEAR
else,                             COMMON YEAR

不幸的是,这种方法每隔3216年就会停止一天。

改革日历的一个可能方法是下列规则:

代码语言:javascript
运行
复制
if      year is divisible by 128, COMMON YEAR
else if year is divisible by 4,   LEAP YEAR
else,                             COMMON YEAR

这样做的好处是不需要我们在另一个62.5万年内改变我们的日历,无论是给予还是接受。

假设全世界都认为,从现在开始,除了每128年以外,我们每四年都使用这个系统,改变我们的日历如下:

代码语言:javascript
运行
复制
YEAR    GREGORIAN    128-YEAR
2044    LEAP         LEAP
2048    LEAP         COMMON
2052    LEAP         LEAP
 ...
2096    LEAP         LEAP
2100    COMMON       LEAP
2104    LEAP         LEAP
 ...
2296    LEAP         LEAP
2300    COMMON       LEAP
2304    LEAP         COMMON
2308    LEAP         LEAP

这将如何影响我们的一周一天的算法?

挑战

  • 给定从2000年到100000的日期,在这个新的日历下找到一周中的一天。
  • 只要清楚地指定正在使用的格式,任何输入和输出格式都是允许的。
  • 这是代码高尔夫,所以试着让你的解决方案尽可能高尔夫!

测试用例

代码语言:javascript
运行
复制
"28 February 2048" -> "Friday"
"March 1, 2048"    -> "Sat"
(2100, 2, 29)      -> 0           # 0-indexed with Sunday as 0
"2100-02-29"       -> 7           # 1-indexed with Sunday as 7
"28 Feb. 2176"     -> "Wednesday"
"1-Mar-2176"       -> "Th"
"28/02/100000"     -> "F"         # DD/MM/YYYYYY
"Feb. 29, 100000"  -> 6           # 1-indexed with Sunday as 7
"03/01/100000"     -> 1          # MM/DD/YYYYYY and 1-indexed with Sunday as 1

欢迎就这项挑战提出建议和反馈意见。祝你好运,打高尔夫球!

EN

回答 3

Code Golf用户

发布于 2017-11-30 22:59:46

C (gcc),60字节

代码语言:javascript
运行
复制
f(m,d,y){y-=m<3;return(y+y/4-y/128+"-bed=pen+mad."[m]+d)%7;}

在网上试试!

坂本氏法的简单修饰。将输入作为month, day, year顺序中的整数参数,并输出日数(周日为0-索引)。

票数 8
EN

Code Golf用户

发布于 2017-12-01 07:02:17

Python 2,67字节

代码语言:javascript
运行
复制
def f(m,d,y):y-=m<3;return(y+y/4-y/128+int("0032503514624"[m])+d)%7

在网上试试!

int("..."[m])可以由ord("-bed=pen+mad."[m])代替。

票数 3
EN

Code Golf用户

发布于 2017-12-01 16:13:36

实际上,37字节

这是诺贾根修正 of Sakamoto算法的一个端口,但是有一些基于堆栈的技巧,如下所述。输入格式为day, year, month。输出格式为0-indexed with Sunday as 0。欢迎您打高尔夫球!在网上试试!

代码语言:javascript
运行
复制
;"0032503514624"Ei)3>±+;¼L;¼¼½L±kΣ7@%

解释

代码语言:javascript
运行
复制
                     Implicit input: day, year, month (month is at TOS)
;"0032503514624"Ei)  Get the month code, convert to float, rotate to bottom of the stack
3>±+                 If 3>month, add -1 to year
;¼L                  Push floor(year/4) to stack
;¼¼½L±               Push floor(year/4) and append -floor(year/128) to stack.
kΣ                   Wrap the stack (y/128, y/4, y, month_code, d) in a list and sum
7@%                  Get the sum modulo 7
                     Implicit return
票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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