2016-11-15 1 views
-3

Ich versuche, Problem # 22 in Python zu tun, und meine Antwort ist aus. Ich habe die Liste durchgegangen und habe bestimmte Namen ausprobiert und sie wurden korrekt berechnet (denke ich).Projekt Euler # 22 - warum ist meine Gesamtsumme bei 324536?

Kann mir jemand helfen ??

Problem:

Mit names.txt (Rechtsklick und 'Ziel speichern unter/Target As ...'), ein 46K Text Datei über fünftausend Vornamen enthält, beginnen, indem sie Sortierung in alphabetischer Reihenfolge. Dann berechnen Sie den alphabetischen Wert für jeden Namen, multiplizieren Sie diesen Wert mit seiner alphabetischen Position in der Liste, um einen Namen Score zu erhalten.

Zum Beispiel, wenn die Liste in alphabetischer Reihenfolge sortiert ist, COLIN, , die 3 + 15 + 12 + 9 + 14 = 53 wert ist, ist der 938. Name in der Liste. So würde COLIN eine Punktzahl von 938 × 53 = 49714 erhalten.

Was ist die Summe aller Namen in der Datei?

def letter_sum(word): 
    total = 0 
    for letter in word: 
     total += ord(letter) - ord('A') + 1 
    return total 

def namescore(name, count): 
    name_sum = letter_sum(name) 
    return count * name_sum 

def main(): 
    names = [] 
    f = open('p022_names.txt', 'r') 
    string = f.read() 
    f.close() 

    total = 0 
    names = sorted(string.replace('"', '').split(',')) 
    for i in range(len(names)): 
     total += namescore(names[i], i) 

    print total 
+2

Haben Sie kurz gesagt, worum es bei # 22 geht, ohne dass jeder von uns einzeln nachsehen muss? – deceze

+0

bearbeitet - Danke! – jordanc

+0

Du multiplizierst mit 'i', wenn du' namescore' nennst, was bei 0 beginnt. Ich denke, das ist das Problem. – Rishav

Antwort

2

Ihre Indizierung ist um eins deaktiviert. 'COLIN' ist bei Index 937 auf 0 basierte Indexierung, aber die Zuordnung verwendet 1 basierte Indexierung. Sie können das Problem beheben, indem Sie Ihren Code ein wenig ändern:

total += namescore(names[i], i + 1) 
+0

oops. hatte einen anderen Fehler vorher wo "COLIN" war um 938 und ich muss nicht überprüft haben, nachdem ich es korrigiert habe. danke !! – jordanc

1

Es ist off-by-one-Fehler. Im Code:

for i in range(len(names)): 
    total += namescore(names[i], i) 

i beginnt von 0, während der Name von 1 Zählen beginnen soll, verwenden namescore(names[i], i + 1) statt.