Skip to content

Instantly share code, notes, and snippets.

@pedrovgs
Created January 13, 2017 15:58
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pedrovgs/b99ab5b710bdfaa9ca4a26a6274a8269 to your computer and use it in GitHub Desktop.
Save pedrovgs/b99ab5b710bdfaa9ca4a26a6274a8269 to your computer and use it in GitHub Desktop.
Roman Numerals Kata written in clojure by @Serchinastico
(def table-number->roman
[{:number 1000 :roman "M"}
{:number 900 :roman "CM"}
{:number 500 :roman "D"}
{:number 400 :roman "CD"}
{:number 100 :roman "C"}
{:number 90 :roman "XC"}
{:number 50 :roman "L"}
{:number 40 :roman "XL"}
{:number 10 :roman "X"}
{:number 9 :roman "IX"}
{:number 5 :roman "V"}
{:number 4 :roman "IV"}
{:number 3 :roman "III"}
{:number 2 :roman "II"}
{:number 1 :roman "I"}])
(defn first-matching
[number]
(first (filter #(= 1 (quot number (:number %))) table-number->roman)))
(defn number->roman
[number]
(loop [roman ""
number number]
(if (> number 0)
(let [translation (first-matching number)]
(recur (str roman (:roman translation)) (- number (:number translation))))
roman)))
(= "" (number->roman -50))
(= "" (number->roman 0))
(= "I" (number->roman 1))
(= "II" (number->roman 2))
(= "III" (number->roman 3))
(= "XV" (number->roman 15))
(= "XVI" (number->roman 16))
(= "IV" (number->roman 4))
(= "VIII" (number->roman 8))
(= "XIV" (number->roman 14))
(= "XLIV" (number->roman 44))
(= "C" (number->roman 100))
(= "CXLIV" (number->roman 144))
(= "D" (number->roman 500))
(= "CD" (number->roman 400))
(= "M" (number->roman 1000))
(= "CM" (number->roman 900))
(= "CMXLIV" (number->roman 944))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment