aboutsummaryrefslogtreecommitdiff
path: root/challenge-227/sgreen/python/ch-2.py
diff options
context:
space:
mode:
Diffstat (limited to 'challenge-227/sgreen/python/ch-2.py')
-rwxr-xr-xchallenge-227/sgreen/python/ch-2.py69
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:])