class Trinario: def __init__(self, valore, converti=False): #Converte da base n a base 3 se necessario if converti: valore = self.__converti(valore) self.valore = valore #Controllo lunghezza massima if self.lunghezza > 10: raise OverflowError("Limite di trit per word superato: massimo 10 (passati %d)" % self.lunghezza) #Conversione di base def __converti(self, decimale): trinario = [] while decimale > 0: trinario += decimale % 3, decimale //= 3 return trinario[::-1] #Vari override degli operatori def __iter__(self): lista = [int(i) for i in self.valore] return iter(lista) def __str__(self): return self.valore def __repr__(self): return self.valore #Assegna entrambi i valori(decimale e trinario) quando almeno uno cambia def __setattr__(self, nome, valore): if nome == "valore": if type(valore) is list: valore = "".join([str(i) for i in valore]) self.__dict__["valore"] = valore elif type(valore) is str: self.__dict__["valore"] = valore elif type(valore) is int: self.__dict__["valore"] = str(valore) self.__dict__["decimale"] = int(self.valore, base=3) self.__dict__["lunghezza"] = len(self.valore) elif nome == "decimale": if type(valore) is int: self.__dict__["valore"] = str(self.decimale) self.__dict__["decimale"] = valore elif type(valore) is list: valore = "".join([str(i) for i in valore]) self.__dict__["valore"] = valore self.__dict__["decimale"] = int(self.valore, base=3) self.__dict__["lunghezza"] = len(self.valore) def __getitem__(self, chiave): return self.valore[chiave] def __add__(self, altro): try: return Trinario(self.decimale + altro.decimale, True) except AttributeError: return Trinario(self.decimale + altro, True) def __iadd__(self, altro): try: return self + altro except AttributeError: return self.decimale + altro def __sub__(self, altro): try: return Trinario(self.decimale - altro.decimale, True) except AttributeError: return Trinario(self.decimale - altro, True) def __isub__(self, altro): return self - altro def __mul__(self, altro): try: return Trinario(self.decimale * altro.decimale, True) except AttributeError: return Trinario(self.decimale * altro, True) def __imul__(self, altro): return self * altro def __mod__(self, altro): try: return Trinario(self.decimale % altro.decimale, True) except AttributeError: return Trinario(self.decimale % altro, True) def __imod__(self, altro): return self % altro def __truediv__(self, floor): try: return Trinario(self.decimale / altro.decimale, True) except AttributeError: return Trinario(self.decimale / altro, True) def __itruediv__(self, altro): return self / altro def __floordiv__(self, altro): try: return Trinario(self.decimale // altro.decimale, True) except AttributeError: return Trinario(self.decimale // altro, True) def __ifloordiv__(self, altro): return self // altro def __lt__(self, altro): try: return self.decimale < altro.decimale except AttributeError: return self.decimale < altro def __le__(self, altro): try: return self.decimale <= altro.decimale except AttributeError: return self.decimale <= altro def __eq__(self, altro): try: return self.decimale == altro.decimale except AttributeError: return self.decimale == altro def __ne__(self, altro): try: return self.decimale != self.altro except AttributeError: return self.decimale != altro def __gt__(self, altro): try: return self.decimale > altro.decimale except AttributeError: return self.decimale > altro def __ge__(self, altro): try: return self.decimale >= altro.decimale except AttributeError: return self.decimale >= altro #Ritorna una word trinaria def trin(valore, converti=False): return Trinario(valore, converti) #Ritorna l'ordinale di un carattere in una word trinaria def trinord(carattere): return trin(ord(carattere), True) #Ritorna il carattere ASCII data una word trinaria def trinchr(trinario): return chr(trinario.decimale % 256)