Pyth,118个字节
M++28@j15973358 4G&qG2!%H4FN.pmv>dqhd\0cz\.I&&&hN<hN13eN<eNhgFPNaYK+++*365JhtN/+3J4smghdJthNeNInK60aY-K+12>K60;-eSYhSY
在线尝试:演示或测试套件。
儒略历和公历的必要知识
朱利安日历和公历非常相似。每个日历将一年分为12个月,每个月包含28-31天。一个月中的确切日期是[31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
。日历之间的唯一区别是它们对a年的定义。在儒略历中,任何可以被4整除的年份都是year年。公历较为具体。可以除以4的任何年份都是a年,除了可以除以100且不能除以400的年份。
因此,在20世纪只有一年不同。1900年,在儒略历中是a年,但在公历中不是not年。因此,一个日历中存在但另一个日历中不存在的唯一日期是日期29.02.1900
。
由于leap年的定义不同,因此儒略历和公历之间的日期有所不同。之前的日期相差12天,之后的日期29.02.1900
相差13天29.02.1900
。
简化的伪代码
Y = [] # empty list
for each permutation N of the input date:
if N is valid in the Julian Calendar:
K = number of days since 0.01.1900
append K to Y
if K != 60: # 60 would be the 29.02.1900
L = K - (12 if K < 60 else 13)
append L to Y
print the difference between the largest and smallest value in Y
详细代码说明
第一部分M++28@j15973358 4G&qG2!%H4
定义一个函数g(G,H)
,该函数计算儒略历中G
一年H
中某月的天数。
M def g(G,H): return
j15973358 4 convert 15973358 into base 4
@ G take the Gth element
+28 + 28
+ &qG2!%H4 + (G == 2 and not H % 4)
下一部分只是for循环和ifs。请注意,我以N
格式进行解释(month, year, day)
。只是因为它节省了一些字节。
FN.pmv>dqhd\0cz\.
cz\. split input by "."
mv>dqhd\0 map each d of ^ to: eval(d[d[0]=="0":])
FN.p for N in permutations(^):
I&&&hN<hN13eN<eNhgFPN
I if
hN month != 0
& and
<hN13 month < 13
& and
eN day != 0
& and
<eNhgFPN day < 1 + g(month,year):
aYK+++*365JhtN/+3J4smghdJthNeN
JhtN J = year
+*365J /+3J4 J*365 + (3 + J)/4
+ smghdJthN + sum(g(1+d,year) for d in [0, 1, ... month-2])
+ eN + day
K K = ^
aYK append K to Y
InK60aY-K+12>K60
InK60 if K != 60:
aY-K+12>K60 append K - (12 + (K > 60)) to Y
;-eSYhSY
; end for loop
-eSYhSY print end(sorted(Y)) - head(sorted(Y))
5, May 1975
应该31st
?另外,我们是否必须考虑leap年?