Объясните, пожалуйста, как работает этот код ( не могу понять что происходит после начала первого цикла for) :

from itertools import product, permutations


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


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


for a, b, c, d, e, f in product([0, 2], repeat=6):
    table = [(a, b, c, 0), (d, e, 0, 0), (f, 0, 0, 0)]
    if len(table) != len(set(table)):
        continue
    for p in permutations('xyzw'):
        if [f1(**dict(zip(p, r))) for r in table] == [f2(**dict(zip(p, r))) for r in table]:
            print(*p)

Насколько я понял, в коде задана таблица и он сам перебирает все значения которые могут в ней быть, в результате выводит верный ответ к этой задаче:


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

Автор решения: Иван Ипатов

С помощью циклов

print('x y z w')
for x in range(2):  # x может быть [0; 2)
    for y in range(2):  # y может быть [0; 2)
        for z in range(2):  # z может быть [0; 2)
            for w in range(2):  # w может быть [0; 2)
                # благодаря всем циклам мы переберём все варианты
                # записываем чему равны наши функции
                f1 = (x <= y) or (not w == z)
                f2 = (x <= y) == (w and not z)
                # если значения равны
                if f1 == f2:
                    print(x, y, z, w)

С помощью itertools

from itertools import product

print('x y z w')
# аналогично перебираем все варианты, сначала
# x:0,y:0,z:0,w:0, потом x:0,y:0,z:0,w:1 и т.д.
for x, y, z, w in product([0, 1], repeat=4):
    # записываем чему равны наши функции
    f1 = (x <= y) or (not w == z)
    f2 = (x <= y) == (w and not z)
    # если значения равны
    if f1 == f2:
        print(x, y, z, w)

Вывод:

x y z w
0 0 0 1
0 1 0 1
1 0 1 0 # можно вычеркнуть, т.к. не подходит по таблице
1 1 0 1

Ну, и несложная игра в Шерлока Холмса, что куда подходит (лучше смотреть по 0, что куда подходит в таблицу)

ответ

→ Ссылка