LoginSignup
0
0

More than 1 year has passed since last update.

【Project Euler】Problem 17: 数字を英語で書いたときの文字数

Posted at
  • 本記事は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)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0