From c344dfa36401802ddc5bff30c57ab3b0e8693b1a Mon Sep 17 00:00:00 2001 From: Rnhmjoj Date: Sun, 4 Aug 2013 14:39:19 +0200 Subject: [PATCH] Correzioni varie * Un sacco di errori stupidi sistemati --- malbolge/macchina.py | 28 +++++++++++++++------------- malbolge/trinario.py | 15 ++++++++------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/malbolge/macchina.py b/malbolge/macchina.py index 392545d..a80ab54 100644 --- a/malbolge/macchina.py +++ b/malbolge/macchina.py @@ -9,8 +9,8 @@ class Macchina: self.a = trin(0) #Registri - self.d = trinlist([0 for i in range(3**5)], True) - self.c = trinlist([0 for i in range(3**5)], True) + self.d = trinlist() + self.c = trinlist() #Puntatori self.puntatore_c = trin(0) @@ -30,20 +30,24 @@ class Macchina: #Controllo lunghezza massima if len(programma) > 3**10: raise MemoryError("Memoria esaurita. Limite di 3^10 word superato.") - + #Copia il programma nel registro c for indice, word in enumerate(programma): - if trinord(word) not in range(33,127): - raise SyntaxError("Carattere non consentito nel programma: '%c' a %d." % (word, indice)) if word not in ("\n"," "): - self.c[indice] = trinord(word) + if trinord(word) not in range(32,127): + raise SyntaxError("Carattere non consentito nel programma: '%c' a %d." % (word, indice)) + else: + self.c[indice] = trinord(word) #Esecuzione del programma while self.puntatore_c < len(programma): #Calcola ed esegue l'istruzione istruzione = self.__calcola_istruzione(trinchr(self.c[self.puntatore_c])) - istruzioni[istruzione]() - + try: + istruzioni[istruzione]() + except KeyError: + istruzioni["o"]() + #Operazioni per ogni istruzione self.c[self.puntatore_c] -= 33 self.__traduci() @@ -59,7 +63,7 @@ class Macchina: Uo[D7,XTcA\"lI.v%{gJh4G\-=O@5`_3i< \ ?Z';FNQuY]szf$!BS/|t:Pn6^Ha" istruzione = (trinord(carattere) - 33 + self.puntatore_c) % 94 - return tabella[istruzione] + return tabella[istruzione.decimale] def __traduci(self): """ @@ -69,8 +73,8 @@ class Macchina: trascrizione = str.maketrans( '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN \ OPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~', - '5z]&gqtyfr$(we4{WP)H-Zn,[%\\3dL+Q;>U!pJS7 2FhOA \ - 1CB6v^=I_0/8|jsb9m<.TVac`uY*MK\'X~xDl}REokN:#?G"i@' + '5z]&gqtyfr$(we4{WP)H-Zn,[%\\3dL+Q;>U!pJS72FhOA1 \ + CB6v^=I_0/8|jsb9m<.TVac`uY*MK\'X~xDl}REokN:#?G"i@' ) istruzione = str.translate(trinchr(self.c[self.puntatore_c]), trascrizione) self.c[self.puntatore_c] = trinord(istruzione) @@ -98,7 +102,6 @@ class Macchina: """ self.d[self.puntatore_d] = trin(self.a[-1] + self.a[0:-1]) - def __pazza(self): """ Istruzione Malbolge "p" @@ -126,7 +129,6 @@ class Macchina: else: self.a = trinord(carattere) - def __stampa(self): """ Istruzione Malbolge "/" diff --git a/malbolge/trinario.py b/malbolge/trinario.py index 1e1a53a..5bf5a55 100644 --- a/malbolge/trinario.py +++ b/malbolge/trinario.py @@ -163,23 +163,24 @@ class Trilista: def __init__(self, lista, converti): """Inizializzazione della lista trinaria.""" - for i in lista: - self.valori = [trin(i, converti) for i in lista] + self.valori ={a:trin(b, converti) for a, b in enumerate(lista)} #Vari override degli operatori def __setitem__(self, indice, valore): try: - self.valori[indice.decimale] + self.valori[indice.decimale] = valore except AttributeError: - self.valori[indice] + self.valori[indice] = valore def __getitem__(self, indice): try: return self.valori[indice.decimale] except AttributeError: - return self.valori[indice] - + return self.valori[indice] + except KeyError: + return trin(0) + def __str__(self): return self.valori.__str__() @@ -207,7 +208,7 @@ def trinchr(trinario): """ return chr(trinario.decimale % 256) -def trinlist(lista, converti=False): +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