2017-01-31 3 views
0

Ich mache project Euler #22, die im Grunde erfordert Sie eine Liste von Namen in einer TXT-Datei durchlaufen, sortieren sie in alphabetischer Reihenfolge und summieren dann die Werte der Buchstaben im Namen (a = 1, b = 2 usw.) multipliziert mit dem Index jedes Namens.Projekt Euler: Name Scores - zusammen die Werte der vielen Wörter

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

Ich habe das folgende in Python getan, das mir den richtigen Wert auf kleiner Liste gibt, aber die falsche Antwort auf der tatsächlichen Liste (die +5000 ist Namen). Es scheint die wirkliche Antwort ein wenig zu übertreiben.

list = ["MARY","PATRICIA"... "ALONSO"] 

dictionary = {'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} 
list.sort() 
total = 0 
for i in list: 
    count = 0 
    for j in i: 
    count += (dictionary[j]) 
    else: 
    count *= (list.index(i) + 1) 
    total += count 
print(total) 

Ich bin mir bewusst, dass der Code ein bisschen chaotisch ist (ich bin ein Anfänger), aber ich habe meine Meinung wurde Abstich kann aber nicht an nichts denken. Kann mir jemand helfen, wo ich falsch gelaufen bin?

Danke!

+0

Sie die Werte der Buchstaben zusammenfassen? In deinem Post multiplizierst du (in der Erklärung) und fügst dann (im Code) hinzu. –

+0

mein schlechter, soll im Beispiel hinzufügen! – sahwahn

+2

Anstelle eines Diktats können Sie den Wert eines Zeichens mit 'ord (ch) - ord ('A') + 1 'berechnen. Wenn die Namen wiederholt werden, ist 'list.index (i) + 1' falsch. Versuchen Sie etwas wie 'for index, name in enumerate (Namen, 1):'. Verwenden Sie 'list' nicht als Variablennamen, Sie verbergen den Namen eines eingebauten Datentyps. –

Antwort

0

Sie auch Verständnis mit einer Liste könnten in Erwägung ziehen, wenn Sie kürzeren Code wollen:

li = sorted(["FRED","SUSAN"]) 
dictionary = {'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} 
li = sum(i for i in [sum(dictionary[i] for i in li[j])*(j+1) for j in range(len(li))]) 
print(li) 

EDIT: sortierte() an der falschen Stelle war, korrigiert

+0

Ich glaube nicht, dass Sie wirklich die Zeichen in einem Namen bestellen möchten ... Auch die Namen in der Liste können wiederholt werden, aber ihr Index ist einzigartig. –

+0

Danke @MarcosModenesi! Bearbeitet. – Tristan

+0

Näher, aber immer noch, dies wird mit 'li = ['TITO', 'TITO', 'TITO']' scheitern. –