Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
oorrja
GitHub Repository: oorrja/learntosolveit
Path: blob/master/languages/python/algorithm_int_to_roman.py
1240 views
1
# Program which converts the given input integer to roman numeral.
2
# Limitation: Program converts the integer numbers uptil the value of 1000
3
# (Roman Numeral: D)
4
# Problem: P2.1 - Implement a translator from integers to roman numeral based
5
# on the syntax directed translation scheme developed in Exercise 2.9
6
# Chapter 2 - A Simple One-Pass Compiler. Compilers, Principles, Techniques
7
# and Tools.
8
9
10
roman_dict = {1:'I',5:'V',10:'X',50:'L',100:'C',500:'D',1000:'M'}
11
12
def sep_num(n):
13
num = []
14
if n/100:
15
hundreds = (n/100) * 100
16
num.append(hundreds)
17
n = n%100
18
tens = (n/10) * 10
19
if tens:
20
num.append(tens)
21
ones = n%10
22
if ones:
23
num.append(ones)
24
elif n/10:
25
tens = (n/10) * 10
26
num.append(tens)
27
ones = n%10
28
if ones:
29
num.append(ones)
30
else:
31
ones = n
32
num.append(ones)
33
return num
34
35
def get_roman(n):
36
rnos = []
37
if n in roman_dict:
38
rnos.append(n)
39
return rnos
40
else:
41
if 1 < n < 5:
42
base,factor = 1,1
43
rnos.append(base)
44
result = n - base
45
while result > 0:
46
rnos.append(factor)
47
result = result - factor
48
if rnos.count(factor) > 3:
49
for n in rnos[:]:
50
rnos.remove(n)
51
indices = list(roman_dict.keys())
52
indices.sort()
53
prev_base = base
54
base_index = indices.index(base) + 1
55
base = indices[base_index]
56
rnos.append(prev_base)
57
rnos.append(base)
58
return rnos
59
elif 5 < n < 10:
60
base,factor = 5,1
61
rnos.append(base)
62
result = n - base
63
while result > 0:
64
rnos.append(factor)
65
result = result - factor
66
if rnos.count(factor) > 3:
67
for n in rnos[:]:
68
rnos.remove(n)
69
indices = list(roman_dict.keys())
70
indices.sort()
71
prev_base_index = indices.index(base) - 1
72
prev_base = indices[prev_base_index]
73
base_index = indices.index(base) + 1
74
base = indices[base_index]
75
rnos.append(prev_base)
76
rnos.append(base)
77
return rnos
78
elif 10 < n <50:
79
base,factor = 10,10
80
rnos.append(base)
81
result = n - base
82
while result > 0:
83
rnos.append(factor)
84
result = result - factor
85
if rnos.count(factor) > 3:
86
for n in rnos[:]:
87
rnos.remove(n)
88
indices = list(roman_dict.keys())
89
indices.sort()
90
prev_base = base
91
base_index = indices.index(base) + 1
92
base = indices[base_index]
93
rnos.append(prev_base)
94
rnos.append(base)
95
return rnos
96
elif 50 < n < 100:
97
base, factor = 50,10
98
rnos.append(base)
99
result = n - base
100
while result > 0:
101
rnos.append(factor)
102
result = result - factor
103
if rnos.count(factor) > 3:
104
for n in rnos[:]:
105
rnos.remove(n)
106
indices = list(roman_dict.keys())
107
indices.sort()
108
prev_base_index = indices.index(base) - 1
109
prev_base = indices[prev_base_index]
110
base_index = indices.index(base) + 1
111
base = indices[base_index]
112
rnos.append(prev_base)
113
rnos.append(base)
114
return rnos
115
elif 100 < n < 500:
116
base, factor = 100, 100
117
rnos.append(base)
118
result = n - base
119
while result > 0:
120
rnos.append(factor)
121
result = result - factor
122
if rnos.count(factor) > 3:
123
for n in rnos[:]:
124
rnos.remove(n)
125
indices = list(roman_dict.keys())
126
indices.sort()
127
prev_base = base
128
base_index = indices.index(base) + 1
129
base = indices[base_index]
130
rnos.append(prev_base)
131
rnos.append(base)
132
return rnos
133
elif 500 < n < 1000:
134
base, factor = 500, 100
135
rnos.append(base)
136
result = n - base
137
while result > 0:
138
rnos.append(factor)
139
result = result - factor
140
if rnos.count(factor) > 3:
141
for n in rnos[:]:
142
rnos.remove(n)
143
indices = list(roman_dict.keys())
144
indices.sort()
145
prev_base_index = indices.index(base) - 1
146
prev_base = indices[prev_base_index]
147
base_index = indices.index(base) + 1
148
base = indices[base_index]
149
rnos.append(prev_base)
150
rnos.append(base)
151
return rnos
152
153
154
def main():
155
number = int(input("Enter the Integer: "))
156
if number > 1000:
157
print('Sorry, I know uptil 1000 only.')
158
exit()
159
if number in roman_dict:
160
print("Roman: ",roman_dict[number])
161
else:
162
romans = []
163
res = sep_num(number)
164
for each in res:
165
rvalues = get_roman(each)
166
for value in rvalues:
167
romans.append(roman_dict[value])
168
print("Roman: ",''.join(romans))
169
170
if __name__ == '__main__':
171
main()
172
173