2016-03-19 7 views
0

私はプロジェクトオイラーにProblem 22を解決しようとしています:#22プロジェクトオイラー:なぜ私の答えは間違っていますか?

names.txt(右クリックし、「保存リンク/対象として...」)、五千人以上の最初の名前を含む46Kテキスト ファイルを使用して、開始 をアルファベット順にソートします。次に、 の各アルファベットの値を計算し、この値に リストのアルファベット順の位置を掛けて、名前スコアを取得します。

たとえば、リストがアルファベット順にソートされている場合、COLINは3 + 15 + 12 + 9 + 14 = 53の価値があり、 リストの938番目の名前です。したがって、COLINは938×53 = 49714というスコアを取得します。

ファイル内のすべての名前スコアの合計はいくらですか?

import os 
chart=open('names.txt') 
doc=chart.read() 
doc=doc.split(',') 
doc.sort() 
z=0 

def nameNum(name): 
    r=0 
    for letter in name: 
     r=r+ord(letter) - 64 
    return r 

for string in doc: 
    z+=(doc.index(string)+1)*nameNum(string) 
print z 

私は、zを作るしようとしていた:names.txt

内容は、私は私がこのコードを使用するときに正しくない答えを得る理由は理解していない

"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA",....[46k omitted] 

です答えは出ますが、それは正しくなく、私は理由を理解できません。

これはpython 3です。

+1

デバッグのヘルプを求める質問(** "なぜこのコードは動作しませんか?" **)は必要な動作、*特定の問題またはエラー*、* *を再現するのに必要な最短コード**を含む必要があります。質問自体**。 **明確な問題文**のない質問は他の読者には役に立たない。参照:[最小限で完全で検証可能な例を作成する方法](http://stackoverflow.com/help/mcve) – MattDMo

+2

また、これはPython 2では使えない 'print z'を使っているので、これはPython 3にはできません。 –

+1

私が投稿できない答えでは、' allsum'のようなテスト可能な関数を記述し、あなたが答えを計算することができる '' "" ''と' '" A "、" 'で始まります。 'allsum( ''" "CD"、 "A"、 "AB" '' ') 'のようなものの後にのみ、' allsum(open(' names.txt ')。read()) 'を試してください。 –

答えて

3

あなたは名前と共に引用符"を得ています。最も簡単なのは、コンマで区切る前にそれらを削除することです。修正前

... 
doc=chart.read() 
doc=doc.replace('"', '') 
doc=doc.split(',') 
... 

、あなたはCOLIN

Name: "COLIN", pos: 938, score: -6566 

のための負のスコアを取得している...しかし、修正した後、それは一例に従った正しいです。

Name: COLIN, pos: 938, score: 49714 
1

あり、あなたの実際のアルゴリズムには何の問題もありませんが、問題は、あなたが,でファイルを分割しながら、それぞれの名前の周り"文字が残っているということです。だから間違ってそれぞれの名前のスコアに2 * (64 - ord('"'))を追加しているので、間違った結果が得られます。

ファイルを簡単に、文字列のタプルにast.literal_eval()で解析することができ、次の形式になります。今

import ast 
with open('names.txt') as f: 
    contents = f.read() 
    names = sorted(ast.literal_eval(contents)) 

namesは、余分な文字をせずに、名前のソートされたリストです。 docの代わりにこのリストを使用して、私はあなたのアルゴリズムから正しい結果を得ました。これは、アイテムのインデックスを見つけるために、.indexを使用して、アルゴリズム自体には影響を与えないながらも


は非常に非効率的である:

for string in doc: 
    z+=(doc.index(string)+1)*nameNum(string) 

あなたべきuse enumerate代わり:

for number, name in enumerate(names, start=1): 
    z += number * nameNum(name) 

names余分な文字なしでソートされた名前のリストです。これらの変更により、私は正しい結果を得ました。

関連する問題