dmF.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. """fonctions generiques DMonde"""
  2. def classe(txt):
  3. """retourne une classe a partir d'une string"""
  4. return getattr(sys.modules[__name__], txt)
  5. def mini(e1, e2):
  6. """renvoie le plus petit entier"""
  7. if e1 <= e2:
  8. retour = e1
  9. else:
  10. retour = e2
  11. return retour
  12. def maxi(e1, e2):
  13. """renvoie le plus petit entier"""
  14. if e1 >= e2:
  15. retour = e1
  16. else:
  17. retour = e2
  18. return retour
  19. def contractTxt(txt, nb = 0):
  20. """retourne un texte de longueur limitee,
  21. de la forme 'abcd...xyz'
  22. nb doit etre superieur ou egal a 1"""
  23. if not nb > 0: return txt
  24. if not nb >= 4: return txt[:nb]
  25. if not nb >= 10: return "{}...".format(txt[:(nb-3)])
  26. if len(txt) <= nb: return txt
  27. t1 = txt[:(nb-6)]
  28. t2 = txt[-3:]
  29. return "{}...{}".format(t1, t2)
  30. def inverser(lst):
  31. """retourne la liste inversee"""
  32. return list(reversed(lst))
  33. class DmPile(object):
  34. """pile d'objets ayant des hauteurs differentes
  35. le dernier objet ajoute est dessus (premier)"""
  36. def __init__(self):
  37. self._pile = []
  38. def __getitem__(self, zCible):
  39. """renvoie l'objet a l'altitude z"""
  40. if not zCible >= 0: return None
  41. z = 0
  42. for cpl in inverser(self._pile):
  43. z += cpl[1]
  44. if z > zCible: return cpl[0]
  45. return None
  46. def __repr__(self, *args, **kwargs):
  47. return str(self._pile)
  48. def pile(self):
  49. """retourne la pile d'objets (sans les hauteurs)"""
  50. return [cpl[0] for cpl in self._pile]
  51. def elip(self):
  52. """retourne la pile (sans les hauteurs) a l'envers (en partant du dessous)"""
  53. return inverser([cpl[0] for cpl in self._pile])
  54. def __iter__(self):
  55. return self.pile().__iter__()
  56. def ajouter(self, objet, h = 1):
  57. """ajoute un objet de hauteur h sur la pile"""
  58. self._pile.insert(0, (objet,h))
  59. def vide(self):
  60. return (len(self._pile) == 0)
  61. def premier(self):
  62. if self.vide(): return None
  63. return self.pile()[0]
  64. def retirer(self, objet):
  65. """retire l'objet de la pile"""
  66. if not objet in self.pile():
  67. print "Impossible trouver l'objet dans la pile, impossible de l'en retirer"
  68. return
  69. index = self.pile().index(objet)
  70. cpl = self._pile[index]
  71. self._pile.remove(cpl)
  72. def hauteur(self):
  73. """retourne la hauteur totale de la pile"""
  74. retour = 0
  75. for h in [cpl[1] for cpl in self._pile]:
  76. retour += h
  77. return retour
  78. def hDe(self, obj):
  79. """renvoie la hauteur de l'objet demande, None sinon"""
  80. d = {obj:h for obj, h in self._pile}
  81. if not obj in d: return None
  82. return d[obj]
  83. def zR(self, obj):
  84. """renvoie l'altitude relative de l'objet demande, None sinon"""
  85. z = 0
  86. for o, h in inverser(self._pile):
  87. if o == obj: return z
  88. z += h
  89. return None
  90. # pile = DmPile()
  91. # pile.ajouter("a",10)
  92. # pile.ajouter("b",3)
  93. # pile.ajouter("c",3)
  94. # print pile.zR("b")