Add solutions for problems 17 and 18.
This commit is contained in:
parent
933351b64c
commit
08127b7711
|
|
@ -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]
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue