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 <enter> 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)]))
