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