017. 数词字母数量(number letter counts)
如果把数字一到五用单词写出来,即one, two, three, four, five,那么总共使用的字母数量:
$$ 3+3+5+4+4=19 $$如果把从一到一千的数字用对应的单词写出来,总共需要多少个字母?(注意:不要计算空格与连字符,如342(three hundred and forty-two)包含23个字母,而115(one hundred and fifteen)包含20个字母,and的使用遵守英式英语的规则。)
分析:将所有需要用到的数词都存入到一个CSV文件中并用pandas导入,并将其转化为一个词典。分别考\([1:20],[21:100],[101:1000]\)不同的数词对应规则,编写一个将数字转化为相应的词语的函数,但忽略空格与连字符。列出所有1000以下的数字,转化为对应的词语并统计总的字母数量。
# time cost = 4.31 ms ± 58.6 µs
import pandas as pd
def num_to_words(n):
if n in words_dict.keys():
return words_dict[n]
else:
if 21<=n<=100:
ten_digit = n//10*10
digit = n%10
return words_dict[ten_digit] + words_dict[digit]
elif 101<=n<=1000:
hundred_dict = n//100
remainder = n%100
if remainder == 0:
return words_dict[hundred_dict] + 'hundred'
else:
return words_dict[hundred_dict] + 'hundredand' + num_to_words(remainder)
def main():
df = pd.read_csv('data/ep17.csv',header=None)
words_dict = df.set_index(0).to_dict()[1]
ans = sum([len(num_to_words(x)) for x in range(1,1001)])
return ans