92 lines
2.7 KiB
Lua
92 lines
2.7 KiB
Lua
local numbers = { 1000, 500, 100, 50, 10, 5, 1 }
|
|
local chars = { "M", "D", "C", "L", "X", "V", "I" }
|
|
|
|
local function convertToRoman ( value )
|
|
local result = ""
|
|
for index, number in ipairs ( numbers )
|
|
do
|
|
local times = math.floor ( value / number )
|
|
-- print
|
|
-- (
|
|
-- "Value: "..tostring(value)
|
|
-- ..", index|number: "..tostring(index).."|"..tostring(number)
|
|
-- ..", times: "..tostring(times)
|
|
-- )
|
|
result = result .. chars [ index ]:rep ( times )
|
|
value = value % number
|
|
for inner = #numbers, index + 1, -1
|
|
do
|
|
local aux = numbers [ inner ]
|
|
local temp = number - aux
|
|
-- print
|
|
-- (
|
|
-- "inner: "..tostring(inner)
|
|
-- ..", value: "..tostring(value)
|
|
-- ..", aux: "..tostring(aux)
|
|
-- ..", temp: "..tostring(temp)
|
|
-- )
|
|
if value - temp >= 0
|
|
and value < number
|
|
and value > 0
|
|
and temp ~= aux
|
|
then
|
|
-- print ( "!" .. chars [ inner ] .. chars [ index ] )
|
|
result = result .. chars [ inner ] .. chars [ index ]
|
|
value = value - temp
|
|
break
|
|
end
|
|
end
|
|
end
|
|
return result
|
|
end
|
|
|
|
function toroman ( value )
|
|
local value = tonumber ( value )
|
|
if not value
|
|
or value ~= value
|
|
then
|
|
error("Input not a number")
|
|
elseif value == math.huge
|
|
or -value == math.huge
|
|
then
|
|
error("Input too large")
|
|
else
|
|
local value = math.floor ( value )
|
|
if value == 0
|
|
then
|
|
return "0"
|
|
elseif value < 0
|
|
then
|
|
return "-" .. convertToRoman ( -value )
|
|
else
|
|
return convertToRoman ( value )
|
|
end
|
|
end
|
|
end
|
|
|
|
if false
|
|
then
|
|
print("9876", toroman(9876), "MMMMMMMMMDCCCLXXVI")
|
|
print("944", toroman(944), "CMXLIV")
|
|
print("1", toroman(1), "I")
|
|
print("4", toroman(4), "IV")
|
|
print("5", toroman(5), "V")
|
|
print("6", toroman(6), "VI")
|
|
print("9", toroman(9), "IX")
|
|
print("501", toroman(501), "DI")
|
|
print("1024", toroman(1024), "MXXIV")
|
|
print("369", toroman(369), "CCCLXIX")
|
|
if false
|
|
then
|
|
print(3999999, toroman(3999999)) -- these two nuke the horizontal scroll bar...
|
|
print(4000000, toroman(4000000))
|
|
print(math.huge, toroman(math.huge)) -- fails, which is good.
|
|
end
|
|
print(0, toroman(0), "0")
|
|
print(2012, toroman(2012), "MMXII")
|
|
print(99, toroman(99), "XCIX")
|
|
print(999, toroman(999), "CMXCIX")
|
|
print(1001, toroman(1001), "MI")
|
|
print(-2012, toroman(-2012), "-MMXII")
|
|
end
|