Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions romans.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
class Romans:

roman_from_num = {
1: "I",
5: "V",
10: "X",
50: "L",
100: "C",
500: "D",
1000: "M"
}

num_from_roman = {
"I": 1,
"V": 5,
"X": 10,
"L": 50,
"C": 100,
"D": 500,
"M": 1000
}

def __init__(self, value):
if type(value) == str:
self._str = value
self._num = Romans.str_to_num(value)
elif type(value) == int:
self._str = Romans.num_to_str(value)
self._num = value

def __str__(self):
return self._str

def __int__(self):
return self._num

@staticmethod
def str_to_num(value):
result = [num_from_roman.get(i) for i in value]

for i in range(len(result)):
if result[i] < result[min(len(result)-1, i+1)]:
result[i] *= -1

return sum(result)

@staticmethod
def num_to_str(value):
result = ""
for v in sorted(num_from_roman.keys(), reverse=True):
unit_count = value // v
result += num_from_roman[v] * unit_count
value -= unit_count* v

result = result.replace("VIIII", "IX").replace("LXXXX", "XC").replace("DCCCC", "CM")
return result.replace("IIII", "IV").replace("XXXX", "XL").replace("CCCC", "CD")
64 changes: 64 additions & 0 deletions romans.test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import unittest
from romans import Romans as R

class TestRomans(unittest.TestCase):

def test_i(self):
self.assertEqual(1, int(R("I")))

def test_v(self):
self.assertEqual(5, int(R("V")))

def test_x(self):
self.assertEqual(10, int(R("X")))

def test_l(self):
self.assertEqual(50, int(R("L")))

def test_c(self):
self.assertEqual(100, int(R("C")))

def test_d(self):
self.assertEqual(500, int(R("D")))

def test_m(self):
self.assertEqual(1000, int(R("M")))

def test_ii(self):
self.assertEqual(2, int(R("II")))

def test_iv(self):
self.assertEqual(4, int(R("IV")))

def test_xlix(self):
self.assertEqual(49, int(R("XLIX")))

def test_mmm(self):
self.assertEqual(3000, int(R("MMM")))

def test_1(self):
self.assertEqual("I", str(R(1)))

def test_2(self):
self.assertEqual("II", str(R(2)))

def test_3000(self):
self.assertEqual("MMM", str(R(3000)))

def test_9(self):
self.assertEqual("IX", str(R(9)))

def test_49(self):
self.assertEqual("XLIX", str(R(49)))

def test_400(self):
self.assertEqual("CD", str(R(400)))

def test_900(self):
self.assertEqual("CM", str(R(900)))

def test_999(self):
self.assertEqual("CMXCIX", str(R(999)))

if __name__ == '__main__':
unittest.main()