Files
eulerfunt/haskell/p17.hs
2022-11-07 19:17:35 +05:30

23 lines
796 B
Haskell

--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"]