
Построение таблиц истинности логических выражений
Штана Альберт Игоревич
В этой статье будет разобрано задание 2.
Рассмотрим типовые задачи из второго задания ЕГЭ по информатике.
Данное задание относится к базовому уровню сложности.
Время выполнения задания ≈ 3 минуты.
Во втором задании ЕГЭ по информатике у нас обычно есть логическая функция, которая зависит от логических переменных. Логические переменные могут принимать только два значения: 0 (Ложь) или 1 (Истина).Сначала разберём, как решать второе задание из ЕГЭ по информатике вручную.
Данная задача относится к алгебре логике(ссылка ниже если подзабыли основные выражения и законы):
Ссылка на статью: Алгебра логики.
Логическая функция F задаётся выражением z ∧ ¬y ∧ (w → x). Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F. Определите, какому столбцу таблицы истинности соответствует каждая из переменных x, y, z, w.

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

Тогда первому столбцу соответствует переменная y, а второму столбцу соответствует переменная x. В ответе нужно написать: yx.
z ∧ ¬y ∧ (w → x) = 1 (для каждой строки таблицы F = 1). Операция "Логическое И (∧)" даёт 1 только в одном случае: 1 И 1 = 1.
Отсюда становится понятно, что переменная z должна всегда быть равна 1 (единице). Это первый столбец. Отрицание w тоже должно быть 1 (единицей), тогда просто x всегда будет 0 (нулём). Это второй столбец.
Осталось определить положение w и x. Здесь делаем предположение, что в третьем столбце стоит w, а в 4-ом x. Проверяем построчно и видим, что во второй строчке при таком расположении из 1 следует 0, что в итоге приводит выражение (w → x) в 0, а у нас это выражение всегда должно быть 1 (единицей). Значит, мы предположение сделали неверное, и получается x - это третий столбец, а w - четвёртый.
Ответ: zyxw
Логическая функция F задаётся выражением (x ∧ ¬y) ∨ (y ≡ z) ∨ w.
Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F. Определите, какому столбцу таблицы истинности соответствует каждая из переменных x, y, z, w.

В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы (сначала — буква, соответствующая первому столбцу; затем — буква, соответствующая второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Пример такой же как и в задаче выше.
Определяем главную логическую операцию ("главную скрипку"), которая соединяет разные выражения. Видим, что это логическое сложение.
Во всех строчках таблицы функция принимает значение 0 (ноль). Значит, и каждое выражение должно принимать значение 0 (ноль).
(x ∧ ¬y) ∨ (y ≡ z) ∨ w = 0 (для каждой строки таблицы F = 0). Операция "Логическое ИЛИ (∨)" даёт 0 только в одном случае: 0 ИЛИ 0 = 0.
Самым слабым звеном является переменная w, потому что она стоит одна. Переменная w должна равняться всегда 0(нулю) - этому условию может удовлетворить только третий столбец. Значит w стоит на третьем месте.
Следующим слабым звеном является равносильность. Она должна "выдавать" 0 (ноль). Равносильность "выдаёт" 0 (ноль), когда переменные разные!
Проанализируем первый и второй столбец. В третьей строчке, и там, и там, стоит 1 (единица). Значит, первый и второй столбец не могут быть одновременно y и z (или z и y).
Рассмотрим второй и четвёртый столбец. Вторая строчка содержит одинаковое значение 0 (ноль), и там, и там. Значит, второй и четвёртый столбец не могут быть одновременно y и z (или z и y).
Таким образом, y и z (или z и y) будут столбцы первый и четвёртый! И теперь можно расставить недостающие значения в этих столбцах. Расставляем, чтобы были разные значения, а второй столбец получается x.

Осталось разобраться с z и y. Обратимся к первому выражению (x ∧ ¬y) и посмотрим на третью строчку. Если в четвёртом столбце будет стоять y, то отрицание на y превратит ноль(ноль) в 1(единицу) в четвёртой строчке. Тогда окажется, что у x - 1 и ¬y - 1, и выражение (x ∧ ¬y) тоже получится 1(единицей). А у нас каждое выражение должно равняться 0(нулю). Получается y будет стоять в первом столбце, а z в четвёртом. Тогда ответ будет равен yxwz.
Ответ: yxwz
Логическая функция F задаётся выражением ((x → y) ∧ (y → w)) ∨ (z ≡ (x ∨ y)).
Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F. Определите, какому столбцу таблицы истинности соответствует каждая из переменных x, y, z, w.

В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы (сначала — буква, соответствующая первому столбцу; затем — буква, соответствующая второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно. Пример такой же как в задаче 1.
Последней операцией в функции является логическое сложение, потому что соединяет два выражения ((x → y) ∧ (y → w)) и (z ≡ (x ∨ y)). Тогда каждое выражение должно равняться 0(нулю). ((x → y) ∧ (y → w)) = 0. (z ≡ (x ∨ y)) = 0. Только так функция вернёт 0 после последней операции дизъюнкции.
У нас всего 4 переменных. Выпишем все комбинации для 4-х переменных. Таблица будет точно такая же, как мы писали в первом задании (её очень легко составить). Всего получается 16 комбинаций (16 = 2 в чётвёртой степени).
Теперь отметим зелёным плюсом те строчки, которые обращают выражение ((x → y) ∧ (y → w)) в 0(ноль). Следующий шаг: отметим галочкой те строчки в которых будет ноль для второго выражения (z ≡ (x ∨ y)) (ищем среди тех, которые уже отмечены плюсом).

У нас получается 4 строчки, которые удовлетворяют нашей функции:

Отсюда видно, что переменная z может быть равна только 0(нулю)! Значит, она занимает третий столбец, потому что в остальных столбцах есть хотя бы одна 1(единица).
Переменная w имеет только одну 1(единицу). Значит, её ставим во второй столбец, потому что в первом и четвёртом уже по 2 единицы минимум, а третий уже занят z.
Теперь находим строчку c 1(единицей) в переменной w (Таблица данная в условии задачи) Кто в этой строчке будет иметь единицу (кроме w) - будет x! Это четвёртый столбец! Значит, x - это четвёртый столбец. Переменной y - достаётся первый столбец
Ответ: ywzx
Будем перебирать для каждой логической переменной все возможные варианты в программе. А логическая переменная всего два значения может принимать: 1 или 0 (истину или ложь). Таким образом, если к примеру у нас 4 переменные, мы получим 24=16 различных комбинаций.
Нам нужно будет запрограммировать логическую функцию на языке Питон. Вот таблица, которая поможет это сделать.
Логическая операция в Python:
not() # Отрицание ¬
and # Логическое умножение ∧
or # Логическое сложение ∨
not(A) or B # A <= B # Следование A ⟶ B
== # Равносильность ≡
Перейдём к практике решения задач задания 2 с помощью языка программирования Python.
Миша заполнял таблицу истинности логической функции F (w → z) ∧ ((y → x) ≡ (z → y)), но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.

Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z. В ответе напишите буквы w, x, y, z в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Решать задачу будем с помощью шаблона на языке Python.
print('x y z w')
for x in range(0, 2):
for y in range(0, 2):
for w in range(0, 2):
for z in range(0, 2):
if (not(w) or z) and ((not(y) or x) == (not(z) or y)):
print(x, y, z, w)
В задаче у нас 4 переменные, значит, формируем 4 вложенных цикла. В каждом цикле перебираем все возможные значения для конкретной переменной. Мы перебираем значения 0 и 1.
Функция должна выдавать всегда 1 (единицу, истину). Внутри всех циклов прописываем условие, которое срабатывает как раз на истину. В этом условии прописываем нашу функцию. Если наша функция будет выдавать истину, то мы распечатаем значения переменных, при которых это произошло. Если функция будет выдавать ложь, значит, ничего распечатано не будет.
Четыре вложенных цикла проверяют все возможные варианты (24 = 16 вариантов), и мы получим таблицу истинности, почти такую же, как нам и дали в условии задачи.
Так же вверху печатаем названия переменных, чтобы знать, какие значения каким переменным принадлежат.
Запустим программу, и на экране распечатается табличка:
x y z w
0 0 0 0
1 0 0 0
1 1 0 0
1 1 1 0
1 1 1 1
В получившийся табличке может быть больше строчек, чем в условии. Так же при поиске переменных нельзя опираться на порядок, в котором идут нули и единицы в нашей табличке. А можно опираться лишь на количество нулей и единиц в строчках или столбцах.
Можно вычеркнуть первую строчку и последнюю, потому что в таблице, которую дали в условии, в каждой строчке есть хотя бы один ноль и хотя бы одна единица.

Сразу видно, что первый столбец принадлежит переменной x, только там могут быть все единицы.
Второй столбец принадлежит переменной w, только там могут быть все нули.
У нас остались две пустые клеточки в самой таблице. Нам нужно где-то поставить единицу, а где-то ноль, потому что у нас остались столбцы с двумя единицами и одним нулём, а так же с двумя нулями и одной единицей. Если мы в третий столбец поставим единицу, а в четвёртый ноль, то первая строчка и вторая будут совпадать.
А в условии сказано, что строки не должны повторяться. Поэтому нужно ноль и единицу расставить наоборот.
Получается, что в третий столбец идёт z, а в четвёртый y
Ответ: xwzy
Миша заполнял таблицу истинности функции (x ≡ ¬y) → ((x ∧ w) ≡ z), но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.

Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
В ответе напишите буквы w, x, y, z в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Воспользуемся программой на языке Python.
print('x y z w')
for x in range(0, 2):
for y in range(0, 2):
for w in range(0, 2):
for z in range(0, 2):
if not( not(( x == (not(y)) )) or ((x and w) == z) ):
print(x, y, z, w)
От прошлой программы эта программа отличается только функцией!
В таблице видим, что функция должна выдавать ноль. Поэтому в условии мы функцию "оборачиваем" в not().
После == операцию not() мы заключили в скобки, чтобы не было синтаксической ошибки.
Получаем следующую таблицу истинности:
x y z w
0 1 1 0
0 1 1 1
1 0 1 0
1 0 0 1
Разгадаем, где какая переменная находится.

Последнюю строку из нашей таблицы можно вычеркнуть, потому что, если мы вычеркнем другую строку, то не получится столбца, где все три единицы, а он должен быть.
Получается, что второй столбец достаётся переменной z.
В первом столбце должно быть две единицы. На эту роль подходит переменная y.
В нашей таблице нет строчки, где все единицы, значит, во второй строчке в пустом окошке выставляем ноль. И в этой строчке нулём обладает переменная x. Следовательно, в третьем столбце будет находится x.
А в последний столбец идёт переменная w по остаточному принципу.
Ответ: yzxw
Логическая функция F задаётся выражением ((x → y) ∧ (y → w)) ∨ (z ≡ (x ∨ y)). Дан частично заполненный фрагмент, содержащий неповторяющиеся строки таблицы истинности функции F. Определите, какому столбцу таблицы истинности соответствует каждая из переменных x, y, z, w.

В ответе напишите буквы x, y, z, w в том порядке, в котором идут соответствующие им столбцы (сначала — буква, соответствующая первому столбцу; затем — буква, соответствующая второму столбцу, и т. д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Запрограммируем функцию на языке Python.
print('x y z w')
for x in range(0, 2):
for y in range(0, 2):
for w in range(0, 2):
for z in range(0, 2):
if not( ((not(x) or y) and (not(y) or w)) or (z == (x or y)) ):
print(x, y, z, w)
Запустим программу и расставим переменные по своим местам:
x y z w
0 1 0 0
1 0 0 0
1 0 0 1
1 1 0 0

Переменная z может быть только в третьем столбце.
Во второй столбец идёт переменная w, только этот столбец может иметь одну единицу.
Посмотрим на строчку, где у w стоит единица. В этой же строчке и у x единица. Значит, x идёт в последний столбец, а y в первый столбец.
Ответ: ywzx
Логическая функция F задаётся выражением (¬x ∧ z) ∨ (¬x ∧ ¬y ∧ ¬z)

На рисунке приведён фрагмент таблицы истинности функции F, содержащий все наборы аргументов, при которых функция F истинна. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z.
Для трёх переменных шаблон на Python:
print('x y z')
for x in range(0, 2):
for y in range(0, 2):
for z in range(0, 2):
if (not(x) and z) or (not(x) and not(y) and not(z)):
print(x, y, z)
Здесь и так понятно, куда какая переменная идёт.
x y z
0 0 0
0 0 1
1 0 1

Ответ: yxz
Логическая функция F задаётся выражением (¬a ∨ b ∨ ¬c) ∧ (b ∨ ¬c). Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных a, b, c.
В ответе напишите буквы a, b, c в том порядке, в котором идут соответствующие им столбцы (без разделителей).
Когда такая ситуация, что функция имеет различные значения в таблице, мы можем проверить, какие значения переменных дают единицу у всей функции. А потом проверить, какие значения выдают ноль у всей функции, если это потребуется.
print('a b c')
for a in range(0, 2):
for b in range(0, 2):
for c in range(0, 2):
if (not(a) or b or not(c)) and (b or not(c)):
print(a, b, c)
a b c
0 0 0
0 1 0
0 1 1
1 0 0
1 1 0
1 1 1

В таблице 6 строчек, в которых главная функция превращается в единицу. Далее эти строчки и будем рассматривать. У нас тоже получилось 6 строчек.
Переменная a имеет три единицы. Это второй столбец, потому что там три единицы.
Переменная b имеет четыре единицы, значит, она расположена в первом столбце.
Переменной c достаётся последний столбец.
Ответ: bac
Логическая функция F задаётся выражением a ≡ b ∨ b → c.

На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки. Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных a, b, c.
Подвох заключается в том, что если мы переведём бездумно функцию на язык Python, то получится a == b or not(b) or c. Но у нас существуют приоритеты для логических операций.
В начале должно обрабатываться или, которое было изначально. Затем должно обработаться следование, а потом равносильность. А если мы переведём формулу бездумно, порядок будет не правильный.
Операцию b ∨ b можно представить, как просто b. Ведь, если b принимает значение 0, тогда будет 0 ∨ 0 = 0. Если значение будет 1, то 1 ∨ 1 = 1. Поэтому формулу можно переписать следующим образом: a ≡ b → c как a == (not(b) or c)
В предыдущих задачах нам не приходилось думать над приоритетами, потому что везде были расставлены скобки. И в основном они уже расставлены в задачах второго задания из ЕГЭ по информатике.
Дальше решаем как обычно.
print('a b c')
for a in range(0, 2):
for b in range(0, 2):
for c in range(0, 2):
if a == (not(b) or c):
print(a, b, c)
Вывод:
a b c
0 1 0
1 0 0
1 0 1
1 1 1
Последнюю строчку можно вычеркнуть из нашей таблицы, т.к. у нас в каждой строчке есть хотя бы один ноль.
Последний столбец занимает переменная a, т.к. только в последний столбец может влезть две единицы.
В строчке, где у a ноль, так же ноль и у переменной c. Значит, во второй столбец идёт переменная c. Если мы ноль поставим в первой строчке в первом столбце, то получится первый столбец из всех нулей. А такого у нас в таблице истинности нет.
Тогда переменная b в первом столбце.

Ответ: bca
Миша заполнял таблицу истинности логической функции F ((w → y) → x) / ¬z, но успел заполнить лишь фрагмент из трёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных w, x, y, z.
| F | ||||
|---|---|---|---|---|
| 1 | 0 | |||
| 0 | 0 | |||
| 1 | 0 | 0 | 0 |
Определите, какому столбцу таблицы соответствует каждая из переменных w, x, y, z. В ответе напишите буквы w, x, y, z в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и т.д.). Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно.
Рассмотрим два способа решения задачи с помощью Python.
Классический способ решения задачи с помощью Python используя циклы:
print("x y z w")
for x in range(0, 2):
for y in range(0, 2):
for z in range(0, 2):
for w in range(0, 2):
if not((not(not(w) or y) or x) or not (z)):
print(x, y, z, w)
Получаем следующую таблицу истинности в качестве вывода в консоли:
x y z w
0 0 1 0
0 1 1 0
0 1 1 1
В данной задаче всё получилось просто. У нас три строчки в таблице и три строчки при выводе результата в консоль(при этом в условии if мы не забываем взять всё выражение в скобочки и инвертировать результат с помощью not т.к. нас интересует когда выражение вернёт ложь). Осталось только сопоставить три строчки вывода с исходной таблицей. Но в некоторых вариациях данного типа задачи может получиться так что у нас будет больше строчек при выводе(т.к. в условии изначально дана не вся таблица, а только несколько строк из неё) и тогда нам нужно будет их дольше проверять когда начнём сопоставлять со строчками по условию. И ещё сложнее может получиться решение задачи если в условии в таблице функция будет принимать значение 0 и 1(а не только 1 или только 0). В этом случае нам больше поможет второй способ решать данный тип задачи.
Способ решения с помощью функций из пакета itertools:
from itertools import * # 1
def f(x, y, z, w): # 2
return ((w <= y) <= x) or not (z) # w <= y одинаково как not(w) or y — второй вариант по формуле алгебры логики
for a1, a2, a3, a4, a5, a6, a7 in product([0, 1], repeat=7): # 3
t = [(a1, a2, 1, a3), (a4, 0, a5, a6), (a7, 1, 0, 0)] # 4
if len(t) == len(set(t)): # Условие проверки на всякий случай что мы сделали список t верным размером
for p in permutations('xyzw'): # 5
if [f(**dict(zip(p, r))) for r in t] == [0, 0, 0]: # 6
print(p)
Получаем в качестве вывода ответ в консоль:
('z', 'y', 'w', 'x')
Это и будет ответ на задачу. Просто перепишем в ответ буквы как выводе подряд: zywx.
В коде отмечены цифры после знака комментария #. Давайте разберёмся как работает код в данном способе:
Далее рассмотрим задачу где в исходной таблице в результате функции F(как результат всего логического выражения) присутствует 0 и 1. На примере будет видно где в таком случае, что меняется в коде и как найти ответ на задачу.
Ответ: zywx
Миша заполнял таблицу истинности логической функции F = (¬((y → w) ≡ x)) ∧ u, но успел заполнить только фрагмент из четырёх различных строк, даже не указав, каким столбцам таблицы соответствуют переменные.
| F | ||||
|---|---|---|---|---|
| 0 | 1 | 0 | 0 | |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 1 | 1 | |
| 1 | 1 | 1 | 1 |
Определите соответствие между столбцами таблицы и переменными u, w, x, y.
В данной задаче у нас даны строки таблицы при которых функция F вернула 1 и 0. Сначала напишем код для строк когда функция вернула 1(разницы нет, можно взять для 0).
Способ решения с помощью функций из пакета itertools:
from itertools import *
def f(x, y, w, u):
return (not((y <= w) == x)) and u
for a1, a2 in product([0, 1], repeat=2):
t = [(1, 0, 1, a1), (1, a2, 1, 1)]
if len(t) == len(set(t)):
for p in permutations('xywu'):
if [f(**dict(zip(p, r))) for r in t] == [1, 1]:
print(p)
Получаем вывод в консоль:
('w', 'x', 'u', 'y')
('u', 'x', 'w', 'y')
У нас в данном случае не получилось однозначного ответа. Под исходные строчки таблицы подходят два варианта с названиями столбцов. Но нам ведь даны ещё две строчки таблицы при которых функция возвращает 0. Немного откорректируем наш код(заранее выписав себе варианты ответов из консоли по варианту F=1):
from itertools import *
def f(x, y, w, u):
return (not((y <= w) == x)) and u
for a1 in product([0, 1], repeat=1): # 1
t = [(0, 1, 0, a1[0]), (0, 1, 1, 1)] # 2
if len(t) == len(set(t)):
for p in permutations('xywu'):
if [f(**dict(zip(p, r))) for r in t] == [0, 0]: # 3
print(p)
Функцию, которая проверяет выражение изменять не нужно. Она возвращает всегда либо True, либо False. В данном случае теперь проверяем на False. Изменяем код в трёх местах(строки по порядку отмечены # в коде):
Получаем вывод в консоль:
('y', 'x', 'w', 'u')
('y', 'x', 'u', 'w')
('y', 'w', 'x', 'u')
('y', 'w', 'u', 'x')
('u', 'x', 'y', 'w')
('u', 'x', 'w', 'y')
('u', 'y', 'x', 'w')
('u', 'y', 'w', 'x')
('u', 'w', 'x', 'y')
('u', 'w', 'y', 'x')
('y', 'x', 'w', 'u')
('y', 'x', 'u', 'w')
('y', 'w', 'u', 'x')
('y', 'u', 'w', 'x')
('u', 'x', 'y', 'w')
('u', 'x', 'w', 'y')
('u', 'y', 'x', 'w')
('u', 'y', 'w', 'x')
('u', 'w', 'x', 'y')
('u', 'w', 'y', 'x')
Здесь видим что в выводе нет варианта: ('w', 'x', 'u', 'y'). Но есть второй вариант ('u', 'x', 'w', 'y') — больше проверять нечего это и будет ответ.
p.s. Описанное решение мною выше было показано, чтобы показать разницу в решении одной задачи. Когда функция возвращает 0(False) и когда 1(True). Можно просто написать один код для F=1 и для F=0, чтобы получить сразу решение следующим образом:
from itertools import *
def f(x, y, w, u):
return (not((y <= w) == x)) and u
for a1, a2, a3 in product([0, 1], repeat=3): # 1
t = [(0, 1, 0, a1), (0, 1, 1, 1), (1, 0, 1, a2), (1, a3, 1, 1)] # 2
if len(t) == len(set(t)):
for p in permutations('xywu'):
if [f(**dict(zip(p, r))) for r in t] == [0, 0, 1, 1]: # 3
print(p)
Получаем вывод в консоль:
('u', 'x', 'w', 'y')
('u', 'x', 'w', 'y')
p.s. Вот и всё решение задачи. В выводе мы получили два одинаковых кортежа потому что в первую строку таблицы(в коде переменная a1) можно записать в пустую клеточку 1 или 0 — результат по столбцам от этого не измениться, как и результат всего выражения.
Ответ: uxwy
Миша заполнял таблицу истинности логической функции F = (x \/ y) /\ ¬ (y ≡ z) /\ ¬ w, но успел заполнить только фрагмент из четырёх различных строк, даже не указав, каким столбцам таблицы соответствуют переменные.
| F | ||||
|---|---|---|---|---|
| 1 | 1 | 1 | ||
| 0 | 1 | 0 | 1 | |
| 1 | 1 | 0 | 1 |
Определите соответствие между столбцами таблицы и переменными w, x, y, z.
Способ решения с помощью функций из пакета itertools:
from itertools import * # 1
def f(w, x, y, z): # 2
return (x or y) and not(y == z) and not w
for a1, a2, a3, a4 in product([0, 1], repeat=4): # 3
t = [(1, a1, 1, a2), (0, 1, a3, 0), (a4, 1, 1, 0)] # 4
if len(t) == len(set(t)):
for p in permutations('wxyz'): # 5
if [f(**dict(zip(p, r))) for r in t] == [1,1,1]: # 6
print(p)
Получаем вывод в консоль:
('z', 'y', 'x', 'w')
Это и будет ответ на задачу. Просто перепишем в ответ буквы как выводе подряд: zyxw.
В коде отмечены цифры после знака комментария #. Давайте разберёмся как работает код в данном способе:
Ответ: zyxw
Попробуйте сами запустить код в окне ниже с интерпретатором Python и повторите примеры из статьи чтобы самим увидеть и понять как всё это работает. Для этого в ячейке с кодом нажмите клавиши на клавиатуре Shift+Enter или запустите код через кнопку Run по значку ▶.