我正在研究Project Euler的第22期问题:
使用names.txt
(右键单击并将“保存链接/目标为...”),一个包含超过五千个名字的46K文本文件,首先按字母顺序排序。然后计算每个名称的字母值,将该值乘以列表中的字母位置以获得名称分数。
例如,当列表按字母顺序排序时,值为3 + 15 + 12 + 9 + 14 = 53
的COLIN是列表中的第938个名称。因此,COLIN将获得938×53 = 49714的分数。
文件中所有名称分数的总和是多少?
我的代码(下方)获得答案871179673
。正确的答案应该是871198282
,这让我大约18k。
def score(name, pos):
score = 0
for letter in name:
if letter == "A": score += 1
elif letter == "B": score += 2
elif letter == "C": score += 3
elif letter == "D": score += 4
elif letter == "E": score += 5
elif letter == "F": score += 6
elif letter == "G": score += 7
elif letter == "H": score += 8
elif letter == "I": score += 9
elif letter == "J": score += 10
elif letter == "K": score += 11
elif letter == "L": score += 12
elif letter == "M": score += 13
elif letter == "N": score += 14
elif letter == "O": score += 15
elif letter == "P": score += 16
elif letter == "Q": score += 17
elif letter == "R": score += 18
elif letter == "S": score += 19
elif letter == "T": score += 20
elif letter == "U": score += 21
elif letter == "V": score += 22
elif letter == "W": score += 23
elif letter == "X": score += 24
elif letter == "Y": score += 25
elif letter == "Z": score += 26
else: score += 0
# end for loop.
return score * pos
#end def score.
f = open('names.txt')
string = f.readlines()
f.close()
names = sorted(str(string).split(","))
tscore = 0
pos = 1
for name in names:
tscore += score(name, pos)
pos += 1
#end for loop.
print tscore
如果我通过我的得分函数运行“科林”示例,我会得到正确的结果。我已经从列表中测试了一些其他名称,他们也得到了正确的评分。我用Google搜索了问题并得到了各种解决方案,但由于我是python的新手,我想知道我做错了什么。谢谢你的时间!
答案 0 :(得分:2)
更改此行:
names = sorted(str(string).split(","))
为:
names = sorted(string[0].split(','))
文件只包含一行,因此您需要使用string[0]
访问该行。 file.readlines
返回包含文件中所有行的列表,最好执行以下操作:
names = f.read().split(',')
names.sort()
程序的缩写版本:
from string import ascii_uppercase
def score(word):
return sum(ascii_uppercase.index(c) + 1 for c in word.strip('"'))
with open('names.txt') as f:
names = f.read().split(',')
names.sort()
print sum(i*score(x) for i, x in enumerate(names, 1))
注意: string
是内置模块,请勿将其用作变量名称
答案 1 :(得分:0)
import string
with open("names.txt",'r') as f:
d=f.read()
d=d.replace('"','')
#print(d)
names=d.split(',')
#print(names)
names.sort()
print(names)
gro=dict()
result=string.ascii_uppercase
count=1
for i in result:
gro[i]=count
count+=1
#print(gro)
sum=0
for ind,value in enumerate(names):
#print(ind,value)
temp=0
for x in value:
temp+=gro[x]
print(temp)
sum+=temp*(ind+1)
打印(总和)
答案 2 :(得分:0)
我的方式:
splitted = open('names.txt').read().replace('","',',').replace('"','').split(',')
说明: 打开文件,读取它,然后将双qoutes换成无,然后用逗号(,)分割整个字符串,从而删除它们 祝你好运