项目欧拉22,关闭18,609

时间:2013-09-28 16:19:09

标签: python

我正在研究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的新手,我想知道我做错了什么。谢谢你的时间!

3 个答案:

答案 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换成无,然后用逗号(,)分割整个字符串,从而删除它们 祝你好运