diff options
Diffstat (limited to 'challenge-227/sgreen/python/ch-2.py')
| -rwxr-xr-x | challenge-227/sgreen/python/ch-2.py | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/challenge-227/sgreen/python/ch-2.py b/challenge-227/sgreen/python/ch-2.py new file mode 100755 index 0000000000..30aa4b9995 --- /dev/null +++ b/challenge-227/sgreen/python/ch-2.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 + +import sys + + +def from_roman(roman): + mapping = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000} + digits = [mapping[s] for s in roman] + + number = 0 + for i, v in enumerate(digits): + if i < len(digits)-1 and v < digits[i+1]: + number -= v + else: + number += v + + return number + + +def to_roman(number): + if number == 0: + return 'nulla' + elif number > 3999 or number < 0: + return 'non potest' + elif type(number) == float: + if not number.is_integer(): + return 'non potest' + number = int(number) + + mapping = [ + ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', ], + ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', ], + ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', ], + ['', 'M', 'MM', 'MMM', ], + ] + + # Convert it into a string + roman = '' + number = str(number) + + # Iterate in reverse + for i, d in enumerate(number[::-1]): + roman = mapping[i][int(d)] + roman + + return roman + + +def main(roman1, oper, roman2): + number1 = from_roman(roman1) + number2 = from_roman(roman2) + + if oper == '+': + number = number1 + number2 + elif oper == '-': + number = number1 - number2 + elif oper == '*' or oper == '×': + number = number1 * number2 + elif oper == '/' or oper == '÷': + number = number1 / number2 + elif oper == '**': + number = number1 ** number2 + else: + raise ValueError(f"Unknown operator: '{oper}'") + + print(to_roman(number)) + + +if __name__ == '__main__': + main(*sys.argv[1:]) |
