fork download
  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 = 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 = 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 = 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 = 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 = 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 = 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(raw_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.  
Runtime error #stdin #stdout #stderr 0.01s 8976KB
stdin
Standard input is empty
stdout
Enter the Integer: 
stderr
Traceback (most recent call last):
  File "prog.py", line 171, in <module>
  File "prog.py", line 155, in main
EOFError: EOF when reading a line