2

私は Project Euler の問題 22 に取り組んでいます:

names.txt5,000 を超えるファースト ネームを含む 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

スコア関数で「Colin」の例を実行すると、正しい結果が得られます。リストから他のいくつかの名前をテストしましたが、それらも正しく評価されました。私は質問をグーグルで検索し、さまざまな解決策を得ましたが、私はPythonに慣れていないので、何が間違っていたのかを知りたいです. 御時間ありがとうございます!

4

3 に答える 3

2

この行を変更します。

names = sorted(str(string).split(","))

に:

names = sorted(string[0].split(','))

ファイルには 1 行しか含まれていないため、 を使用してその行にアクセスする必要があります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は組み込みモジュールです。変数名として使用しないでください。

于 2013-09-28T16:31:31.987 に答える