ffb836b975
* Aggiunte docstrings * Correzioni PEP 8 * Aggiunta lista trinaria * Migliorata struttura e leggibilitĂ del codice
217 lines
5.2 KiB
Python
217 lines
5.2 KiB
Python
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)
|