LoginSignup
1

More than 5 years have passed since last update.

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

Posted at

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(日本語訳)

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
1