RosettaCodeData/Task/Roman-numerals-Encode/Julia/roman-numerals-encode.julia

35 lines
841 B
Text
Raw Permalink Normal View History

2020-02-17 23:21:07 -08:00
using Printf
2015-11-18 06:14:39 +00:00
function romanencode(n::Integer)
2018-06-22 20:57:24 +00:00
if n < 1 || n > 4999 throw(DomainError()) end
DR = [["I", "X", "C", "M"] ["V", "L", "D", "MMM"]]
2015-11-18 06:14:39 +00:00
rnum = ""
for (omag, d) in enumerate(digits(n))
if d == 0
omr = ""
2018-06-22 20:57:24 +00:00
elseif d < 4
omr = DR[omag, 1] ^ d
2015-11-18 06:14:39 +00:00
elseif d == 4
2018-06-22 20:57:24 +00:00
omr = DR[omag, 1] * DR[omag, 2]
2015-11-18 06:14:39 +00:00
elseif d == 5
omr = DR[omag, 2]
2018-06-22 20:57:24 +00:00
elseif d < 9
omr = DR[omag, 2] * DR[omag, 1] ^ (d - 5)
2015-11-18 06:14:39 +00:00
else
2018-06-22 20:57:24 +00:00
omr = DR[omag, 1] * DR[omag + 1, 1]
2015-11-18 06:14:39 +00:00
end
2018-06-22 20:57:24 +00:00
rnum = omr * rnum
2015-11-18 06:14:39 +00:00
end
return rnum
end
2018-06-22 20:57:24 +00:00
testcases = [1990, 2008, 1668]
append!(testcases, rand(1:4999, 12))
2015-11-18 06:14:39 +00:00
testcases = unique(testcases)
println("Test romanencode, arabic => roman:")
2018-06-22 20:57:24 +00:00
for n in testcases
@printf("%-4i => %s\n", n, romanencode(n))
2015-11-18 06:14:39 +00:00
end