def imprime(situação): palavra_esq, estado, palavra_dir = situação L = len(palavra_esq) + len(palavra_dir) posição_cabeça = (2*len(palavra_esq))+6 linha_cima = '─┬'*(L+5) + '─' prefixo = '…│❑│❑' posfixo = '│❑│❑│…' linha_baixo = '─┴'*(L+5) + '─' conteúdo = '' for s in (palavra_esq + palavra_dir): if s == 'B': s = '❑' conteúdo += f'│{s}' print(linha_cima) print(f'{prefixo}{conteúdo}{posfixo}') print(linha_baixo) print(f'{" "*posição_cabeça}⬑{estado}') def passo(situação,transição): palavra_esq, estado, palavra_dir = situação # palavra_esq = palavra_esq.lstrip('B') # palavra_dir = palavra_dir.rstrip('B') if not palavra_dir: símbolo = 'B' else: símbolo = palavra_dir[0] novo_símbolo, novo_estado, direção = transição(símbolo,estado) if direção == '←': if palavra_esq: último_esq = palavra_esq[-1] else: último_esq = 'B' return palavra_esq[:-1], novo_estado, (último_esq + novo_símbolo + palavra_dir[1:]) else: return palavra_esq + novo_símbolo, novo_estado, palavra_dir[1:] def executa(palavra_inicial,máquina,passo_a_passo=True): estado_inicial,estados_terminais,transição = máquina situação = ('',estado_inicial,palavra_inicial) if not palavra_inicial: print("TELA AZUL (falta de entrada)") return passos = 0 while True: passos += 1 print(f'{passos}.') imprime(situação) if situação[1] in estados_terminais: print("SUCESSO") return if passo_a_passo: input("Pressione para continuar...") try: situação = passo(situação, transição) except Exception: print("TELA AZUL (não há transição válida)") return #### EXEMPLO dic_ancn = { ('a','procura_fronteira') : ('a','procura_fronteira','→'), ('c','procura_fronteira') : ('c','procura_a_não_marcado','←'), ('X','procura_a_não_marcado') : ('X','procura_a_não_marcado','←'), ('a','procura_a_não_marcado') : ('X','procura_c_não_marcado','→'), ('B','procura_a_não_marcado') : ('B','tudo_X?','→'), ('X','procura_c_não_marcado') : ('X','procura_c_não_marcado','→'), ('c','procura_c_não_marcado') : ('X','procura_a_não_marcado','←'), ('X','tudo_X?') : ('X','tudo_X?','→'), ('B','tudo_X?') : ('B','sucesso','→'), } MT_ancn = ('procura_fronteira',{'sucesso'},(lambda s,e: dic_ancn[(s,e)]))