from matplotlib.pyplot import *
temps_pause = 0.1 #temps réglable entre chaque étape affichée

#codage des transitions de la forme ab:cde, où a est l'état actuel, b est le symbole actuel, c est le nouvel état, d est le nouvel symbole et e vaut + si on va à droite et - si on va à gauche

def machine(ruban,delta):
    etat = '0'
    pos = 0
    while True:
        print("Etat :", etat, " Ruban :" , ruban)
        print(" "*6, ' ', " "*8 , ' '*pos+'^')
        pause(temps_pause)
        if etat == 'F':
            return
        for transition in delta :
            if (etat , ruban[pos]) == (transition[0] , transition[1]):
                etat = transition[3]
                ruban = ruban[:pos] + transition[4] + ruban[pos+1:]
                if transition[5] == '+':
                    pos+=1
                else:
                    pos-=1
                break
        else:
            print("exécution bloquée")
            return

#ruban initial pour l'exemple
ruban = "IIII_IIIIII" + "_"*24

#table pour la somme
delta_somme = ['0I:0I+' , '0_:1I+' , '1I:1I+' , '1_:2_-' , '2I:F_-']

#test de la somme
machine(ruban, delta_somme)

#tables pour le produit
#solution utilisant 9 états non finaux et 5 symboles
delta_produit = ['0I:1#+', '1I:2I+' , '1_:F_+' , '2I:2I+' , '2_:3_+', '3o:3o+' , '3I:4*+' , '4I:4I+' , '4_:5I-' , '5o:5o-' , '5I:6o+' , '5*:8o-' , '6I:6I+' , '6o:6o+' , '6_:7I-' , '7I:7I-' , '7o:5o-' , '8o:8o-' , '8_:8_-', '8I:8I-' , '8#:0_+' ]

#solution utilisant 9 états non finaux et 3 symboles
delta_produit2 = ['0I:1_+', '1I:2I+' , '1_:F_+' , '2I:2I+' , '2_:3_+', '3o:3o+' , '3I:4o+' , '4I:4I+' , '4_:5I-' , '5o:5o-' , '5I:6o+' , '5_:8_-' , '6I:6I+' , '6o:6o+' , '6_:7I-' , '7I:7I-' , '7o:5o-' , '8I:8I-' , '8_:0_+' ]

#test du produit
machine(ruban, delta_produit2)
















