Paste: problem 17

Author: m
Mode: haskell
Date: Tue, 26 Jul 2011 14:49:22
Plain Text |
import Data.Maybe

digits = [(0, "")
         ,(1, "one")
         ,(2, "two")
         ,(3, "three")
         ,(4, "four")
         ,(5, "five")
         ,(6, "six")
         ,(7, "seven")
         ,(8, "eight")
         ,(9, "nine")
         ,(10, "ten")
         ,(11, "eleven")
         ,(12, "twelve")
         ,(13, "thirteen")
         ,(14, "fourteen")
         ,(15, "fifteen")
         ,(16, "sixteen")
         ,(17, "seventeen")
         ,(18, "eighteen")
         ,(19, "nineteen")]

tenDigits = [(2, "twenty")
       ,(3, "thirty")
       ,(4, "forty")
       ,(5, "fifty")
       ,(6, "sixty")
       ,(7, "seventy")
       ,(8, "eighty")
       ,(9, "ninety")]                    

numsTemplate k d = fromJust $ lookup k d

tens = flip numsTemplate tenDigits
units = flip numsTemplate digits
hundreds = (++ " hundred") . units

buildNumberString :: Int -> String
buildNumberString x | x < 20  = units x
                    | x < 100 = build99 x
                    | otherwise = build999 x

build99 x = build' $ numberToDigits x
    where build' [t, u]            | u == 0    = tens t
                                   | otherwise = tens t ++ "-" ++ units u

build999 x = build' $ numberToDigits x
    where build' [h, t, u] | num99 == 0 = (hundreds h)
                           | otherwise  = (hundreds h) ++ " and " ++  buildNumberString num99
                           where num99 = to99 t u
          to99 x y = x * 10 + y

numberToDigits :: Int -> [Int]
numberToDigits x = map (read . singleton) $ show x 

singleton x = [x]

numStrings = (map buildNumberString [1..999]) ++ ["one thousand"]

answer = length $ concat $ map (filter (flip notElem "- ")) $ numStrings

New Annotation

Summary:
Author:
Mode:
Body: