我相信你们都会得到很多这些问题,但我只是需要更多的眼睛,因为我找不到问题。我问两个回答的人:
Project Euler #22概述的目标是:
使用names.txt(右键单击并将“保存链接/目标为...”),一个46K文本 包含超过五千个名字的文件,首先对其进行排序 按字母顺序排列。然后计算出字母值 每个名称,将该值乘以其中的字母位置 列表以获得名称分数。
例如,当列表按字母顺序排序时,COLIN, 值得3 + 15 + 12 + 9 + 14 = 53,是第938名 名单。因此,COLIN将获得938×53 = 49714的分数。
文件中所有名称分数的总和是多少?
他们给你的名字列表是这种格式:
"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET","DOROTHY","LISA","NANCY"
以下是代码:
import datetime, string, pprint
def get_rawdata():
# Use data = getRawData()
with open('e22-data') as f: #e22-data is the list of names
rawdata = [line.strip('"').split('","') for line in f]
return rawdata
def alphabetize(data):
data[0].sort()
return data
def score_letters(data):
scores = []
for n in data[0]:
score = 0
for l in n:
score += alpha.index(l)+1
scores.append(score)
return scores
def score_placement(scores):
products = []
for n in scores:
products.append(n*(scores.index(n)+1))
return products
alpha = string.ascii_uppercase
data = get_rawdata()
data = alphabetize(data)
pprint.pprint(data)
scores = score_letters(data)
products = score_placement(scores)
answer = sum(products)
print(answer)
答案 0 :(得分:3)
您的代码基本上是正确的,但score_placement()
有一个微妙的错误。你的代码:
def score_placement(scores):
products = []
for n in scores:
products.append(n*(scores.index(n)+1))
return products
这会查看每个单独的分数值(以49,35,19,......开头),尝试查找第一个出现值的索引(使用list.index()
) ,并执行乘法。
这种方法的问题在于它假设每个分数都是唯一的。如果在列表的后面出现另一个49分,它将使用找到的前49个的索引(在基于1的系统中为1)。
因此,您需要同时查看每个分数和每个索引,而不是试图以迂回方式查找索引。这种改变的算法既正确又节省时间( O ( n )与 O ( n < SUP> 2 ))。以下是score_placement()
可以正确编写的一种方法:
def score_placement(scores):
products = []
for i in range(len(scores)):
products.append((i+1)*scores[i])
return products
通过这个小小的改动,整个程序运行以产生正确的答案!
注意:
enumerate()
。score_placement()
函数,读取代码,发现逻辑错误。最后,我实施了一个建议的修复程序并运行它以验证它是否有效。