Skip to content

Instantly share code, notes, and snippets.

@hroi
Created March 21, 2010 02:37
Show Gist options
  • Select an option

  • Save hroi/339036 to your computer and use it in GitHub Desktop.

Select an option

Save hroi/339036 to your computer and use it in GitHub Desktop.
; 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?
(defn say-number [n]
(cond
(< n 21)
(nth ["zero" "one" "two" "three" "four" "five" "six" "seven" "eight" "nine"
"ten" "eleven" "twelve" "thirteen" "fourteen" "fifteen" "sixteen" "seventeen"
"eighteen" "nineteen" "twenty"] n)
(< n 100)
(let [decade (int (/ n 10)) remainder (rem n 10)]
(str (nth ["" "" "twenty" "thirty" "forty" "fifty" "sixty" "seventy" "eighty" "ninety"] decade)
(if (pos? remainder) (str "-" (say-number remainder)))))
(< n 1000)
(let [century (int (/ n 100)) remainder (rem n 100)]
(str (say-number century) " hundred"
(if (pos? remainder)
(str " and " (say-number remainder)))))
(< n 1000000)
(let [millenium (int (/ n 1000)) remainder (rem n 1000)]
(str (say-number millenium) " thousand"
(if (pos? remainder)
(str " " (say-number remainder)))))))
(def correct-answer
(reduce + (map #(count (re-seq #"[a-z]" (say-number %))) (range 1 1001))))
; => 21124
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment