Problem 017
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" を使用するのは英国の慣習.
Answer 017 (Python)
絶対もっと綺麗にかけるけど、タイムアップ。お目汚しすみません。
(答えはあっています)
import sys
class Problem17:
COUNT = {
0: '',
1: 'one',
2: 'two',
3: 'three',
4: 'four',
5: 'five',
6: 'six',
7: 'seven',
8: 'eight',
9: 'nine',
10: 'ten',
11: 'eleven',
12: 'twelve',
13: 'thirteen',
14: 'fourteen',
15: 'fifteen',
16: 'sixteen',
17: 'seventeen',
18: 'eighteen',
19: 'nineteen',
20: 'twenty',
30: 'thirty',
40: 'forty',
50: 'fifty',
60: 'sixty',
70: 'seventy',
80: 'eighty',
90: 'ninety',
100: 'hundred',
1000: 'onethousand'
}
def count(self):
# count from 1 to 9
count001_009 = sum(len(self.COUNT[i]) for i in range(1, 10))
# count from 10 to 19
count010_019 = sum(len(self.COUNT[i]) for i in range(10, 20))
# count from 20 to 99
count020_099 = sum(len(self.COUNT[i * 10]) * 10 + count001_009 for i in range(2, 10))
# count from 1 to 99
count001_099 = count001_009 + count010_019 +count020_099
# count from 100 to 999
count100_999 = sum(len(self.COUNT[i] + self.COUNT[100] + 'and') * 100 + count001_099 for i in range(1, 10))
# 100, 200, ... 900 のときの and まで数えてしまっているので除外
count100_999 = count100_999 - len('and') * 9
# count from 1 to 999
count001_999 = count001_099 + count100_999
# count from 1 to 1000
return count001_999 + len(self.COUNT[1000])
if __name__ == '__main__':
p = Problem17()
print(p.count())
(参考) Project Euler とは
Project Euler はプログラミングで数学の問題を解くサイトです。問題は600問以上あるので、勉強に使うのも良し、楽しむのも良しです。
サイトに登録すれば、解答を submit することができ、その場であっているか判定してくれます。
また、問題だけであれば、日本語に翻訳された Wiki もあるのでそちらを見ながらやると捗ると思います。