Условие:
Если записать числа от 1 до 5 английскими словами (one, two, three, four, five), то используется 3 + 3 + 5 + 4 + 4 = 19 букв.
nums={
1:'one',
2:'two',
3:'three',
4:'four',
5:'five',
6:'six',
7:'seven',
8:'eight',
9:'nine',
10:'ten',
11:'eleven',
12:'twelve',
13:'thirteen',
15:'fifteen',
18:'eighteen',
20:'twenty',
30:'thirty',
40:'forty',
50:'fifty',
60:'sixty',
70:'seventy',
80:'eighty',
90:'ninety',
}
Затем определим функцию, генерирующую числа
def gen_num(n,dic):
tmp=''
t=str(n)
if dic.get(n,False):
return dic[n]
elif n<20:
return dic[int(t[1])]+'teen'
elif n<100:
tmp=n-int(t[1])
return dic[tmp]+dic[int(t[1])]
elif n<1000:
if t[1:3]=='00':
return dic[int(t[0])]+'hundred'
else:
return dic[int(t[0])]+'hundredand'+gen_num(int(t[1:3]),nums)
elif n==1000:
return 'onethousand'
Данная функция если находит передаваемое число в словаре - возвращает значение числа на английском, если нет - пытается составить. Для чисел от 13-ти до 20-ти вставляем в окончание teen, числа до 100 - находим значение 10-тка в словаре и добавляем значение единиц
К примеру 23 будет 20:twenty + 3:trhee = twentythree..
Для сотен находим в словаре первую цифру числа, добавляем hundred. Если последующие числа 00 ничего не добавляем иначе добавляем and и рекурсивно вызываем эту же функцию для определения значений двух последующих цифр.
Далее осталось вызывать функцию в цикле и суммировать длину возвращаемых значений
s=0
for i in range(1,1001):
s+=len(gen_num(i,nums))
print(gen_num(i,nums))
print(s)
Если записать числа от 1 до 5 английскими словами (one, two, three, four, five), то используется 3 + 3 + 5 + 4 + 4 = 19 букв.
Сколько букв понадобится для записи всех чисел от 1 до 1000 (one thousand) включительно?
Решение
Если честно, я не очень люблю "лингвистические" задачи за достаточно сложные условия и минимум размаха для написания красивой логики, но все же возьмусь за эту.
Для начала определим словарь, в котором определим слова, которые сложно составить при помощи функции. Это будут числа от 1 до 13 и десятки
nums={
1:'one',
2:'two',
3:'three',
4:'four',
5:'five',
6:'six',
7:'seven',
8:'eight',
9:'nine',
10:'ten',
11:'eleven',
12:'twelve',
13:'thirteen',
15:'fifteen',
18:'eighteen',
20:'twenty',
30:'thirty',
40:'forty',
50:'fifty',
60:'sixty',
70:'seventy',
80:'eighty',
90:'ninety',
}
Затем определим функцию, генерирующую числа
def gen_num(n,dic):
tmp=''
t=str(n)
if dic.get(n,False):
return dic[n]
elif n<20:
return dic[int(t[1])]+'teen'
elif n<100:
tmp=n-int(t[1])
return dic[tmp]+dic[int(t[1])]
elif n<1000:
if t[1:3]=='00':
return dic[int(t[0])]+'hundred'
else:
return dic[int(t[0])]+'hundredand'+gen_num(int(t[1:3]),nums)
elif n==1000:
return 'onethousand'
Данная функция если находит передаваемое число в словаре - возвращает значение числа на английском, если нет - пытается составить. Для чисел от 13-ти до 20-ти вставляем в окончание teen, числа до 100 - находим значение 10-тка в словаре и добавляем значение единиц
К примеру 23 будет 20:twenty + 3:trhee = twentythree..
Для сотен находим в словаре первую цифру числа, добавляем hundred. Если последующие числа 00 ничего не добавляем иначе добавляем and и рекурсивно вызываем эту же функцию для определения значений двух последующих цифр.
Далее осталось вызывать функцию в цикле и суммировать длину возвращаемых значений
s=0
for i in range(1,1001):
s+=len(gen_num(i,nums))
print(gen_num(i,nums))
print(s)