morris555's diary

高校生のブログです。

Problem 17

Problem 17は「1から1000までの数字をすべて英単語で書けば、全部で何文字になるか」という問題です。

nums1 = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]

nums2 = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"]

toStr n | n == 1000 = "onethousand"
        | n >= 100 = nums1 !! eraseD n 100 ++ "hundred" ++ case toStr (getD n 100) of
            "" -> ""
            s -> "and" ++ s
        | n >= 20 = nums2 !! eraseD n 10 ++ toStr (getD n 10)
        | otherwise = nums1 !! n
          where
            eraseD x y = x `div` y
            getD x y = x - eraseD x y * y

main = print . length . concatMap toStr $ [1..1000]

こんな感じかな。