17 lines
602 B
Clojure
17 lines
602 B
Clojure
(defn a2r [a]
|
|
(let [rv '(1000 500 100 50 10 5 1)
|
|
rm (zipmap rv "MDCLXVI")
|
|
dv (->> rv (take-nth 2) next #(interleave % %))]
|
|
(loop [a a rv rv dv dv r nil]
|
|
(if (<= a 0)
|
|
r
|
|
(let [v (first rv)
|
|
d (or (first dv) 0)
|
|
l (- v d)]
|
|
(cond
|
|
(= a v) (str r (rm v))
|
|
(= a l) (str r (rm d) (rm v))
|
|
(and (> a v) (> a l)) (recur (- a v) rv dv (str r (rm v)))
|
|
(and (< a v) (< a l)) (recur a (rest rv) (rest dv) r)
|
|
:else (recur (- a l) (rest rv) (rest dv) (str r (rm d) (rm v)))))))))
|