PEをMathematicaで

Project Eulerに挑戦してみよう

Project Euler 17 / 数字の文字数

1から5までの数字を英単語で書けば one, two, three, four, five であり,全部で 3+3+5+4+4=19 個の文字が使われている。では,1から1000 (one thousand) までの数字をすべて英単語で書けば全部で何文字になるか。

注:空白文字やハイフンを数えないこと。たとえば 342 (three hundred and forty-two) は23文字,115 (one hundred and fifteen) は20文字と数える。なお,"and" を使用するのは英国の慣習。

Problem 17 - Project Euler


一気に文字数を求めるのではなく,2段階に分けて考えます。

342 → three hundred and forty-two → 23

後半は簡単で,不要な文字を除いて文字数を数えるだけです。StringReplace[ ] と StringLength[ ] で書けます。

前半については IF 分のネストで対応しようと思ったのですが,Mathematica には IntegerName[ ] という便利な関数が用意されていました。342, 115, 1000を変換してみましょう。


実装するべき変換ルールはこうです。

  • ハイフンを削除
  • 半角スペースを削除
  • hundred の後に and を挿入。100で割った余りによる場合分けが必要
  • 1 thousand は thousand に直す

1000が「1 thousand」になるのが不思議でしたが,1000以上はちょっと事情が違うみたいですね。1001以降は thousand の後にカンマが入ったりします。


より自然な表記が得られる IntegerName[n, "Words"] に対して変換を行うコードを書いて正解しました。