Ejemplo n.º 1
0
 def definir_pontos(entrada):
     pontos_cartesianos = []
     for j in range(len(entrada)):
         if j % 2 != 0:
             continue
         valores = retorna_valores_das_tuplas(entrada, j)
         pontos_cartesianos.append(PontosEm2D(float(valores[0]),float(valores[1])))
     return pontos_cartesianos
 def realizar_operacao_item_sem_prioridade_antes(operacoes,
                                                 entrada,
                                                 pontos_cartesianos,
                                                 k,
                                                 identidade=PontosEm2D()):
     resultado = operacoes[entrada[k]](pontos_cartesianos[(k - 1) // 2],
                                       pontos_cartesianos[(k + 1) // 2])
     pontos_cartesianos[(k - 1) // 2] = resultado
     return operacoes[entrada[k]](resultado, identidade)
    def operar_nos_pontos(pontos_cartesianos, entrada, operacoes):
        ocorrencias_tipo_a = lambda lst: (i for i, e in enumerate(lst)
                                          if e in ['*', '/', '//'])
        lista_de_ocorrencias_tipo_a = list(ocorrencias_tipo_a(entrada))
        ocorrencias_tipo_b = lambda lst: (i for i, e in enumerate(lst)
                                          if e in ['+', '-'])
        lista_de_ocorrencias_tipo_b = list(ocorrencias_tipo_b(entrada))
        ocorrencias_tipo_c = lambda lst: (i for i, e in enumerate(lst)
                                          if e in ['==', 'sobre'])
        lista_de_ocorrencias_tipo_c = list(ocorrencias_tipo_c(entrada))

        assert not (any([
            k < i for i in lista_de_ocorrencias_tipo_a
            for k in lista_de_ocorrencias_tipo_b
        ]) and len(lista_de_ocorrencias_tipo_a) > 0)
        pos_op = lista_de_ocorrencias_tipo_a + lista_de_ocorrencias_tipo_b + lista_de_ocorrencias_tipo_c
        assert len(pos_op) > 0

        for k in pos_op:
            if k in lista_de_ocorrencias_tipo_a and any(
                [i > k for i in lista_de_ocorrencias_tipo_b]):
                resultado = realizar_operacao_item_sem_prioridade_depois(
                    operacoes, entrada, pontos_cartesianos, k,
                    PontosEm2D(1, 1))

            elif k in lista_de_ocorrencias_tipo_a:
                resultado = realizar_operacao_item_sem_prioridade_antes(
                    operacoes, entrada, pontos_cartesianos, k,
                    PontosEm2D(1, 1))

            elif k in lista_de_ocorrencias_tipo_b:
                resultado = realizar_operacao_item_sem_prioridade_depois(
                    operacoes, entrada, pontos_cartesianos, k)

            else:
                if entrada[k] == 'sobre':
                    identidade = pontos_cartesianos[(k - 1) // 2]
                    print(operacoes[entrada[k]](identidade))
                elif entrada[k] == '==':
                    print(operacoes[entrada[k]](
                        pontos_cartesianos[(k - 1) // 2],
                        pontos_cartesianos[(k + 1) // 2]))
        print(resultado)