Помогите найти ошибку в коде для 2-ого задания ЕГЭ на языке Python

from itertools import product, permutations


def F1(x, y, z, w):
    return (x <= y) == (z <= w)


def F2(x, y, z, w):
    return (x <= y) == ((not w) == z)


for x1,x2,x3,x4,x5 in product([0, 1], repeat=5):

    t=(
      (0,x1,0,0,0,x2),
      (0,x3,1,1,x4,0),
      (0,0,x5,0,0,1)
    )

    if len(t) == len(set(t)):
        for p in permutations('xyzw',r=4):
            if [F1(**dict(zip(p, m))) for m in t] == [F2(**dict(zip(p, m))) for m in t]:
                print(*p)

Само задание:

введите сюда описание изображения


Ответы (2 шт):

Автор решения: Stanislav Volodarskiy

Вот тут if [F1(...) ...] == [F2(...) ...]: вы предполагаете что F1 = F2. Но этого нет в условии. Более того в третьей строке таблицы истинности прямо сказано, что они не равны.

С другой стороны, вы не проверяете что вычисленные значения совпадают с двумя последними столбцами таблицы.

Функция F2 записана с ошибкой: ==and.

И правильный ответ может быть выведен несколько раз.

from itertools import product, permutations


def F1(x, y, z, w):
    return (x <= y) == (z <= w)


def F2(x, y, z, w):
    return (x <= y) and ((not w) == z)


answer = set()
for x1, x2, x3, x4, x5 in product([0, 1], repeat=5):
    t = (
        (0, x1,  0,  0,  0, x2),
        (0, x3,  1,  1, x4,  0),
        (0,  0, x5,  0,  0,  1)
    )

    if len(t) == len(set(t)):
        for p in permutations('xyzw', r=4):
            if all(F1(**dict(zip(p, xyzw))) == f1 for *xyzw, f1, _ in t):
                if all(F2(**dict(zip(p, xyzw))) == f2 for *xyzw, _, f2 in t):
                    answer.add(p)

for p in answer:
    print(*p, sep='')
$ python temp.py
yxzw
→ Ссылка
Автор решения: Алексей Р

Пустоты в матрице заполняем None, в т.ч. в полях F1 и F2. В двойном цикле перебираем сначала сочетания возможных значений 3-х переменных (именно столько пустот в столбцах с переменными - ведь подбираем именно их), затем сочетания индексов переменных, которые передаем аргументами в функции. При нахождении первого случая, когда значения функция по имеющейся таблице истинности во всех 3-х строках совпали, печатаем и выходим из циклов.

from itertools import product, permutations


def F1(x, y, z, w):
    return (x <= y) == (z <= w)


def F2(x, y, z, w):
    return (x <= y) and ((not w) == z)


def find_vars():
    t = ([0, None, 0, 0, 0, None],
         [0, None, 1, 1, None, 0],
         [0, 0, None, 0, 0, 1])

    for a, b, c in product([0, 1], repeat=3):
        t[0][1], t[1][1], t[2][2] = a, b, c
        for p in permutations(range(4), r=4):
            cnt = 0
            for row in t:
                arg = [row[x] for x in p]
                cnt += (row[-2] in (F1(*arg), None)) and (row[-1] in (F2(*arg), None))
            if cnt == len(t):
                print(''.join('xyzw'[i] for i in p))
                return
find_vars()
yxzw
→ Ссылка