--The answer is written for numbers <= 1000 main :: IO () main = putStr $ show $ solve 1000 solve :: Int -> Int solve n = sum $ map (length . numWord) [1 .. n] numWord :: Int -> [Char] numWord n | n == 0 = "" | n == 1000 = "onethousand" | n < 20 = ones !! (n - 1) | n < 100 = tens !! (div n 10 - 2) ++ numWord (mod n 10) | mod n 100 == 0 = numWord (div n 100) ++ "hundred" | otherwise = numWord (div n 100) ++ "hundredand" ++ numWord (mod n 100) where tens :: [[Char]] tens = ["twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"] ones :: [[Char]] ones = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]