Files
basic-computer-games/21_Calendar/python/calendar.py
Martin Thoma ae0b6a5015 BUG: Hangman (Python) had a List-vs-Str comparison
MAINT: Add type annotations to find such issues
2022-03-31 10:33:11 +02:00

164 lines
3.9 KiB
Python

########################################################
# Calendar
#
# From: BASIC Computer Games (1978)
# Edited by David Ahl#
#
# This program prints out a calendar
# for any year. You must specify the
# starting day of the week of the year in
# statement 130. (Sunday(0), Monday
# (-1), Tuesday(-2), etc.) You can determine
# this by using the program WEEKDAY.
# You must also make two changes
# for leap years in statement 360 and 620.
# The program listing describes the necessary
# changes. Running the program produces a
# nice 12-month calendar.
# The program was written by Geofrey
# Chase of the Abbey, Portsmouth, Rhode Island.
#
########################################################
from typing import Tuple
def parse_input() -> Tuple[int, bool]:
"""
function to parse input for weekday and leap year boolean
"""
days_mapping = {
"sunday": 0,
"monday": -1,
"tuesday": -2,
"wednesday": -3,
"thursday": -4,
"friday": -5,
"saturday": -6,
}
day = 0
leap_day = False
correct_day_input = False
while not correct_day_input:
weekday = input("INSERT THE STARTING DAY OF THE WEEK OF THE YEAR:")
for day_k in days_mapping.keys():
if weekday.lower() in day_k:
day = days_mapping[day_k]
correct_day_input = True
break
while True:
leap = input("IS IT A LEAP YEAR?:")
if "y" in leap.lower():
leap_day = True
break
if "n" in leap.lower():
leap_day = False
break
return day, leap_day
def calendar(weekday: int, leap_year: bool) -> None:
"""
function to print a year's calendar.
input:
_weekday_: int - the initial day of the week (0=SUN, -1=MON, -2=TUES...)
_leap_year_: bool - indicates if the year is a leap year
"""
months_days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
days = "S M T W T F S\n"
sep = "*" * 59
years_day = 365
d = weekday
if leap_year:
months_days[2] = 29
years_day = 366
months_names = [
" JANUARY ",
" FEBRUARY",
" MARCH ",
" APRIL ",
" MAY ",
" JUNE ",
" JULY ",
" AUGUST ",
"SEPTEMBER",
" OCTOBER ",
" NOVEMBER",
" DECEMBER",
]
days_count = 0 # S in the original program
# main loop
for n in range(1, 13):
days_count += months_days[n - 1]
print(
f"** {days_count} ****************** {months_names[n - 1]} "
f"****************** {years_day - days_count} **\n"
)
print(days)
print(sep)
for _ in range(1, 7):
print("\n")
for g in range(1, 8): # noqa
d += 1
d2 = d - days_count
if d2 > months_days[n]:
break
if d2 <= 0:
print(" ", end=" ")
elif d2 < 10:
print(f" {d2}", end=" ")
else:
print(f"{d2}", end=" ")
print()
if d2 >= months_days[n]:
break
if d2 > months_days[n]:
d -= g
print("\n")
print("\n")
def main() -> None:
print(" " * 32 + "CALENDAR")
print(" " * 15 + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY")
print("\n" * 11)
day, leap_year = parse_input()
calendar(day, leap_year)
if __name__ == "__main__":
main()
########################################################
#
########################################################
#
# Porting notes:
#
# It has been added an input at the beginning of the
# program so the user can specify the first day of the
# week of the year and if the year is leap or not.
#
########################################################