我正在尝试解决Project Euler Problem 19。
我不是来问这个问题的答案,但我注意到每次我的程序运行时,它的输出都是不同的。
请有人解释为什么我
"""
Author: Luke Spademan
Calculates answer to project euler problem id19
https://projecteuler.net/problem=19
"""
def calculate():
ans = 0
months = {
"jan": 31,
"feb": 28,
"mar": 31,
"apr": 30,
"may": 31,
"jun": 30,
"jul": 31,
"aug": 31,
"sep": 30,
"oct": 31,
"nov": 30,
"dec": 31,
}
i = 1
for year in range(1901, 2001):
for month in months:
months["feb"] = 28
if year % 4 == 0 and not (year % 100 == 0 and year % 400 != 0):
months["feb"] = 29
if i % 7 == 0:
ans += 1
i += months[month]
return ans
if __name__ == "__main__":
answer = calculate()
print(answer)
答案 0 :(得分:6)
问题是计算的结果取决于months
迭代的顺序。从Python 3.3开始,字符串哈希默认是随机化的,这意味着此顺序不是确定性的(until Python 3.6)。您可以阅读有关如何确定地运行此程序的here,尽管我认为您的目的是始终以预定义顺序迭代months
,在这种情况下,它应该是list
或OrderedDict
。
答案 1 :(得分:0)
在您迷失有关dict
和OrderedDict
的实施详细信息之前,您可以使用datetime
来了解答案应该是什么:
>>> from datetime import date
>>> sum(1 for month in range(1,13) for year in range(1901, 2001) if date(year, month, 1).weekday() == 6)
171
请注意,即使使用Python 3.6或Python2 + OrderedDict,您的代码也会返回172。
您的星期日测试写为i % 7 == 0
。这意味着你的循环中的第一天(1901年1月1日),tuesday,应该用i = 2
进行初始化。
为避免未排序的dicts出现任何问题,您只需使用元组列表:
def calculate():
ans = 0
months = [('jan', 31), ('feb', 28), ('mar', 31), ('apr', 30), ('may', 31), ('jun', 30), ('jul', 31), ('aug', 31), ('sep', 30), ('oct', 31), ('nov', 30), ('dec', 31)]
i = 2
for year in range(1901, 2001):
for month_name, days in months:
if month_name == "feb":
if year % 4 == 0 and not (year % 100 == 0 and year % 400 != 0):
days = 29
else:
days = 28
if i % 7 == 0:
ans += 1
i += days
return ans
if __name__ == "__main__":
answer = calculate()
print(answer)
此代码返回任何Python版本的171
。