Path: blob/master/languages/python/algorithm_int_to_roman.py
1240 views
# Program which converts the given input integer to roman numeral.1# Limitation: Program converts the integer numbers uptil the value of 10002# (Roman Numeral: D)3# Problem: P2.1 - Implement a translator from integers to roman numeral based4# on the syntax directed translation scheme developed in Exercise 2.95# Chapter 2 - A Simple One-Pass Compiler. Compilers, Principles, Techniques6# and Tools.789roman_dict = {1:'I',5:'V',10:'X',50:'L',100:'C',500:'D',1000:'M'}1011def sep_num(n):12num = []13if n/100:14hundreds = (n/100) * 10015num.append(hundreds)16n = n%10017tens = (n/10) * 1018if tens:19num.append(tens)20ones = n%1021if ones:22num.append(ones)23elif n/10:24tens = (n/10) * 1025num.append(tens)26ones = n%1027if ones:28num.append(ones)29else:30ones = n31num.append(ones)32return num3334def get_roman(n):35rnos = []36if n in roman_dict:37rnos.append(n)38return rnos39else:40if 1 < n < 5:41base,factor = 1,142rnos.append(base)43result = n - base44while result > 0:45rnos.append(factor)46result = result - factor47if rnos.count(factor) > 3:48for n in rnos[:]:49rnos.remove(n)50indices = list(roman_dict.keys())51indices.sort()52prev_base = base53base_index = indices.index(base) + 154base = indices[base_index]55rnos.append(prev_base)56rnos.append(base)57return rnos58elif 5 < n < 10:59base,factor = 5,160rnos.append(base)61result = n - base62while result > 0:63rnos.append(factor)64result = result - factor65if rnos.count(factor) > 3:66for n in rnos[:]:67rnos.remove(n)68indices = list(roman_dict.keys())69indices.sort()70prev_base_index = indices.index(base) - 171prev_base = indices[prev_base_index]72base_index = indices.index(base) + 173base = indices[base_index]74rnos.append(prev_base)75rnos.append(base)76return rnos77elif 10 < n <50:78base,factor = 10,1079rnos.append(base)80result = n - base81while result > 0:82rnos.append(factor)83result = result - factor84if rnos.count(factor) > 3:85for n in rnos[:]:86rnos.remove(n)87indices = list(roman_dict.keys())88indices.sort()89prev_base = base90base_index = indices.index(base) + 191base = indices[base_index]92rnos.append(prev_base)93rnos.append(base)94return rnos95elif 50 < n < 100:96base, factor = 50,1097rnos.append(base)98result = n - base99while result > 0:100rnos.append(factor)101result = result - factor102if rnos.count(factor) > 3:103for n in rnos[:]:104rnos.remove(n)105indices = list(roman_dict.keys())106indices.sort()107prev_base_index = indices.index(base) - 1108prev_base = indices[prev_base_index]109base_index = indices.index(base) + 1110base = indices[base_index]111rnos.append(prev_base)112rnos.append(base)113return rnos114elif 100 < n < 500:115base, factor = 100, 100116rnos.append(base)117result = n - base118while result > 0:119rnos.append(factor)120result = result - factor121if rnos.count(factor) > 3:122for n in rnos[:]:123rnos.remove(n)124indices = list(roman_dict.keys())125indices.sort()126prev_base = base127base_index = indices.index(base) + 1128base = indices[base_index]129rnos.append(prev_base)130rnos.append(base)131return rnos132elif 500 < n < 1000:133base, factor = 500, 100134rnos.append(base)135result = n - base136while result > 0:137rnos.append(factor)138result = result - factor139if rnos.count(factor) > 3:140for n in rnos[:]:141rnos.remove(n)142indices = list(roman_dict.keys())143indices.sort()144prev_base_index = indices.index(base) - 1145prev_base = indices[prev_base_index]146base_index = indices.index(base) + 1147base = indices[base_index]148rnos.append(prev_base)149rnos.append(base)150return rnos151152153def main():154number = int(input("Enter the Integer: "))155if number > 1000:156print('Sorry, I know uptil 1000 only.')157exit()158if number in roman_dict:159print("Roman: ",roman_dict[number])160else:161romans = []162res = sep_num(number)163for each in res:164rvalues = get_roman(each)165for value in rvalues:166romans.append(roman_dict[value])167print("Roman: ",''.join(romans))168169if __name__ == '__main__':170main()171172173