1
1
ROMAN = [
2
- (1000000 , "M_" ),
3
- (900000 , "C_M_" ),
4
- (500000 , "D_" ),
5
- (400000 , "C_D_" ),
6
- (100000 , "C_" ),
7
- (90000 , "X_C_" ),
8
- (50000 , "L_" ),
9
- (40000 , "X_L_" ),
10
- (10000 , "X_" ),
11
- (9000 , "I_X_" ),
12
- (5000 , "V_" ),
13
- (4000 , "I_V_" ),
14
- (1000 , "M" ),
15
- (900 , "CM" ),
16
- (500 , "D" ),
17
- (400 , "CD" ),
18
- (100 , "C" ),
19
- (90 , "XC" ),
20
- (50 , "L" ),
21
- (40 , "XL" ),
22
- (10 , "X" ),
23
- (9 , "IX" ),
24
- (5 , "V" ),
25
- (4 , "IV" ),
26
- (1 , "I" ),
2
+ (1000000 , "M_" ), (900000 , "C_M_" ), (500000 , "D_" ), (400000 , "C_D_" ),
3
+ (100000 , "C_" ), (90000 , "X_C_" ), (50000 , "L_" ), (40000 , "X_L_" ),
4
+ (10000 , "X_" ), (9000 , "I_X_" ), (5000 , "V_" ), (4000 , "I_V_" ),
5
+ (1000 , "M" ), (900 , "CM" ), (500 , "D" ), (400 , "CD" ),
6
+ (100 , "C" ), (90 , "XC" ), (50 , "L" ), (40 , "XL" ),
7
+ (10 , "X" ), (9 , "IX" ), (5 , "V" ), (4 , "IV" ), (1 , "I" )
27
8
]
28
-
29
-
30
9
def roman_to_int (roman ):
31
10
"""
32
11
Convert a Roman numeral to an integer, supporting Vinculum notation
@@ -43,19 +22,14 @@ def roman_to_int(roman):
43
22
True
44
23
"""
45
24
vals = {roman : arabic for arabic , roman in ROMAN }
46
- # Convert the list of tuples to a dictionary
47
-
48
25
i , total = 0 , 0
49
26
while i < len (roman ):
50
- if i + 1 < len (roman ) and roman [i : i + 2 ] in vals :
51
- total += vals [roman [i : i + 2 ]]
52
- i += 2
53
- else :
54
- total += vals [roman [i ]]
55
- i += 1
56
- return total
57
-
58
-
27
+ if i + 1 < len (roman ) and roman [i + 1 ] == "_" :
28
+ total += vals [roman [i ] + "_" ]
29
+ i += 2
30
+ else :
31
+ total += vals [roman [i ]]
32
+ i += 1
59
33
def int_to_roman (number ):
60
34
"""
61
35
Convert an integer to a Roman numeral, supporting Vinculum notation
@@ -68,7 +42,7 @@ def int_to_roman(number):
68
42
>>> all(int_to_roman(value) == key for key, value in tests.items())
69
43
True
70
44
"""
71
- if not isinstance (number , int ) or number < 1 :
45
+ if not isinstance (number , int ) or number <= 0 :
72
46
raise ValueError ("Input must be a positive integer greater than 0" )
73
47
74
48
result = []
@@ -78,9 +52,7 @@ def int_to_roman(number):
78
52
if number == 0 :
79
53
break
80
54
return "" .join (result )
81
-
82
-
55
+
83
56
if __name__ == "__main__" :
84
57
import doctest
85
-
86
58
doctest .testmod ()
0 commit comments