diff --git a/romans.py b/romans.py new file mode 100644 index 0000000..0e2d6c6 --- /dev/null +++ b/romans.py @@ -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") diff --git a/romans.test.py b/romans.test.py new file mode 100644 index 0000000..1005ada --- /dev/null +++ b/romans.test.py @@ -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()