Project Euler Problem 17
http://projecteuler.net/index.php?section=problems&id=17
1から1000を英語で書いた場合の文字数
main = print $ length $ foldl1 (++) $ map toWords [1..1000] toWords :: Int -> String toWords 1000 = "one" ++ "thousand" toWords n = let h = n `div` 100 --100の位の数 t = (n `mod` 100) `div` 10 --10の位の数 o = n `mod` 10 --1の位の数 in (if h > 0 then toWord h ++ "hundred" ++ (if t > 0 || o > 0 then "and" else "") else "") ++ (if t < 2 then toWord (t*10+o) else toWord (t*10) ++ toWord o) toWord :: Int -> String toWord 0 = "" toWord 1 = "one" toWord 2 = "two" toWord 3 = "three" toWord 4 = "four" toWord 5 = "five" toWord 6 = "six" toWord 7 = "seven" toWord 8 = "eight" toWord 9 = "nine" toWord 10 = "ten" toWord 11 = "eleven" toWord 12 = "twelve" toWord 13 = "thirteen" toWord 14 = "fourteen" toWord 15 = "fifteen" toWord 16 = "sixteen" toWord 17 = "seventeen" toWord 18 = "eighteen" toWord 19 = "nineteen" toWord 20 = "twenty" toWord 30 = "thirty" toWord 40 = "forty" toWord 50 = "fifty" toWord 60 = "sixty" toWord 70 = "seventy" toWord 80 = "eigthy" toWord 90 = "ninety" toWord n = error "toWord:undefined " ++ (show n)