Bash
ProjectEuler
数学

Project Euler Q17 【数字の文字数】

More than 1 year has passed since last update.

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。

問題

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" を使用するのは英国の慣習.

解答

seq -w 1000 |
sed 's/10$/ ten/' |
sed 's/11$/ eleven/' |
sed 's/12$/ twelve/' |
sed 's/13$/ thirteen/' |
sed 's/14$/ fourteen/' |
sed 's/15$/ fifteen/' |
sed 's/16$/ sixteen/' |
sed 's/17$/ seventeen/' |
sed 's/18$/ eighteen/' |
sed 's/19$/ nineteen/' |
sed 's/1/ one /g' |
sed 's/2/ two /g' |
sed 's/3/ three /g' |
sed 's/4/ four /g' |
sed 's/5/ five /g' |
sed 's/6/ six /g' |
sed 's/7/ seven /g' |
sed 's/8/ eight /g' |
sed 's/9/ nine /g' |
sed 's/0/ zero /g' |
sed -r 's/ zero  ([^ ]*)  (.*)/\1 hundred and \2/' |
sed 's/ two  / twenty /' |
sed 's/ three  / thirty /' |
sed 's/ four  / forty /' |
sed 's/ five  / fifty /' |
sed 's/ six  / sixty /' |
sed 's/ seven  / seventy /' |
sed 's/ eight  / eighty /' |
sed 's/ nine  / ninety /' |
sed '1000s/.*/one thousand/' |
sed 's/ and zero  zero//' |
sed 's/ zero  / /' |
sed 's/ zero $//' |
sed 's/zero hundred and//' |
tr -d ' ' |
awk '{s+=length}END{print s}'
21124

英語にするまでがクッソ大変。
英語にしてしまえば一瞬。

※英語にせずに桁数でやるやり方も考えたが、数値なのか桁数なのかごっちゃになるし、自分で書いていてよく分からなくなるのでやめた。

答え合わせ

こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/017.html