022. 姓名分值(Names scores)

题目给定的数据文件(见数据文件ep22.txt)包含了五千个名字,首先应将其按字母表顺序排列,计算每个名字的字母表值,然后乘以每个名字在列表中位次得到该名字的姓名分值。例如,当名字列表按字母表顺序排列,COLIN的字母表值为\(3+15+12+9+14=53\),而其在列表中的位次为938,因此COLIN的分值为两数相乘得到\(935\times53=49714\)。求文件中所有名字的姓名分值之和。

分析:这道题的思路也相对直接:从文件中导入数据,并存入到列表中,保证每个名字为列表中的一个元素。编写一个计算每个名字字母表值的函数,即考虑名字中每个字母相对于字母A的位次,并加总构成名字所有字母的位次值。编写计算姓名分值的函数,首先将所有名字按字母表顺序排列计算其位次值,然后再乘以其字母表值,加总所有的姓名分值得到结果。

# time cost = 246 ms ± 608 µs

def alphabet(word):
    alpha = lambda s : ord(s) - ord('A') + 1
    res = sum([alpha(x) for x in word])
    return res

def main():
    with open('data/ep22.txt','r') as f:
        names = f.read().replace('"',"").split(',')
    sorted_names = sorted(names)
    name_score = lambda word : alphabet(word) * (sorted_names.index(word)+1)
    ans = sum([name_score(word) for word in names])
    return ans