2017-01-31 2 views
0

Я делаю project Euler #22, что в основном требует, чтобы вы просмотрели список имен в TXT-файле, отсортировали их в алфавитном порядке и затем суммировали значения букв в имени (a = 1, b = 2 и т. д.), умноженных на индекс каждого имени.Project Euler: оценка имени - добавление значений слов большого размера

Например, если список отсортирован в алфавитном порядке, COLIN, который стоит 3 + 15 + 12 + 9 + 14 = 53, является 938-м именем в списке. Таким образом, COLIN получит оценку 938 × 53 = 49714.

Я сделал следующее в Python, которое дает мне правильное значение в небольшом списке, но неверный ответ на фактический список (который равен +5000 имена). Похоже, что немного изменил реальный ответ.

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) 

Я знаю, что код немного грязный (я новичок), но я ломаю ум, но не могу думать ни о чем. Может ли кто-нибудь помочь мне, где я ошибся?

Спасибо!

+0

Вы просуммировать значения букв? Причина в вашем сообщении, которое вы умножаете (в пояснении), а затем добавляете (в код). –

+0

мой плохой, чтобы добавить в пример! – sahwahn

+2

Вместо dict вы можете вычислить значение char с помощью 'ord (ch) - ord ('A') + 1'. Если имена повторяются, 'list.index (i) + 1' будет ошибочным. Попробуйте что-то вроде 'for index, name в enumerate (names, 1):'. Не используйте 'list' в качестве имени переменной, вы скрываете имя встроенного типа данных. –

ответ

0

Вы могли бы также рассмотреть возможность использования списка понимания, если вы хотите более короткий код:

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: сортируется() был в неправильном месте, исправленное

+0

Я не думаю, что вы действительно хотите заказать символы в имени ... Кроме того, имена в списке могут повторяться, но их индекс уникален. –

+0

Спасибо @MarcosModenesi! Ред. – Tristan

+0

Ближе, но все равно это не с 'li = ['TITO', 'TITO', 'TITO']'. –