zellers congruence algorithm find the day of the week for nearly any gregorian or julian calendar date zeller 01312010 your date 01312010 is a sunday validate out of range month zeller 13312010 traceback most recent call last valueerror month must be between 1 12 zeller 2312010 traceback most recent call last valueerror invalid literal for int with base 10 2 validate out of range date zeller 01332010 traceback most recent call last valueerror date must be between 1 31 zeller 01 42010 traceback most recent call last valueerror invalid literal for int with base 10 4 validate second separator zeller 01312010 traceback most recent call last valueerror date separator must be or validate first separator zeller 01312010 traceback most recent call last valueerror date separator must be or validate out of range year zeller 01318999 traceback most recent call last valueerror year out of range there has to be some sort of limit right test null input zeller traceback most recent call last typeerror zeller missing 1 required positional argument dateinput test length of dateinput zeller traceback most recent call last valueerror must be 10 characters long zeller 013119082939 traceback most recent call last valueerror must be 10 characters long days of the week for response days 0 sunday 1 monday 2 tuesday 3 wednesday 4 thursday 5 friday 6 saturday convertdatetimedays 0 1 1 2 2 3 3 4 4 5 5 6 6 0 validate if not 0 lendateinput 11 raise valueerrormust be 10 characters long get month m int intdateinput0 dateinput1 validate if not 0 m 13 raise valueerrormonth must be between 1 12 sep1 str dateinput2 validate if sep1 not in raise valueerrordate separator must be or get day d int intdateinput3 dateinput4 validate if not 0 d 32 raise valueerrordate must be between 1 31 get second separator sep2 str dateinput5 validate if sep2 not in raise valueerrordate separator must be or get year y int intdateinput6 dateinput7 dateinput8 dateinput9 arbitrary year range if not 45 y 8500 raise valueerror year out of range there has to be some sort of limit right get datetime obj for validation dtck datetime dateinty intm intd start math if m 2 y y 1 m m 12 maths var c int intstry 2 k int intstry2 t int int2 6 m 5 39 u int intc 4 v int intk 4 x int intd k z int intt u v x w int intz 2 c f int roundw 7 end math validate math if f convertdatetimedaysdtck weekday raise assertionerrorthe date was evaluated incorrectly contact developer response response str fyour date dateinput is a daysstrf return response if name main import doctest doctest testmod parser argparse argumentparser description find out what day of the week nearly any date is or was enter date as a string in the mmddyyyy or mmddyyyy format parser addargument dateinput typestr helpdate as a string mmddyyyy or mmddyyyy args parser parseargs zellerargs dateinput zellers congruence algorithm find the day of the week for nearly any gregorian or julian calendar date zeller 01 31 2010 your date 01 31 2010 is a sunday validate out of range month zeller 13 31 2010 traceback most recent call last valueerror month must be between 1 12 zeller 2 31 2010 traceback most recent call last valueerror invalid literal for int with base 10 2 validate out of range date zeller 01 33 2010 traceback most recent call last valueerror date must be between 1 31 zeller 01 4 2010 traceback most recent call last valueerror invalid literal for int with base 10 4 validate second separator zeller 01 31 2010 traceback most recent call last valueerror date separator must be or validate first separator zeller 01 31 2010 traceback most recent call last valueerror date separator must be or validate out of range year zeller 01 31 8999 traceback most recent call last valueerror year out of range there has to be some sort of limit right test null input zeller traceback most recent call last typeerror zeller missing 1 required positional argument date_input test length of date_input zeller traceback most recent call last valueerror must be 10 characters long zeller 01 31 19082939 traceback most recent call last valueerror must be 10 characters long days of the week for response validate get month validate validate get day validate get second separator validate get year arbitrary year range get datetime obj for validation start math maths var end math validate math response
import argparse
import datetime


def zeller(date_input: str) -> str:
    

    
    days = {
        "0": "Sunday",
        "1": "Monday",
        "2": "Tuesday",
        "3": "Wednesday",
        "4": "Thursday",
        "5": "Friday",
        "6": "Saturday",
    }

    convert_datetime_days = {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 0}

    
    if not 0 < len(date_input) < 11:
        raise ValueError("Must be 10 characters long")

    
    m: int = int(date_input[0] + date_input[1])
    
    if not 0 < m < 13:
        raise ValueError("Month must be between 1 - 12")

    sep_1: str = date_input[2]
    
    if sep_1 not in ["-", "/"]:
        raise ValueError("Date separator must be '-' or '/'")

    
    d: int = int(date_input[3] + date_input[4])
    
    if not 0 < d < 32:
        raise ValueError("Date must be between 1 - 31")

    
    sep_2: str = date_input[5]
    
    if sep_2 not in ["-", "/"]:
        raise ValueError("Date separator must be '-' or '/'")

    
    y: int = int(date_input[6] + date_input[7] + date_input[8] + date_input[9])
    
    if not 45 < y < 8500:
        raise ValueError(
            "Year out of range. There has to be some sort of limit...right?"
        )

    
    dt_ck = datetime.date(int(y), int(m), int(d))

    
    if m <= 2:
        y = y - 1
        m = m + 12
    
    c: int = int(str(y)[:2])
    k: int = int(str(y)[2:])
    t: int = int(2.6 * m - 5.39)
    u: int = int(c / 4)
    v: int = int(k / 4)
    x: int = int(d + k)
    z: int = int(t + u + v + x)
    w: int = int(z - (2 * c))
    f: int = round(w % 7)
    

    
    if f != convert_datetime_days[dt_ck.weekday()]:
        raise AssertionError("The date was evaluated incorrectly. Contact developer.")

    
    response: str = f"Your date {date_input}, is a {days[str(f)]}!"
    return response


if __name__ == "__main__":
    import doctest

    doctest.testmod()
    parser = argparse.ArgumentParser(
        description=(
            "Find out what day of the week nearly any date is or was. Enter "
            "date as a string in the mm-dd-yyyy or mm/dd/yyyy format"
        )
    )
    parser.add_argument(
        "date_input", type=str, help="Date as a string (mm-dd-yyyy or mm/dd/yyyy)"
    )
    args = parser.parse_args()
    zeller(args.date_input)