What date is that again?
Pyth, 118 bytes
M++28@j15973358 4G&qG2!%H4FN.pmv>dqhd\0cz\.I&&&hN<hN13eN<eNhgFPNaYK+++*365JhtN/+3J4smghdJthNeNInK60aY-K+12>K60;-eSYhSY
Try it online: Demonstration or Test Suite.
Necessary knowledge of Julian and Gregorian Calendars
Julian and Gregorian Calendar are quite similar. Each calendar divides a year into 12 months, each containing of 28-31 days. The exact days in a month are [31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
. The only difference between the calendars are their definition of a leap year. In the Julian Calendar any year divisible by 4 is a leap year. The Gregorian Calendar is a bit more specific. Any year divisible by 4 is a leap year, except the year divisible by 100 and not divisible by 400.
So in the 20th century only one year is different. The year 1900, which is a leap year in the Julian Calendar, but not a leap year in the Gregorian Calendar. So the only date, that exists in the one calendar but not in the other calendar is the day 29.02.1900
.
Because of the different leap year definition, there's a difference between a date in the Julian Calendar and the Gregorian Calendar. 12 days difference for a date before the 29.02.1900
, and 13 days difference for dates after the 29.02.1900
.
Simplified Pseudo-Code
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
Detailed Code Explanation
The first part M++28@j15973358 4G&qG2!%H4
defines a function g(G,H)
, which calculates the number of days in month G
of a year H
in the Julian Calendar.
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)
And the next part is just the for loop, and the ifs. Notice that I interpret N
in the format (month, year, day)
. Just because it saves some bytes.
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))