- 本記事はProjectEulerの「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。
問題 17. 数字を英語で書いたときの文字数
原文 Problem 17: Number letter counts
問題の要約:1から1000までの数字を英語で書いたときの文字数の合計を求めよ(スペースやハイフォンは除く)
結構面倒くさいですが、地道に各桁ごとに英語に直すプログラムを作りました。
nname1 = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",\
"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eithteen", "nineteen"]
nname10 = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]
def digit19(n):
return nname1[n]
def digit99(n):
if n < 20: return digit19(n)
return nname10[n//10]+" "+nname1[n%10]
def digit999(n):
if n < 100: return digit99(n)
if n%100 == 0: return nname1[n//100]+" hundred"
return nname1[n//100]+" hundred and "+digit99(n%100)
def digit9999(n):
if n < 1000: return digit999(n)
if n%1000 == 0: return nname1[n//1000]+" thousand"
return nname1[n//1000]+" thousand and "+digit999(n%1000)
これらを使って1000までの文字数(スペースは削除)の合計をだします。
print(sum([len( digit9999(i).replace(" ","")) for i in range(1,1001)]))
しかしその後いろいろ調べたらpythonにnum2wordsというモジュールがあることが分かりました。Google Colabには標準で入っていないのでインストールする必要があります。
!pip install num2words
from num2words import num2words
print([num2words(i) for i in [14, 21, 99, 115, 299]])
['fourteen', 'twenty-one', 'ninety-nine', 'one hundred and fifteen', 'two hundred and ninety-nine']
これを使えば1行で完成。ハイフォンもあるので正規表現モジュールのre.subを使って削除しました。
import re
print(sum([len(re.sub('[ -]','', num2words(i))) for i in range(1,1001)]))
(開発環境:Google Colab)