会社で少し盛り上がった Project Euler をやってみる 017

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 もあるのでそちらを見ながらやると捗ると思います。

Project Euler(日本語訳)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.