Pyth、118バイト
M++28@j15973358 4G&qG2!%H4FN.pmv>dqhd\0cz\.I&&&hN<hN13eN<eNhgFPNaYK+++*365JhtN/+3J4smghdJthNeNInK60aY-K+12>K60;-eSYhSY
オンラインでお試しください:デモまたはテストスイート。
ユリウス暦とグレゴリオ暦の必要な知識
ユリウス暦とグレゴリオ暦はよく似ています。各カレンダーは、1年を12か月に分割し、それぞれに28〜31日が含まれます。月の正確な日数は[31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
です。カレンダー間の唯一の違いは、うるう年の定義です。ユリウス暦では、4で割り切れる年はうるう年です。グレゴリオ暦はもう少し具体的です。4で割り切れる年はうるう年です。ただし、100で割り切れる年は400で割り切れません。
したがって、20世紀では1年しか異なりません。1900年。ユリウス暦ではうるう年ですが、グレゴリオ暦ではうるう年ではありません。つまり、一方のカレンダーには存在するが、他方のカレンダーには存在しない唯一の日付は日29.02.1900
です。
うるう年の定義が異なるため、ユリウス暦とグレゴリオ暦の日付には違いがあります。の前の日付の場合は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
?また、うるう年を考慮する必要がありますか?