問題
5000個以上の名前が書かれている46Kのテキストファイル filenames.txt を用いる. まずアルファベット順にソートせよ.
のち, 各名前についてアルファベットに値を割り振り, リスト中の出現順の数と掛け合わせることで, 名前のスコアを計算する.
たとえば, リストがアルファベット順にソートされているとすると, COLINはリストの938番目にある. またCOLINは 3 + 15 + 12 + 9 + 14 = 53 という値を持つ. よってCOLINは 938 × 53 = 49714 というスコアを持つ.
ファイル中の全名前のスコアの合計を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2022
回答
reduce関数を使う練習。
dict = {"A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10,"K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19,"T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":26}
def get_point(name,i):
#if name == 'COLIN':
# print reduce(lambda x,y:x+y, map(lambda x:dict[x], name)) * (i+1)
return reduce(lambda x,y:x+y, map(lambda x:dict[x], name)) * (i+1)
def main():
filename = "names.txt"
F = open(filename)
names = F.read()
namelist = map(lambda x: x.strip('"'), names.split(","))
namelist.sort()
ans = 0
lng = len(namelist)
for i in range(lng):
ans += get_point(namelist[i],i)
print ans
main()