From Zeller's congruence formula, calculate what day of the week is.
calcal.py
#!/usr/bin/python3
import sys
y = int(sys.argv[1])
m = int(sys.argv[2])
d = int(sys.argv[3])
youbia = ["Day", "Month", "fire", "water", "wood", "Money", "soil"]
if (m == 1 or m == 2):
md = m+10
yd = y-1
else:
md = m-2
yd = y
a = yd // 100
b = yd % 100
youbi = (int(2.6*md - 0.2) + d + b + b//4 + a//4 - 2*a)%7
print("Year", y, "Year", m, "Month", d, "day", youbia[youbi], "It's the day of the week.",sep="")
Output example
$ calcal.py 1967 5 12
May 12, 1967 is Friday.
$ calcal.py 1994 12 25
December 25, 1994 is Sunday.
$ calcal.py 1995 12 24
December 24, 1995 is Sunday.
$ calcal.py 1998 12 24
December 24, 1998 is Thursday.
$ calcal.py 2000 5 12
May 12, 2000 is Friday.
$ calcal.py 2019 12 25
December 25, 2019 is Wednesday.
$ calcal.py 10000 5 12
May 12, 10000 AD is Friday.
$
Incidentally, it is a program that outputs the perpetual calendar.
cal.py
#!/usr/bin/python3
import sys
argvs = sys.argv
argc = len( argvs )
months=[31,28,31,30,31,30,31,31,30,31,30,31]
youbia = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
def weekofday(y,m,d):
md, yd = (m-2, y) if m > 2 else (m+10, y-1)
a, b = divmod(yd, 100)
return ( (int(2.6*md - 0.2) + d + b + b//4 + a//4 - 2*a)%7)
def printcal(y,m):
mm=months[m-1]+(1 if (m==2 and y%4==0 and y%400!=0) else 0)
print(y,m,sep='/')
print (*youbia,sep=' ')
f=weekofday(y,m,1)
print(" "*f,end='')
for i in range(1,mm+1):
print(" %2d " %i,end='')
if f==6:
print("")
f=(f+1)%7
if f!=0:
print("")
if argc==3:
y = int(sys.argv[1])
m = int(sys.argv[2])
else:
print("Usage : cal.py y m")
exit(1)
printcal(y,m)
Output example
$ cal.py 2020 2
2020/2
Sun Mon Tue Wed Thu Fri Sat
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
$
cal.py version 2.0 The code that summarizes the day of the week calculation and the perpetual calendar is shown. The day of the week calculation function is that of the integer operation presented by kkdd. $ ./cal.py y m to display the calendar for the year m month. $ ./cal.py y m d displays the day of the week on the m month d day of the year y.
cal.py
#!/usr/bin/python3
import sys
argvs = sys.argv
argc = len( argvs )
months=[31,28,31,30,31,30,31,31,30,31,30,31]
youbia = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
def dayofweek(year, month, day):
m = (month-3)%12
y = year if month >= 3 else year - 1
n = day + (13*m+2)//5 + y + y//4 - (y//100) + y//400 + 2
return (n%7)
def printcal(y,m):
mm=months[m-1]+(1 if (m==2 and y%4==0 and y%400!=0) else 0)
print(y,m,sep='/')
print (*youbia,sep=' ')
f=dayofweek(y,m,1)
print(" "*f,end='')
for i in range(1,mm+1):
print(" %2d " %i,end='')
if f==6:
print("")
f=(f+1)%7
if f!=0:
print("")
if argc==3:
y = int(sys.argv[1])
m = int(sys.argv[2])
printcal(y,m)
elif argc==4:
y = int(sys.argv[1])
m = int(sys.argv[2])
d = int(sys.argv[3])
f = dayofweek(y,m,d)
print(y, "/", m, "/", d, " is ", youbia[f],sep="")
else:
print("Usage : cal.py y m [d]")
exit(1)
Recommended Posts