Объясните, пожалуйста, как работает этот код ( не могу понять что происходит после начала первого цикла 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, что куда подходит в таблицу)
