Мы все знаем, что в григорианском календаре, который мы используем в настоящее время, случайный день недели может быть одним из 7 вариантов.
Цель моего кода основана на фрагменте из книги Артура Бенджамина «Мыслящий математик» (2006), в которой вы можете выполнить простой трюк на вечеринке с использованием математики. Используя коды (в основном, реализуя ярлыки на основе григорианских шаблонов и находя остатки после деления на семь), можно быстро и точно предсказать прошлые и будущие дни недели.
Моя текущая попытка приводит к перегрузке PyCharm и съедает большую часть активности процессора. Я считаю, что это может быть потому, что я не ограничил степень ввода пользователем 'Year' так же, как я ограничил 'typedMonth'.
Это оригинальный код:
print("Enter the full date: in dd/Month/yyyy")
Date = int(input("dd:"))
typedMonth = str(input("Month:"))
Year = int(input("yyyy: "))
while not int(Year) in range(0,3000):
Year = int(input("Please enter year (yyyy) limited to [0 - 3000] : "))
if typedMonth in ['January']:
Month = 3
while int(Year) % 4 == 0:
Month = 2
elif typedMonth in ['February']:
Month = 6
while int(Year) % 4 == 0:
Month = 5
elif typedMonth in ['March', 'November']:
Month = 6
elif typedMonth in ['April', 'July']:
Month = 2
elif typedMonth in ['May']:
Month = 4
elif typedMonth in ['August']:
Month = 5
elif typedMonth in ['September', 'December']:
Month = 1
elif typedMonth in ['October']:
Month = 3
elif typedMonth in ['June']:
Month = 0
else:
Month = 0
remYear = Year%400
if 300 <= remYear <= 400:
Year = Year + 1
elif 200 <= remYear <= 300:
Year = Year + 3
elif 100 <= remYear <= 200:
Year = Year + 5
else:
Year = Year + 0
print(remYear)
Day = (Date + int(Month) + remYear) % 7
print(Day)
Изолированное тестирование показывает, что первые четыре строки кода работают, как задумано (например, если я просто напечатаю typedMonth
).
В бункере сегмент ближе к концу от remYear= Year%400
также работает как задумано.
Следовательно, на мой неопытный взгляд, «чрезмерное вычисление», вероятно, связано с натяжкой кода, который я использую для исправления переменной Month из пользовательской строки ввода typedMonth
. Подчеркнем, что начальный ввод для Месяца начинается со строки typedMonth
. Затем я использую операторы while для преобразования пользовательского ввода строки в целочисленное значение. Это целочисленное значение относится к переменной «Месяц», чтобы можно было выполнить окончательное вычисление целых чисел «Дата», «Месяц» и «Год». Остаток будет соответствовать дню недели (например, 0 = воскресенье, 1 = понедельник, 2 = вторник и т. Д.).
Это обновленный код (третья итерация). Благодаря комментариям ниже, я теперь могу ввести большинство лет в качестве входных данных, и программа запустится. Логические ошибки все еще сохраняются, особенно с кодами, назначенными на месяцы. Я исправлю их в следующих итерациях.
print("Enter the full date: in dd/Month/yyyy")
Date = int(input("dd:"))
typedMonth = str(input("Month:"))
Year = int(input("yyyy: "))
while not int(Year) in range(1,3000):
Year = int(input("Please enter year (yyyy) limited to [0 - 3000] : "))
if typedMonth in ['January']:
Month = 3
while int(Year) % 4 == 0:
Month = 2
elif typedMonth in ['February']:
Month = 6
while int(Year) % 4 == 0:
Month = 5
elif typedMonth in ['March', 'November']:
Month = 6
elif typedMonth in ['April', 'July']:
Month = 2
elif typedMonth in ['May']:
Month = 4
elif typedMonth in ['June']:
Month = 0
elif typedMonth in ['August']:
Month = 5
elif typedMonth in ['September', 'December']:
Month = 1
elif typedMonth in ['October']:
Month = 3
remYear = Year%400
if 300 <= remYear <= 400:
Year = Year + 1
elif 200 <= remYear <= 300:
Year = Year + 3
elif 100 <= remYear <= 200:
Year = Year + 5
else:
Year = Year + 0
calcYear = int(Year % 100)
Day=(Date + Month + calcYear) % 7
print("The date is %d"%Date)
print("The month is %d"%Month)
print("The calculated year is %d"%calcYear)
print("The code for day is %d"%Day)
if Day in [0]:
print("You were born on a Sunday")
elif Day in [1]:
print("You were born on a Monday")
elif Day in [2]:
print("You were born on a Tuesday")
elif Day in [3]:
print("You were born on a Wednesday")
elif Day in [4]:
print("You were born on a Thursday")
elif Day in [5]:
print("You were born on a Friday")
elif Day in [6]:
print("You were born on a Saturday")
print("~~End Of Program~~")
Рекомендации по ограничению диапазона вычисления Year (ограничение пользовательского ввода для Year не устраняет вышеуказанные проблемы) или реструктуризации значения для переменной month из начального строкового ввода typedMonth будет принята с благодарностью.
P.S.1 Возможно, мне следует использовать другое программное обеспечение для этого проекта? Я только начал с Python, поэтому я не знаю, какие приложения будут более подходящими для таких программ. Рекомендую, если вы считаете, что это может быть жизнеспособным решением!
П.С.2 Достигнут прогресс! Эта программа работает для тысячелетних младенцев (иначе, год после 2001), мне все еще нужно исправить логику!
P.S.3 Благодаря комментариям ниже, я теперь могу запустить программу. В коде все еще есть явные логические ошибки. Я стараюсь начать работу над этим проектом, когда позволит время. Я буду обновлять этот пост соответственно. Спасибо, что присоединились ко мне в моем учебном путешествии!