Add solutions for problems 17 and 18.

This commit is contained in:
jdmcdona 2015-08-03 12:32:50 -05:00
parent 933351b64c
commit 08127b7711
2 changed files with 57 additions and 0 deletions

33
Problem17.hs Normal file
View File

@ -0,0 +1,33 @@
-- 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.List
inWords :: Integer -> String
inWords n
| n < 0 = "negative " ++ inWords (negate n)
| n <= 19 = [ "zero", "one", "two", "three", "four", "five", "six"
, "seven", "eight", "nine", "ten", "eleven", "twelve"
, "thirteen", "fourteen", "fifteen", "sixteen"
, "seventeen", "eighteen", "nineteen"
] !! fromInteger n
| n <= 99 = case n `divMod` 10 of
(m, q) -> let tens = [ "twenty", "thirty", "forty", "fifty"
, "sixty", "seventy", "eighty", "ninety" ]
in (tens !! fromInteger (m - 2)) ++
(if q == 0 then "" else ("-" ++ inWords q))
| n <= 999 = case n `divMod` 100 of
(m, 0) -> inWords m ++ " hundred"
(m, r) -> inWords m ++ " hundred and " ++ inWords r
| n <= 9999 = case n `divMod` 1000 of
(m, 0) -> inWords m ++ " thousand"
(m, r) | r <= 99 -> inWords m ++ " thousand and " ++ inWords r
| otherwise -> inWords m ++ " thousand " ++ inWords r
main = print $ length $ filter isAlpha $ concatMap inWords [1..1000]

24
Problem18.hs Normal file
View File

@ -0,0 +1,24 @@
-- Find the maximum total from top to bottom of the triangle below:
import Data.List
triangle =
[ [ 75 ]
, [ 95,64 ]
, [ 17,47,82 ]
, [ 18,35,87,10 ]
, [ 20,04,82,47,65 ]
, [ 19,01,23,75,03,34 ]
, [ 88,02,77,73,07,63,67 ]
, [ 99,65,04,28,06,16,70,92 ]
, [ 41,41,26,56,83,40,80,70,33 ]
, [ 41,48,72,33,47,32,37,16,94,29 ]
, [ 53,71,44,65,25,43,91,52,97,51,14 ]
, [ 70,11,33,28,77,73,17,78,39,68,17,57 ]
, [ 91,71,52,38,17,14,91,43,58,50,27,29,48 ]
, [ 63,66,04,68,89,53,67,30,73,16,69,87,40,31 ]
, [ 04,62,98,27,23,09,70,98,73,93,38,53,60,04,23 ]
]
maxLR xs = zipWith max xs (tail xs)
routes = head . foldr1 (\xs ys -> zipWith (+) xs $ maxLR ys)
main = print $ routes triangle