- 本記事はProjectEulerの「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。
問題 22. 名前のスコア
問題の要約:文字の値をアルファベットの順番、単語の値を文字の値の和としたときに添付のnames.txtの5000個の名前の値の合計を求めよ
Google Colabでちょっと厄介なのがファイルの読み込み。Windowsでは以下の手順で行います。
1.ファイルをダウンロードして適当なフォルダに置く(例えば、¥ダウンロード)
2. 以下のプログラムを実行して「ファイル選択」ボタンを押すと、ダイアログボックスが出てくるのでダウンロードしたファイルを選択
3. 同じ名前でファイルがアップロードされる
# show upload dialog
from google.colab import files
#[ファイル選択]
#uploaded = files.upload()p022_names.txt
#p022_names.txt(text/plain) - 46447 bytes, last modified: 2020/4/2 - 100% done
#Saving p022_names.txt to p022_names (1).txt
ここからファイルを読み、リストに入れて、ソートします。
f = open("p022_names.txt")
string = f.read()
f.close()
names = string.replace('"','').split(',')
names.sort()
print(len(names), names[:10])
print(names[938-1])
#5163 ['AARON', 'ABBEY', 'ABBIE', 'ABBY', 'ABDUL', 'ABE', 'ABEL', 'ABIGAIL', 'ABRAHAM', 'ABRAM']
#COLIN
名前が5163個、最初の10個の名前と、938番目が"COLIN"であることを確認しました。
さて問題に戻っての文字と単語の値を返す関数charcost, wordcostを作って、wordcost("COLIN")が53になっていることを確認します。
def charcost(c):
return ord(c)-ord('A')+1 # return A->1, B->2,,,
def wordcost(s):
return sum(map(charcost,s))
print( wordcost("COLIN"))
#53
後は読み込んだ名前すべてのwordcostと位置(enumerateで取得)を掛け合わせて、合計を取れば完成です。
print(f"Answer: {sum([wordcost(n)*i for i, n in enumerate(names,1)])}")
(開発環境:Google Colab)