From a4a49c6abfa1a285d3929dea716c6d8150279e90 Mon Sep 17 00:00:00 2001 From: bterral Date: Wed, 15 Nov 2023 15:17:12 +0100 Subject: [PATCH 1/3] First commit after fork --- __main__.py | 12 ++++++++++-- doomsday/algorithm.py | 43 ++++++++++++++++++++++++++++++++++++++++++- doomsday/date.py | 18 +++++++++++++++++- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/__main__.py b/__main__.py index 53c2c43..0615813 100644 --- a/__main__.py +++ b/__main__.py @@ -1,5 +1,13 @@ -def main() -> None: - print("Hello world") +from doomsday.algorithm import get_weekday_for_date + +def main() -> None: + dates = ["2000-01-01", + "2001-01-29", + "2017-12-15", + "2023-11-15", + "2111-12-12"] # Saturday, Monday, Friday, Wednesday, Saturday + for date in dates: + print("{0} is a {1}.".format(date, get_weekday_for_date(date))) main() diff --git a/doomsday/algorithm.py b/doomsday/algorithm.py index cf81d60..80fd55f 100644 --- a/doomsday/algorithm.py +++ b/doomsday/algorithm.py @@ -1,2 +1,43 @@ +from doomsday.date import is_valid_date + def get_weekday_for_date(date: str) -> str: - return "Sunday" + if not is_valid_date(date): + return "Invalid date" + + year, month, day = map(int, date.split('-')) + day_of_week = calculate_doomsday(year, month, day) + + week_days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] + return week_days[day_of_week] + +def get_year_anchor(year: int) -> int: + # Define the anchor day for the century + anchor_day = 2 + + # Calculate the century anchor day + century = year // 100 + century_anchor = (5 * (century % 4) + anchor_day) % 7 + + # Calculate the year anchor day + year_within_century = year % 100 + year_anchor = (century_anchor + (year_within_century // 12) + (year_within_century % 12) + + ((year_within_century % 12) // 4)) % 7 + + return year_anchor + +def calculate_doomsday(year: int, month: int, day: int) -> int: + year_anchor = get_year_anchor(year) + + # Define the Doomsday for each month + doomsday_month = [3, 0, 0, 4, 9, 6, 11, 8, 5, 10, 7, 12] + + # Adjustments for January and February in leap years + if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0): + doomsday_month[0] = 4 + doomsday_month[1] = 1 + + # Calculate the day of the week for the given date + day_of_week = (day - doomsday_month[month - 1] + year_anchor) % 7 + + return day_of_week + diff --git a/doomsday/date.py b/doomsday/date.py index 0f8e737..62b9932 100644 --- a/doomsday/date.py +++ b/doomsday/date.py @@ -1,2 +1,18 @@ def is_valid_date(date: str) -> bool: - return True + try: + year, month, day = map(int, date.split('-')) + + if 1 <= month <= 12 and 1 <= day <= 31: + if month in [4, 6, 9, 11] and day > 30: + return False + elif month == 2: # February + if day > 29: + return False + elif day == 29 and not (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)): + return False # February 29 is valid only in leap years + + return True + except ValueError: + pass + + return False From f8d77b3fe9eafea0f54f06a1ddec25d6d566eb59 Mon Sep 17 00:00:00 2001 From: bterral Date: Wed, 15 Nov 2023 15:32:47 +0100 Subject: [PATCH 2/3] Fixed format with pycodestyle --- __main__.py | 3 ++- doomsday/algorithm.py | 18 ++++++++++++------ doomsday/date.py | 15 ++++++++------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/__main__.py b/__main__.py index 0615813..e7393b9 100644 --- a/__main__.py +++ b/__main__.py @@ -6,8 +6,9 @@ def main() -> None: "2001-01-29", "2017-12-15", "2023-11-15", - "2111-12-12"] # Saturday, Monday, Friday, Wednesday, Saturday + "2111-12-12"] # Saturday, Monday, Friday, Wednesday, Saturday for date in dates: print("{0} is a {1}.".format(date, get_weekday_for_date(date))) + main() diff --git a/doomsday/algorithm.py b/doomsday/algorithm.py index 80fd55f..73c20bf 100644 --- a/doomsday/algorithm.py +++ b/doomsday/algorithm.py @@ -1,5 +1,6 @@ from doomsday.date import is_valid_date + def get_weekday_for_date(date: str) -> str: if not is_valid_date(date): return "Invalid date" @@ -7,12 +8,15 @@ def get_weekday_for_date(date: str) -> str: year, month, day = map(int, date.split('-')) day_of_week = calculate_doomsday(year, month, day) - week_days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] + week_days = ["Sunday", "Monday", + "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday"] return week_days[day_of_week] + def get_year_anchor(year: int) -> int: # Define the anchor day for the century - anchor_day = 2 + anchor_day = 2 # Calculate the century anchor day century = year // 100 @@ -20,11 +24,14 @@ def get_year_anchor(year: int) -> int: # Calculate the year anchor day year_within_century = year % 100 - year_anchor = (century_anchor + (year_within_century // 12) + (year_within_century % 12) + - ((year_within_century % 12) // 4)) % 7 - + year_anchor = (century_anchor + (year_within_century // 12) + + (year_within_century % 12) + + ((year_within_century % 12) // 4) + ) % 7 + return year_anchor + def calculate_doomsday(year: int, month: int, day: int) -> int: year_anchor = get_year_anchor(year) @@ -40,4 +47,3 @@ def calculate_doomsday(year: int, month: int, day: int) -> int: day_of_week = (day - doomsday_month[month - 1] + year_anchor) % 7 return day_of_week - diff --git a/doomsday/date.py b/doomsday/date.py index 62b9932..a3e292c 100644 --- a/doomsday/date.py +++ b/doomsday/date.py @@ -4,15 +4,16 @@ def is_valid_date(date: str) -> bool: if 1 <= month <= 12 and 1 <= day <= 31: if month in [4, 6, 9, 11] and day > 30: - return False - elif month == 2: # February - if day > 29: - return False - elif day == 29 and not (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)): + return False + elif month == 2: # February + if day > 29: + return False + elif day == 29 and not (year % 4 == 0 and + (year % 100 != 0 or year % 400 == 0)): return False # February 29 is valid only in leap years return True except ValueError: - pass + pass - return False + return False From f3653eff66ba79ac16a9b17203849415d0c0cee0 Mon Sep 17 00:00:00 2001 From: bterral Date: Wed, 15 Nov 2023 16:50:41 +0100 Subject: [PATCH 3/3] Added check to ensure year is at least 1583 --- __main__.py | 9 +++++++++ doomsday/algorithm.py | 2 +- doomsday/date.py | 5 ++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/__main__.py b/__main__.py index e7393b9..c68067c 100644 --- a/__main__.py +++ b/__main__.py @@ -1,4 +1,6 @@ from doomsday.algorithm import get_weekday_for_date +from tests.test_algorithm import TestAlgorithm +from tests.test_date import TestDate def main() -> None: @@ -10,5 +12,12 @@ def main() -> None: for date in dates: print("{0} is a {1}.".format(date, get_weekday_for_date(date))) + test_date = TestDate() + test_date.test_valid_dates() + test_date.test_invalid_dates() + + test_algorithm = TestAlgorithm() + test_algorithm.test_algorithm() + main() diff --git a/doomsday/algorithm.py b/doomsday/algorithm.py index 73c20bf..d64b3a8 100644 --- a/doomsday/algorithm.py +++ b/doomsday/algorithm.py @@ -35,7 +35,7 @@ def get_year_anchor(year: int) -> int: def calculate_doomsday(year: int, month: int, day: int) -> int: year_anchor = get_year_anchor(year) - # Define the Doomsday for each month + # Doomsday for each month doomsday_month = [3, 0, 0, 4, 9, 6, 11, 8, 5, 10, 7, 12] # Adjustments for January and February in leap years diff --git a/doomsday/date.py b/doomsday/date.py index a3e292c..fc5f9ea 100644 --- a/doomsday/date.py +++ b/doomsday/date.py @@ -2,6 +2,9 @@ def is_valid_date(date: str) -> bool: try: year, month, day = map(int, date.split('-')) + if year < 1583: + return False + if 1 <= month <= 12 and 1 <= day <= 31: if month in [4, 6, 9, 11] and day > 30: return False @@ -10,7 +13,7 @@ def is_valid_date(date: str) -> bool: return False elif day == 29 and not (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)): - return False # February 29 is valid only in leap years + return False # February 29 is only valid in leap years return True except ValueError: