fork download
  1. #! user/bin/env python
  2. # -*- encoding: utf-8 -*-
  3.  
  4. numeracion = {"I": 1, "IV": 4, "V": 5, "X": 10, "XL": 40, "L": 50, "XC": 90, "C": 100, "CD": 400, "D": 500, "CM": 900}
  5. unidades = ["I", "IV", "V", "IX"]
  6. decenas = ["X", "XL", "L", "XC"]
  7. centenas = ["C", "CD", "D", "CM"]
  8.  
  9.  
  10. class numero_a_Romano(object):
  11. def __init__(self, num=0):
  12. self.num = num
  13. self.out = None
  14. if num > 0:
  15. self.setNum(num)
  16. else:
  17. self.num = 0
  18.  
  19. def __str__(self):
  20. return self.out
  21.  
  22. def __add__(self, other):
  23. return numero_a_Romano(self.num + other.num)
  24.  
  25. def __sub__(self, other):
  26. return numero_a_Romano(self.num - other.num)
  27.  
  28. def transform(self, num, out):
  29. if num == 9:
  30. self.out = "{0}{1}".format(self.out, out[3])
  31. num = 0
  32. elif num >= 5:
  33. self.out = "{0}{1}".format(self.out, out[2])
  34. num -= 5
  35. elif num == 4:
  36. self.out = "{0}{1}".format(self.out, out[1])
  37. num = 0
  38. if num > 0:
  39. self.out = "{0}{1}".format(self.out, out[0] * num)
  40.  
  41. def conversor(self):
  42. aux = 1
  43. digitos = -1
  44.  
  45. while aux <= self.num:
  46. digitos += 1
  47. aux *= 10
  48.  
  49. if digitos < 3:
  50. num = self.num
  51. for i in range(0, digitos + 1):
  52. posN = 10 ** (digitos - i)
  53. aux = int(num / posN)
  54. if posN == 1:
  55. self.transform(aux, unidades)
  56. elif posN == 10:
  57. self.transform(aux, decenas)
  58. elif posN == 100:
  59. self.transform(aux, centenas)
  60. num %= posN
  61. else:
  62. self.out = None
  63.  
  64. def setNum(self, num):
  65. self.num = num
  66. self.out = ""
  67. self.conversor()
  68.  
  69. def getNum(self):
  70. return self.out
  71.  
  72.  
  73. class romano_a_numero(object):
  74. def __init__(self, num=""):
  75. self.num = num.upper()
  76. self.out = 0
  77.  
  78. if(self.num != ""):
  79. self.conversor()
  80.  
  81. def __str__(self):
  82. return str(self.out)
  83.  
  84. def busqueda(self, key):
  85. try:
  86. r = numeracion[key]
  87. return r > 0
  88. except KeyError:
  89. return False
  90.  
  91. def conversor(self):
  92. aux = self.num
  93. l = len(aux)-1
  94. i = 0
  95.  
  96. while i < l:
  97. key = "{0}{1}".format(aux[i], aux[i+1])
  98. if self.busqueda(key):
  99. self.out += numeracion[key]
  100. i += 1
  101. else:
  102. self.out += numeracion[aux[i]]
  103. i += 1
  104. self.out += numeracion[aux[i]]
  105.  
  106.  
  107.  
  108.  
  109. r = numero_a_Romano(943)
  110. r2 = romano_a_numero(r.getNum())
  111.  
  112. print(r)
  113. print(r2)
Success #stdin #stdout 0.02s 6836KB
stdin
Standard input is empty
stdout
CMXLIII
943