fork download
  1. # Solucion examen ALS parcial 1 2018-19
  2.  
  3.  
  4. def rota_izq(s, n):
  5. """Rota una cadena de caracteres a la izquierda.
  6.  
  7. :param s: La cadena a rotar.
  8. :param n: El num. de veces a rotar.
  9. """
  10.  
  11. toret = s
  12.  
  13. n %= len(s)
  14. if n >= 1:
  15. toret = s[n:] + s[:n]
  16.  
  17. return toret
  18.  
  19.  
  20. def calcula_num_rotaciones_izq(s1, s2):
  21. """Calcula n, el num. de rotaciones a la izquierda
  22. necesarias para convertir s1 en s2.
  23.  
  24. :param s1: La cadena de referencia.
  25. :param s2: La cadena resultado de rotar n veces.
  26. :return: n, el num. de rotaciones necesarias.
  27. """
  28.  
  29. toret = -1
  30.  
  31. if (s1 and s2
  32. and len(s1) == len(s2)):
  33. for i in range(len(s1)):
  34. if rota_izq(s1, i) == s2:
  35. toret = i
  36. break
  37.  
  38. return toret
  39.  
  40.  
  41. class Arbol:
  42. """Representa un arbol binario."""
  43.  
  44. def __init__(self, raiz, izqdo, drcho):
  45. self._nodos = [raiz, izqdo, drcho]
  46.  
  47. @property
  48. def raiz(self):
  49. return self._nodos[0]
  50.  
  51. @property
  52. def izqdo(self):
  53. return self._nodos[1]
  54.  
  55. @property
  56. def drcho(self):
  57. return self._nodos[2]
  58.  
  59. def recorrido_anchura(self):
  60. return str(self.raiz) + " " + self._recorrido_anchura()
  61.  
  62. def _recorrido_anchura(self):
  63. izqdo = ""
  64. drcho = ""
  65. izqdo_arbol = ""
  66. drcho_arbol = ""
  67.  
  68. if isinstance(self.izqdo, Arbol):
  69. izqdo = str(self.izqdo.raiz)
  70. izqdo_arbol = self.izqdo._recorrido_anchura()
  71. elif self.izqdo:
  72. izqdo = str(self.izqdo)
  73.  
  74. if isinstance(self.drcho, Arbol):
  75. drcho = str(self.drcho.raiz)
  76. drcho_arbol = self.drcho._recorrido_anchura()
  77. elif self.drcho:
  78. drcho = str(self.drcho)
  79.  
  80. return ((izqdo.strip() if izqdo else "")
  81. + (" " + drcho.strip() if drcho else "")
  82. + (" " + izqdo_arbol.strip() if izqdo_arbol else "")
  83. + (" " + drcho_arbol.strip() if drcho_arbol else ""))
  84.  
  85. def __len__(self):
  86. return max(0, len([x for x in self._nodos if x != None]) - 1)
  87.  
  88. def __getitem__(self, item):
  89. return self._nodos[item]
  90.  
  91. def __str__(self):
  92. return str.format("{}({}, {})", str(self.raiz), str(self.izqdo), str(self.drcho))
  93.  
  94.  
  95. class Movimiento:
  96. """Movimiento financiero."""
  97.  
  98. def __init__(self, concepto, mes, anno, num, precio):
  99. self._concepto = concepto
  100. self._mes = mes
  101. self._anno = anno
  102. self._num = num
  103. self._precio = precio
  104.  
  105. @property
  106. def concepto(self):
  107. return self._concepto
  108.  
  109. @property
  110. def mes(self):
  111. return self._mes
  112.  
  113. @property
  114. def anno(self):
  115. return self._anno
  116.  
  117. @property
  118. def num(self):
  119. return self._num
  120.  
  121. @property
  122. def precio(self):
  123. return self._precio
  124.  
  125. @property
  126. def resultado(self):
  127. return self.num * self.precio
  128.  
  129. def __str__(self):
  130. return str.format("{:4d}/{:02d} {:15s} {:6d} x {:6d} = {:10d}",
  131. self.anno,
  132. self.mes,
  133. self.concepto,
  134. self.num,
  135. self.precio,
  136. self.resultado)
  137.  
  138.  
  139. class Publicidad(Movimiento):
  140. def __init__(self, concepto, anno, mes, num, precio):
  141. super().__init__(concepto, anno, mes, num, precio)
  142.  
  143. @property
  144. def resultado(self):
  145. return super().resultado * -1;
  146.  
  147. def __str__(self):
  148. return super().__str__()
  149.  
  150.  
  151. class Venta(Movimiento):
  152. def __init__(self, concepto, anno, mes, num, precio):
  153. super().__init__(concepto, anno, mes, num, precio)
  154.  
  155. def __str__(self):
  156. return super().__str__()
  157.  
  158.  
  159. class Contenedor:
  160. """ Contiene una lista de elementos asociados a un nombre. """
  161.  
  162. def __init__(self, nombre, elementos):
  163. self._nombre = nombre
  164. self._elementos = elementos
  165.  
  166. @property
  167. def nombre(self):
  168. return self._nombre
  169.  
  170. @property
  171. def elementos(self):
  172. return list(self._elementos)
  173.  
  174. def __str__(self):
  175. return ("-- " + self.nombre
  176. + "\n\t"
  177. + str.join("\n\t",
  178. [str(x) for x in self._elementos]))
  179.  
  180.  
  181. class Empresa(Contenedor):
  182. """ Una empresa contiene su nombre y varios movimientos. """
  183.  
  184. def __init__(self, nombre, lista_movimientos):
  185. super().__init__(nombre, lista_movimientos)
  186.  
  187.  
  188. class SeleccionEmpresas(Contenedor):
  189. """Las empresas seleccionadas se guardan con un concepto. """
  190.  
  191. def __init__(self, nombre, lista_empresas):
  192. super().__init__(nombre, lista_empresas)
  193.  
  194.  
  195. def prueba_ejercicio1():
  196. """Pruebas sobre las rotaciones de cadenas. """
  197.  
  198. print("Rotaciones: abc/cab:", calcula_num_rotaciones_izq("abc", "cab"), "=? 2")
  199. print("Rotaciones: abc/abc:", calcula_num_rotaciones_izq("abc", "abc"), "=? 0")
  200. print("Rotaciones: abc/bca:", calcula_num_rotaciones_izq("abc", "bca"), "=? 1")
  201. print("Rotaciones: abc/cca:", calcula_num_rotaciones_izq("abc", "cca"), "=? -1")
  202.  
  203.  
  204. def prueba_ejercicio2():
  205. """ Pruebas sobre la clase Arbol. """
  206.  
  207. a1 = Arbol('a', Arbol('b', 'c', 'd'), 'e')
  208.  
  209. print("Arbol('a', Arbol('b', 'c', 'd'), 'e'): ", a1, "=? a(b(c, d), e)")
  210. print("a1[0] == a1.raiz == a =?", a1[0], "=?", a1.raiz)
  211. print("a1[1].raiz == a1.izqdo.raiz == b =?", a1[1].raiz, "=?", a1.izqdo.raiz)
  212. print("a1[2] == a1.drcho == e =?", a1[2], "=?", a1.drcho)
  213. print("len(a1) == ", len(a1), "=?", 2)
  214. print("len(a1.izqdo) == ", len(a1.izqdo), "=?", 2)
  215. print("a1.recorrido_anchura == ", a1.recorrido_anchura(), "=?", "a b e c d")
  216.  
  217.  
  218. def prueba_ejercicio3():
  219. """ Pruebas sobre la selección de movimientos de empresas. """
  220.  
  221. selempresas = SeleccionEmpresas("tech", [
  222. Empresa("Microsoft", [
  223. Publicidad("tv", 2019, 1, 5, 1500),
  224. Venta("windows", 2019, 1, 50, 500)]),
  225. Empresa("Google", [
  226. Publicidad("tv", 2019, 1, 15000, 1),
  227. Venta("chromecast", 2019, 1, 50, 30)])]);
  228. print("\n")
  229. print(selempresas)
  230. print("\n=?\n")
  231. print("""-- tech
  232. -- Microsoft
  233. 1/2019 tv 5 x 1500 = -7500
  234. 1/2019 windows 50 x 500 = 25000
  235. -- Google
  236. 1/2019 tv 15000 x 1 = -15000
  237. 1/2019 chromecast 50 x 30 = 1500""")
  238.  
  239.  
  240. if __name__ == "__main__":
  241. prueba_ejercicio1()
  242. prueba_ejercicio2()
  243. prueba_ejercicio3()
  244.  
Success #stdin #stdout 0.01s 27656KB
stdin
Standard input is empty
stdout
Rotaciones: abc/cab: 2 =? 2
Rotaciones: abc/abc: 0 =? 0
Rotaciones: abc/bca: 1 =? 1
Rotaciones: abc/cca: -1 =? -1
Arbol('a', Arbol('b', 'c', 'd'), 'e'):  a(b(c, d), e) =? a(b(c, d), e)
a1[0] == a1.raiz == a =? a =? a
a1[1].raiz == a1.izqdo.raiz == b =? b =? b
a1[2] == a1.drcho == e =? e =? e
len(a1) ==  2 =? 2
len(a1.izqdo) ==  2 =? 2
a1.recorrido_anchura ==  a b e c d =? a b e c d


-- tech
	-- Microsoft
	   1/2019 tv                   5 x   1500 =      -7500
	   1/2019 windows             50 x    500 =      25000
	-- Google
	   1/2019 tv               15000 x      1 =     -15000
	   1/2019 chromecast          50 x     30 =       1500

=?

-- tech
        -- Microsoft
           1/2019 tv                   5 x   1500 =      -7500
           1/2019 windows             50 x    500 =      25000
        -- Google
           1/2019 tv               15000 x      1 =     -15000
           1/2019 chromecast          50 x     30 =       1500