diff --git a/gonzalo123/Python/RomanNumerals.py b/gonzalo123/Python/RomanNumerals.py new file mode 100644 index 0000000..7386b55 --- /dev/null +++ b/gonzalo123/Python/RomanNumerals.py @@ -0,0 +1,48 @@ +class RomanNumerals: + _numerals = { + 1 : "I", + 4 : "IV", # substract + 5 : "V", + 9: "IX", # substract + 10 : "X", + 40 : "XL", # substract + 50 : "L", + 90 : "XC", # substract + 100 : "C", + 400 : "CD", # substract + 500 : "D", + 900 : "CM", # substract + 1000 : "M" + } + + def _getKeys(self): + keys = self._numerals.keys() + keys.sort() + keys.reverse() + + return keys + + def num2Romans(self, number): + out = "" + for i in self._getKeys(): + count = number / i + out = "%s%s" % (out, self._numerals[i] * count) + number -= i * count + return out + + def roman2Nums(self, roman): + romanValues = ('M', 'D', 'C', 'L', 'X', 'V', 'I') + romanKeys = (1000, 500, 100, 50, 10, 5, 1) + + out = 0 + + for i in range(len(roman)): + c = roman[i] + value = romanKeys[romanValues.index(c)] + if len(roman) > i+1: + nextvalue = romanKeys[romanValues.index(roman[i+1])] + if nextvalue > value: + value *= -1 + out += value + + return out diff --git a/gonzalo123/Python/RomanNumeralsTest.py b/gonzalo123/Python/RomanNumeralsTest.py new file mode 100644 index 0000000..ab9eb00 --- /dev/null +++ b/gonzalo123/Python/RomanNumeralsTest.py @@ -0,0 +1,43 @@ +import unittest +import RomanNumerals + +class RomanNumeralsTest (unittest.TestCase): + def setUp(self): + self.rn = RomanNumerals.RomanNumerals() + + def _test_simple(self): + self.assertEquals("I", self.rn.num2Romans(1)) + self.assertEquals(1, self.rn.roman2Nums("")) + + self.assertEquals("V", self.rn.num2Romans(5)) + self.assertEquals5(5, self.rn.roman2Nums("V")) + + self.assertEquals("X", self.rn.num2Romans(10)) + self.assertEquals(10, self.rn.roman2Nums("")) + + def test_complex(self): + self.assertEquals("VII", self.rn.num2Romans(7)) + self.assertEquals(7, self.rn.roman2Nums("VII")) + + self.assertEquals("XIV", self.rn.num2Romans(14)) + self.assertEquals(14, self.rn.roman2Nums("XIV")) + + self.assertEquals("XXIII", self.rn.num2Romans(23)) + self.assertEquals(23, self.rn.roman2Nums("XXIII")) + + self.assertEquals("CXLV", self.rn.num2Romans(145)) + self.assertEquals(145, self.rn.roman2Nums("CXLV")) + + self.assertEquals("MCMLXXV", self.rn.num2Romans(1975)) + self.assertEquals(1975, self.rn.roman2Nums("MCMLXXV")) + + self.assertEquals("XLII", self.rn.num2Romans(42)) + self.assertEquals(42, self.rn.roman2Nums("XLII")) + + def test_kata(self): + self.assertEquals("MCMXCIX", self.rn.num2Romans(1999)) + self.assertEquals(1999, self.rn.roman2Nums("MCMXCIX")) + + +if __name__ == '__main__': + unittest.main()