名称比分项目Euler#22

时间:2018-06-22 07:07:12

标签: python-3.x

项目EULER问题。 22:姓名得分

使用names.txt (LINK:https://projecteuler.net/project/resources/p022_names.txt),一个包含超过5,000个名字的46K文本文件,首先将其按字母顺序排序。然后计算出每个名称的字母值,将该值乘以其在列表中的字母位置即可获得名称分数。 例如,当列表按字母顺序排序时,值得3 + 15 + 12 + 9 + 14 = 53的COLIN是列表中的第938个名称。因此,COLIN将获得938 × 53 = 49714的分数。 文件中所有名称分数的总和是什么?

我的输出:

811204450

enter image description here

我不知道我哪里写错了,我对“ COLIN”的回答也为49714,并且名称也正确排序。

我的代码:

d=dict()
j=1
for i in range(ord('A'),ord('Z')+1):
    d[chr(i)]=j
    j+=1

def main():
    global d

    print(d)
    f=open("p022_names.txt","r")
    t=f.read()


    t=t.split(',')
    t.sort()  #THIS IS BUILT IN FN. SORT
    print(t[0:10])  #CHECKING IF EVERYTHING IS SORTED
    tot=0
    l=[]
    i=0
    for i in range(5000):  #THERE ARE 5000 NAMES

        for s in t[i]:
            if(s=='"'):
                #print(s)
                continue
            else:
                #print(s)
                tot+=d[s]

        p=(i+1)*tot
        l.append(p)

        if(t[i]=='"COLIN"'):
            print(t[i]," i= ",i)
            print("p= ",p," tot= ",tot)
            print(t[i],"  ",l[i])

        tot=p=0

    p=0
    print("len(l) = ",len(l))
    for i in range(len(l)):
        p+=l[i]    
    print("total score= ",p)

main()

1 个答案:

答案 0 :(得分:0)

来自https://projecteuler.net/problem=22

  

...一个包含 over 五千个名字的...的46K文本文件...

如果您希望检查它是 5163 。只需更改:

for i in range(5000):

for i in range(len(t)):

您还可以使用sum和生成器表达式来缩短代码:

t = sorted(name.strip('"') for name in t)
result = sum(sum(ord(c)-64 for c in t[i]) * (i+1) for i in range(len(t)))