@Idwln

Неправильный ответ в задаче Эйлера?

Всем привет! Я совсем недавно в программировании и сейчас решаю задачи Эйлера. Столкнулся с проблемой на 17 задаче, которая звучит так: Если записать числа от 1 до 5 английскими словами (one, two, three, four, five), то используется всего 3 + 3 + 5 + 4 + 4 = 19 букв.

Сколько букв понадобится для записи всех чисел от 1 до 1000 (one thousand) включительно?

Примечание: Не считайте пробелы и дефисы. Например, число 342 (three hundred and forty-two) состоит из 23 букв, число 115 (one hundred and fifteen) - из 20 букв. Использование "and" при записи чисел соответствует правилам британского английского.


Вот моё решение:
value = 0
lexicon = {
    1: 3,
    2: 3,
    3: 5,
    4: 4,
    5: 4,
    6: 3,
    7: 5,
    8: 5,
    9: 4,
    10 : 3,
    11 : 6,
    12 : 6,
    13 : 8,
    15 : 7,
    20 : 6,
    30: 6,
    40 : 5,
    50 : 5,
    100: 7
}

for x in range(1,1001):
    line = list(str(x))
    if x <= 13:
        value += lexicon[x]
    elif x <= 100:
        if x in lexicon:
            value+= lexicon[x]
        elif x <= 20:
            value += lexicon[int(line[1])] + 4
        else:
            line2 = line[0] + '0'
            if int(line2) in lexicon:
                value += lexicon[int(line2)] + lexicon[int(line[1])]
            else:
                value += lexicon[int(line[0])] + 2
                if int(line[1]) != 0:
                    value += lexicon[int(line[1])]
    elif x < 1000:
        if int(line[2]) != 0 and int(line[1]) != 0:
            line2 = line[1] + line[2]
            if not int(line2) in lexicon and int(line2) > 20:
                line3 = line[1] + '0'
                if not int(line3) in lexicon:
                    value += lexicon[int(line[0])] + 10 + lexicon[int(line[1])] + 2 + lexicon[int(line[2])]
                else:
                    value += lexicon[int(line[0])] + 10 + lexicon[int(line3)]  + lexicon[int(line[2])]
            elif not int(line2) in lexicon and int(line2) < 20:
                value += lexicon[int(line[0])] + 10 + lexicon[int(line[2])] + 4
            else:
                value += lexicon[int(line[0])] + 10 + lexicon[int(line2)]
        elif int(line[2]) == 0:
            line2 = line[1] + '0'
            if int(line2) in lexicon:
                value += lexicon[int(line2)] + 10 + lexicon[int(line[0])]
            else:
                if int(line[1]) == 0:
                    value+= 7 + lexicon[int(line[0])]
                else:
                    value += lexicon[int(line[1])] + 9
                    value += lexicon[int(line[0])]
                    if int(line[2]) != 0:
                        value += lexicon[int(line[2])]
        else:
            value += lexicon[int(line[0])] + 10 + lexicon[int(line[2])]
    else:
        value+=11

print(value)


Код выдаёт результатом 21123, а правильный ответ, который я нашёл это 21124. Мой код вероятно совсем ужасен для некоторых, но я не прошу другого решения задачи, а ответа на то, почему код выдаёт неправильный вариант и где моя ошибка. Через дебаггер уже всё проверил и всё вроде должно работать правильно, но где то есть маленькая ошибка и я не в силах её найти. Помогите пожалуйста.
  • Вопрос задан
  • 284 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Советую вынести подсчёт количества букв для одного числа в отдельную функцию. Тогда вы сможете легко проверить корректность этой функции для разных чисел.
Ну и у вас ошибка с числом 18 - eighteen, длина 8, ваш код выдаёт 9.
P.S. И с числом 80 - eighty, длина 6, ваш код выдаёт 7.
P.P.S. И с числом 100 - one hundred, длина 10, ваш код выдаёт 7.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы