Сравнение выражений rpn (postfix) для эквивалентности - PullRequest
0 голосов
/ 02 июля 2018

Как можно сравнить любые два выражения с постфиксными нотами для эквивалентности?

В простейшем примере, foo (a, b) возвращает True для

a = [3, 5, 'MUL']

b = [5, 3, 'MUL']

Как бы foo() выглядело в питоне? Я полагаю, что один из способов - это оценить оба выражения и как-то их нормализовать. Я ожидаю, что это четко определенный процесс, но еще не нашел его.

Редактировать 1:

Это был плохо сформулированный вопрос. Я попытаюсь привести примеры с большим количеством примеров и буду признателен за ваше терпение, поскольку я стараюсь четко и точно задать вопрос.

expr1 = [a, b, 'MUL']

expr2 = [b, a, 'MUL']

OR

expr1 = [a, b, 1, 'ADD', 'MUL']

expr2 = [a, b, 'MUL', a, 'ADD']

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Здесь я попробовал вашу проблему с решением, оно работает, если у вас есть больше вариантов, вы можете добавить:

a = [3, 5, 'MUL']
b = [5, 3, 'MUL']


def postfix_calc(value, z):
    return {
        'MUL': lambda c: a[0]*a[1],
        'ADD': lambda c: a[0]+a[1],
        'SUB': lambda c: a[0]-a[1],
        'DIV': lambda c: a[0]/a[1]
    }.get(value)(z)


def foo(x, y):
    val1 = postfix_calc(x[2], x)
    val2 = postfix_calc(y[2], y)
    if val1 == val2:
        return True
    else:
        return False


print(foo(a,b))
0 голосов
/ 02 июля 2018

Так как у вас уже есть оценка постфикса. тогда у тебя могло бы быть так.

foo(a,b):
    res_a = postfix(a)
    res_b = postfix(b)
    if res_a = res_b:
         return True
    return False

Я думаю, это самое простое решение, которое вы ищете?

...