Информатика: ОГЭ и ЕГЭ

Тренировка ЕГЭ · задание 2 · фрагмент таблицы истинности

Задание 2 ЕГЭ: фрагмент таблицы истинности

Фрагмент таблицы истинности. Тема номера — таблицы истинности. Ниже — пример с ответом и решением; кнопкой под ним можно решить такую же задачу с другими числами, ответ проверится сразу.

Пример

Миша заполнял таблицу истинности логической функции F

(w → y) → (¬z ∨ x ∨ x),

но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.

F
010
10110
110

Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.

В ответе напишите буквы w, x, y, z в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.

Например, функция задана выражением ¬x ∨ y, зависящим от двух переменных, а фрагмент таблицы имеет следующий вид.

F
010

В этом случае первому столбцу соответствует переменная y, а второму столбцу – переменная x. В ответе следует написать: yx.

Ответyxwz

Решение

Сначала выясним, на каких наборах (w, x, y, z) функция равна 0: 0001, 0011, 1011. Каждая строка фрагмента — один из этих наборов, записанный в переставленных столбцах.

Удобно смотреть на столбцы: сколько в столбце нулей и единиц может быть у каждой переменной и в каких строках. Надёжнее перебрать программой все расстановки переменных по столбцам и все способы заполнить пустые клетки; строки фрагмента должны получиться различными.

from itertools import permutations, product

def imp(a, b):
    return (not a) or b

def F(w, x, y, z):
    return imp(imp(w, y), (not z or x) or x)

rows = [(None, None, 0, 1), (1, 0, 1, 1), (1, None, None, 1)]   # None — пустая клетка
answers = []
for order in permutations("wxyz"):
    for fill in product([0, 1], repeat=4):    # в таблице 4 пустых клеток
        it = iter(fill)
        t = [tuple(v if v is not None else next(it) for v in r) for r in rows]
        if len(set(t)) < 3:                           # строки должны быть различными
            continue
        if all(F(**dict(zip(order, r))) == 0 for r in t):
            answers.append("".join(order))
            break
print(*answers)

Подходит единственная расстановка: yxwz.

Решить такую задачу — новый вариант с проверкой

Задание 2 ЕГЭ: другие виды

Все задачи задания 2 вперемешку · разбор: как решать задание 2 · пробные варианты ЕГЭ