class Trinario: """Word trinaria""" def __init__(self, valore, converti): #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 ) def __converti(self, decimale): """Restituisce il valore decimale passato in trinario.""" trinario = [] if decimale == 0: return [0] 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 def __setattr__(self, nome, valore): """ Assegna entrambi i valori (decimale e trinario) quando almeno uno cambia. """ 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, indice): return self.valore[indice] #Override degli operatori matematici 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 class Trilista: """Lista per word trinarie""" def __init__(self, lista, converti): """Inizializzazione della lista trinaria.""" for i in lista: self.valori = [trin(i, converti) for i in lista] #Vari override degli operatori def __setitem__(self, indice, valore): try: self.valori[indice.decimale] except AttributeError: self.valori[indice] def __getitem__(self, indice): try: return self.valori[indice.decimale] except AttributeError: return self.valori[indice] def __str__(self): return self.valori.__str__() def __repr__(self): return self.valori #Wrappers def trin(valore, converti=False): """ Restituisce una word trinaria. Fornire converti=True come parametro se il valore รจ decimale. """ return Trinario(valore, converti) def trinord(carattere): """ Restituisce l'ordinale di un carattere in una word trinaria. """ return trin(ord(carattere), True) def trinchr(trinario): """ Restituisce il carattere ASCII data una wordtrinaria. """ return chr(trinario.decimale % 256) def trinlist(lista, converti=False): """ Restituisce una lista accessibile da indici trinari data una lista. Fornire converti=False come parametro solo se gli elementi della lista sono trinari.Non usare liste con basi numeriche miste. """ return Trilista(lista, converti)