dmF.py 3.1 KB

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