2016-03-23 11 views
-4

The original question:# 22 Projekt Euler - ich hielt falsche Antwort bekommen

Mit names.txt (Rechtsklick und 'Ziel speichern unter/Target As ...'), ein 46K Text Datei über fünf- enthält Tausend Vornamen, beginnend mit der 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. Also, COLIN würde eine Punktzahl von 938 × 53 = 49714 erhalten.

Was ist die Summe aller Namen Noten in der Datei?


fr = open('name.txt', 'r') 
line = fr.read() 
nametolist = line.split(',') 

def namescores(nametolist): 

    sum=0 
    total=0 
    for i in range(len(nametolist)): 
     nametolist[i] = nametolist[i][1:-1] 
    print(nametolist) 
    for i in range(len(nametolist)): 
     for j in range(len(nametolist[i])): 
      if nametolist[i][j] == 'A': 
       sum+=1 
      elif nametolist[i][j] == 'B': 
       sum+=2 
      elif nametolist[i][j] == 'C': 
       sum+=3 
      elif nametolist[i][j] == 'D': 
       sum+=4 
      elif nametolist[i][j] == 'E': 
       sum+=5 
      elif nametolist[i][j] == 'F': 
       sum+=6 
      elif nametolist[i][j] == 'G': 
       sum+=7 
      elif nametolist[i][j] == 'H': 
       sum+=8 
      elif nametolist[i][j] == 'I': 
       sum+=9 
      elif nametolist[i][j] == 'J': 
       sum+=10 
      elif nametolist[i][j] == 'K': 
       sum+=11 
      elif nametolist[i][j] == 'L': 
       sum+=12 
      elif nametolist[i][j] == 'M': 
       sum+=13 
      elif nametolist[i][j] == 'N': 
       sum+=14 
      elif nametolist[i][j] == 'O': 
       sum+=15 
      elif nametolist[i][j] == 'P': 
       sum+=16 
      elif nametolist[i][j] == 'Q': 
       sum+=17 
      elif nametolist[i][j] == 'R': 
       sum+=18 
      elif nametolist[i][j] == 'S': 
       sum+=19 
      elif nametolist[i][j] == 'T': 
       sum+=20 
      elif nametolist[i][j] == 'U': 
       sum+=21 
      elif nametolist[i][j] == 'V': 
       sum+=22 
      elif nametolist[i][j] == 'W': 
       sum+=23 
      elif nametolist[i][j] == 'X': 
       sum+=24 
      elif nametolist[i][j] == 'Y': 
       sum+=25 
      else: 
       sum+=26 
     total += sum*(i+1) 
     sum=0 
+0

Fragen Debug-Hilfe zu suchen („? ** warum nicht dieser Code arbeitet **“) muss das gewünschte Verhalten, um ein bestimmtes Problem oder Fehler enthalten und den kürzesten Code notwendig zu reproduzieren es ** in der Frage selbst. ** Fragen ohne ** eine klare Problemstellung ** sind für andere Leser nicht nützlich. Siehe: [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (http://stackoverflow.com/help/mcve). –

+5

Sie können alle Ihre 26 elseif in 'sum + = ord (nametolist [i] [j]) - ord ('A') + 1;' ändern, wäre es ein Anfang, diesen Code lesbar zu machen – Guiroux

+0

meine Vermutung ist, dass Ihre Einrückung für die if else-Anweisungen ausgeschaltet ist, da ** der von Ihnen bereitgestellte Code keine gültige Python-Syntax ist, da Sie eine 'elif' nach einer 'for'-Anweisung haben –

Antwort

0

Sie haben die Namen nicht sortiert. In Frage

begin by sorting it into alphabetical order. 

Also, mit nametolist.sort() bevor Ihr Problem lösen würde zu berechnen.

Aber bitte beachten Sie, Wörterbuch zu tun Brief-Score-Mapping anstelle von 26 Fällen und Schatten nicht auch eingebaute Methode sum.
Etwas wie folgt aus:

import string 
#create dictionary 
lettersDict = {c: L for L,c in enumerate(string.ascii_uppercase, 1)} 

with open('names.txt', 'r') as fr: #using with would be better when opening files 
    line = fr.read() 
nametolist = line.split(',') 

total=0 
for i in range(len(nametolist)): 
    nametolist[i] = nametolist[i][1:-1] 
nametolist.sort() #sort after getting rid of punctuations 

for i in range(len(nametolist)): 
    wordsum = 0 
    for j in range(len(nametolist[i])): 
     wordsum += lettersDict[nametolist[i][j]] 
    total += wordsum*(i+1) 
print total