2016-11-17 2 views
2

Я делаю Beautiful Strings challenge. Я уже знаю, как это сделать, и разработал решение в моей голове. Все правильно, и если я могу заставить метод добавлять и умножать правильно, это должно работать так, как ожидалось, однако у меня есть трудное время, чтобы его добавить и умножить правильно. Что мне нужно, это:Алгоритм красивой строки не умножается правильно

  • сосчитать, сколько из тех же букв в строке
  • Сохранить этот номер
  • Умножить количество чисел, которые находятся в строке по значению буквы
  • Возвращает общее

Что я сделал до сих пор:

import string 

BEAUTIFICATION = { 
    "a": 24, "b": 25, "c": 26, 
    "d": 1, "e": 2, "f": 3, 
    "g": 4, "h": 5, "i": 6, 
    "j": 7, "k": 8, "l": 9, 
    "m": 10, "n": 11, "o": 12, 
    "p": 13, "q": 14, "r": 15, 
    "s": 16, "t": 17, "u": 18, 
    "v": 19, "w": 20, "x": 21, 
    "y": 22, "z": 23, 
} 

def strip_string(start_string): 
    exclude = set(string.punctuation) 
    new_string = ''.join(ch for ch in start_string if ch not in exclude) 
    return new_string.replace(" ", "") 

def calculate_sum(beautiful_string): 
    total = [] 
    for c in beautiful_string.lower(): 
     total.append(BEAUTIFICATION[c]) 
    return reduce(lambda x, y: x*y, total) 

if __name__ == '__main__': 
    use_string = strip_string("Good luck in the Facebook Hacker Cup this year!") 
    print(calculate_sum(use_string)) # Output: 13826822726371628751954609438720000000 
            # Expected output: 754 

Как я могу выполнить вышеизложенное в эффективной питонической манере? То, что у меня до сих пор, будет только умножать совокупность вместе, оно не будет подсчитывать количество символов в строке. Например:

Actualy algorithm: ABbCcc == 1*24 + 2*25 + 3*36 = 152 
My algorithm: ABbCcc == 24 * 25 * 25 * 26 * 26 * 26 = 263640000 
+1

@RadLexus является то, что лучше? – papasmurf

ответ

0

Вы вычисления произведения элементов в total в вашем сокращении. reduce(lambda x, y: x*y, total) эквивалентен ((total[0] * total[1]) * total[2]).... Если вы хотите получить сумму, вы можете заменить ее на lambda x, y: x + y или использовать встроенную функцию sum.

+0

Я не знаю, почему я не думал использовать 'sum' ..? Lol thank you – papasmurf

1

Зачем вам нужны все эти зачистки строк и т. Д., Если вы только считаете буквы в BEAUTIFICATION?

Я хотел бы предложить следующее:

BEAUTIFICATION = { ... 
} 


def calculate_sum(beautiful_string): 
    # letter value * count of this letters in string for each letter you count 
    return sum(BEAUTIFICATION[c] * beautiful_string.lower().count(c) for c in BEAUTIFICATION) 


if __name__ == '__main__': 
    use_string = 'ABbCcc' 
    print(calculate_sum(use_string)) # Output: 152 

    use_string = 'Good luck in the Facebook Hacker Cup this year!' 
    print(calculate_sum(use_string)) # Output: 487 (Are you sure the 754 is correct or you BEAUTIFICATION is absolutely correct?) 
+0

Задача говорит, что 754 является правильным выходом для этой строки, но у меня также есть 487, поэтому idk, если это неправильно или нет. Я отправлю вызов с тем, что у меня есть, и посмотрю, что произойдет. – papasmurf

+0

Также я использую разборку для пунктуации и пробела – papasmurf

+0

@papasmurf, ваша программа будет разбиваться на строку с помощью «\ t» (tab), например. Вы должны избегать дезинфекции ввода от всего, что не соответствует вашей цели. Вместо этого в моем подходе я работаю только с буквами, которые мне нужны, просто игнорируя все остальное в строке, не в зависимости от того, что это может быть вообще. –