2015-08-28 3 views
0

Je veux être en mesure d'avoir une classe en Python qui stocke trois valeurs. Une valeur, une valeur min et une valeur max. Le but avec ceci est d'avoir une méthode appelée addVal() qui prend un nombre et l'ajoute à la valeur actuelle, la capture est si le nombre plus la valeur que nous déplaçons notre valeur actuelle par est plus grand que notre maximum stocké, il s'enroule autour de le min et continue.Conserver n'importe quel nombre dans les limites

Ceci est la classe que j'ai jusqu'à présent:

class Num: 
    def __init__(self, min = 0, max = 26, val = 0): 
     self.min = min 
     self.max = max 
     self.val = val 

    def setMin(self, min): 
     self.min = min 

    def setMax(self, max): 
     self.max = max 

    def addVal(self, num): 
     if num+self.val > self.max: 
      # Only works with values when num%max + val is greater than max 
      self.val = min + (num%val - (max-(num%val))) 
     else: 
      self.val += num 

Par exemple:

num = Num(0, 65, 60) # num = Num(min, max, val) 
num.val # returns 60 
num.addVal(15) 
num.val # returns 10 (because we can use 5 of the 15 before going over the max and having a remaining ten to add to the min) 
num.addVal(20) 
num.val # returns 30 
num.addVal(265) 
num.val # # returns 35 

Tout cela doit travailler avec des valeurs négatives aussi de toute size..I ne peut pas comprendre un élégant solution pour cela ..

Je voudrais obtenir un one-liner qui fonctionne avec n'importe quelle valeur, mais je ne peux pas comprendre la combinaison tout à fait juste pour le faire fonctionner avec n'importe quelle valeur.Certainly je peux brute forc e pour faire des calculs de base sur les opérations de module et l'amener à travailler avec une certaine structure logique dans les différents cas qui peuvent survenir mais j'aimerais trouver une solution élégante extrêmement simple qui fonctionne aveuglément avec n'importe quelle valeur.

Voici ma classe actuelle:

Répondre

2

Votre numéro de bouclage peut être calculé en supprimant un décalage de min de la valeur et de faire ensuite l'addition mod (max - min) avant d'ajouter le décalage de retour à nouveau. Voici le code qui devrait fonctionner pour toutes les valeurs de num, val et min et max (tant que min < max):

def addVal(self, num): 
    self.val = self.min + (self.val + num - self.min) % (self.max - self.min) 
+0

Et diable, si vous voulez élégant - pourquoi ne pas simplement passer outre '__iadd__'? 'my_num = Num (min = 0, max = 26, val = 3); my_num + = 25; my_num == 2 # True' –