666/malbolge/trinario.py
2013-03-20 19:08:06 +01:00

161 lines
4.1 KiB
Python

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)