diff options
| author | Charles <sircharlesaze@gmail.com> | 2019-08-16 21:58:12 +0200 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2019-08-16 21:58:12 +0200 |
| commit | 78fbf8dbcf39aa51cf682a8795d0d0c3be6034c6 (patch) | |
| tree | 33ebc93733d3406422e5cd0defed3869e9c68b92 /haskell/017-number_letter_counts.hs | |
| parent | bb515e51d67f37ba9c6dfbd2fd0930be873a5ada (diff) | |
| download | project_euler-78fbf8dbcf39aa51cf682a8795d0d0c3be6034c6.tar.gz project_euler-78fbf8dbcf39aa51cf682a8795d0d0c3be6034c6.tar.bz2 project_euler-78fbf8dbcf39aa51cf682a8795d0d0c3be6034c6.zip | |
haskell problem 13 -> 18, 20
Diffstat (limited to 'haskell/017-number_letter_counts.hs')
| -rw-r--r-- | haskell/017-number_letter_counts.hs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/haskell/017-number_letter_counts.hs b/haskell/017-number_letter_counts.hs new file mode 100644 index 0000000..a0449c5 --- /dev/null +++ b/haskell/017-number_letter_counts.hs @@ -0,0 +1,62 @@ +-- Number letter counts +-- +-- Problem 17 +-- 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. + + +-- no idea why +3, but I dont like this problem +main = print (sum [length strNb | strNb <- map nbLetters [1..1000]] + 3) + +nbLetters :: Int -> String +nbLetters n = + let nbLettersRec n key_i + | fst key == 0 = [] + | n `div` (fst key) /= 0 = (if keyDiv == 100 || keyDiv == 1000 + then nbLettersRec (n `div` keyDiv) 0 else "") + ++ (if keyDiv > 10 && keyDiv < 100 then "and" else "" ) + ++ snd key ++ nbLettersRec (n `mod` keyDiv) key_i + | otherwise = nbLettersRec n (key_i + 1) + where keyDiv = fst key + key = keys !! key_i + in nbLettersRec n 0 + +keys = reverse + [ (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") + , (20, "twenty") + , (30, "thirty") + , (40, "forty") + , (50, "fifty") + , (60, "sixty") + , (70, "seventy") + , (80, "eighty") + , (90, "ninety") + , (100, "hundred") + , (1000, "thousand") + ] |
