|
|
@@ -0,0 +1,70 @@
|
|
|
+{-
|
|
|
+If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total.
|
|
|
+If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used?
|
|
|
+NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage.
|
|
|
+-}
|
|
|
+
|
|
|
+import Data.Char
|
|
|
+import Data.Function
|
|
|
+
|
|
|
+(|>) = (&)
|
|
|
+
|
|
|
+-- Round Down to Nearest Ten
|
|
|
+rd2nt :: Int -> Int
|
|
|
+rd2nt x
|
|
|
+ | x < 10 = 0
|
|
|
+ | x < 20 = 10
|
|
|
+ | x < 30 = 20
|
|
|
+ | x < 40 = 30
|
|
|
+ | x < 50 = 40
|
|
|
+ | x < 60 = 50
|
|
|
+ | x < 70 = 60
|
|
|
+ | x < 80 = 70
|
|
|
+ | x < 90 = 80
|
|
|
+ | x < 100 = 90
|
|
|
+ | x >= 100 = rd2nt (mod x 100)
|
|
|
+
|
|
|
+digit_to_name :: Int -> String
|
|
|
+digit_to_name 0 = ""
|
|
|
+digit_to_name 1 = "one"
|
|
|
+digit_to_name 2 = "two"
|
|
|
+digit_to_name 3 = "three"
|
|
|
+digit_to_name 4 = "four"
|
|
|
+digit_to_name 5 = "five"
|
|
|
+digit_to_name 6 = "six"
|
|
|
+digit_to_name 7 = "seven"
|
|
|
+digit_to_name 8 = "eight"
|
|
|
+digit_to_name 9 = "nine"
|
|
|
+digit_to_name 10 = "ten"
|
|
|
+digit_to_name 11 = "eleven"
|
|
|
+digit_to_name 12 = "twelve"
|
|
|
+digit_to_name 13 = "thirteen"
|
|
|
+digit_to_name 14 = "fourteen"
|
|
|
+digit_to_name 15 = "fifteen"
|
|
|
+digit_to_name 16 = "sixteen"
|
|
|
+digit_to_name 17 = "seventeen"
|
|
|
+digit_to_name 18 = "eighteen"
|
|
|
+digit_to_name 19 = "nineteen"
|
|
|
+digit_to_name 20 = "twenty"
|
|
|
+digit_to_name 30 = "thirty"
|
|
|
+digit_to_name 40 = "forty"
|
|
|
+digit_to_name 50 = "fifty"
|
|
|
+digit_to_name 60 = "sixty"
|
|
|
+digit_to_name 70 = "seventy"
|
|
|
+digit_to_name 80 = "eighty"
|
|
|
+digit_to_name 90 = "ninety"
|
|
|
+digit_to_name 1000 = "one thousand"
|
|
|
+digit_to_name x
|
|
|
+ | (mod x 100) == 0 = digit_to_name (div x 100) ++ " hundred"
|
|
|
+ | x < 100 = digit_to_name (rd2nt x) ++ " " ++ digit_to_name (mod x 10)
|
|
|
+ | x < 1000 = digit_to_name (div x 100) ++ " hundred and " ++ digit_to_name (mod x 100)
|
|
|
+
|
|
|
+
|
|
|
+isNotSpace :: Char -> Bool
|
|
|
+isNotSpace x = isSpace x |> not
|
|
|
+
|
|
|
+solution :: Int
|
|
|
+solution = map digit_to_name [1..1000] |> map (filter isNotSpace) |> map length |> sum
|
|
|
+
|
|
|
+main :: IO ()
|
|
|
+main = putStrLn ("Solution: " ++ show solution)
|