Решение задачи #19. Python Яндекс CodeRun, Значение логического выражения

Опубликовано: 11.12.2024, 07:54 | Автор: hdhAI

Вариант решения задачи на языке программирования Python с Яндекс CodeRun.
Категория: Алгоритмы.
Название задачи: Значение логического выражения.
Сложность: Средняя.
Статус решения: "Решено".

Условие задачи:
Задано логическое выражение. Необходимо вычислить его значение. В выражении могут встречаться знаки ! (отрицание), & (логическое «и»), | (логическое «или»), ^ (XOR — «исключающее ИЛИ», «ровно одно из двух — истина») и скобки. Самый высокий приоритет у отрицания, меньше — у &, операции | и ^ имеют самый низкий приоритет (одинаковый) и вычисляются слева направо. Все числа в выражении либо 0, либо 1.

Решение:


Python

import sys

def evaluate_expression(expression):
    """
    Функция для вычисления логического выражения, используя стандартные правила приоритета.
    """
    def parse_not(expr):
        # Обработка отрицания (!)
        while '!' in expr:
            idx = expr.rfind('!')
            value = int(expr[idx + 1])
            expr = expr[:idx] + str(1 - value) + expr[idx + 2:]
        return expr

    def parse_and(expr):
        # Обработка логического "и" (&)
        while '&' in expr:
            idx = expr.find('&')
            left = int(expr[idx - 1])
            right = int(expr[idx + 1])
            expr = expr[:idx - 1] + str(left & right) + expr[idx + 2:]
        return expr

    def parse_or_xor(expr):
        # Обработка логического "или" (|) и XOR (^)
        i = 0
        while i < len(expr):
            if expr[i] in "|^":
                left = int(expr[i - 1])
                right = int(expr[i + 1])
                if expr[i] == '|':
                    result = left | right
                else:  # expr[i] == '^'
                    result = left ^ right
                expr = expr[:i - 1] + str(result) + expr[i + 2:]
                i = 0  # Сброс индекса после изменения строки
            else:
                i += 1
        return expr

    # Убираем пробелы и обрабатываем выражение в порядке приоритета
    expression = expression.replace(" ", "")

    # Обработка скобок
    while '(' in expression:
        start = expression.rfind('(')
        end = expression.find(')', start)
        sub_expr = expression[start + 1:end]
        result = evaluate_expression(sub_expr)
        expression = expression[:start] + result + expression[end + 1:]

    # Обработка операторов в порядке приоритета
    expression = parse_not(expression)
    expression = parse_and(expression)
    expression = parse_or_xor(expression)

    return expression

def main():
    """
    Для чтения входных данных необходимо получить их
    из стандартного потока ввода (sys.stdin).
    """
    input = sys.stdin.read
    expression = input().strip()

    try:
        result = evaluate_expression(expression)
        print(result)
    except Exception:
        print("WRONG")

if __name__ == '__main__':
    main()
	

Объяснение кода


Функция evaluate_expression для вычисления выражения:
Функция принимает логическое выражение в виде строки.
Выражение вычисляется, начиная с самого высокого приоритета операторов (отрицание !) и заканчивая низким (логическое «или» | и XOR ^).
Обработка выражения происходит итеративно, заменяя операторы и числа их результатами.

Обработка отрицания (!):
Находится последний ! в выражении.
Вычисляется его значение (инвертирование числа, 1 - value).
Выражение обновляется, заменяя ! и соответствующее число результатом.

Обработка логического «и» (&):
Для каждой пары операторов & вычисляется значение (left & right).
Результат подставляется обратно в выражение.

Обработка логического «или» (|) и XOR (^):
Эти операторы имеют одинаковый приоритет, поэтому их обработка объединена.
Последовательно находятся операторы и заменяются результатами их вычисления.

Обработка скобок:
Выражение внутри скобок вычисляется отдельно, начиная с наиболее вложенных.
Результат подставляется вместо скобок.

Основная функция main:
Считывает входные данные, удаляет пробелы.
Вызывает функцию вычисления выражения.
Если вычисление успешно, выводится результат (0 или 1). В случае ошибки выводится WRONG.

Источник решения: hdhai.com

Похожие статьи
Интересное





Warning: file_put_contents(/var/www/angella1/data/www/hdhai.com/counter/count.php): Failed to open stream: Permission denied in /var/www/angella1/data/www/hdhai.com/counter.php on line 89