Программное решение при помощи перебора:
for x in range(2):
for y in range(2):
for z in range(2):
for w in range(2):
f = (not x and not y) or (y == z) or not w
if f == 0:
print(x, y, z, w)Программа выведет в результате для соответствующих столбцов x,y,z,w:
0 1 0 1
1 0 1 1
1 1 0 1
Строка с двумя единицами 0101 может соответствовать только второй строке в исходной таблице. На месте пропущенного значения не может стоять ноль, так как строки с тремя нулями в выводе программы нет. Следовательно, пропущенное значение - это единица. Поменяем столбцы x и y местами, чтобы привести строку к табличному виду.
Обновим данные в соответствии с выше указанным выводом:
y x z w
1 0 0 1
0 1 1 1
1 1 0 1
Строки 0111 и 1101 похожи по количеству нулей и единиц, отличия лишь в порядке.
Предположим, что строка 0111 - это третья строка исходной таблицы, тогда ноль должен стоять вторым. Как следствие, поменяем столбцы x и z местами, чтобы привести строку к табличному виду.
Обновим данные в соответствии с выше указанным выводом:
y z x w
1 0 0 1
0 1 1 1
1 0 1 1
Теперь все строки совпадают. Если бы они не совпали, тогда мы вернулись бы к моменту, когда столбцы x и z еще не поменяли местами и проверили другой вариант перестановки.
Ответ: yzxw.
Программное решение при помощи генерации комбинаций:
from itertools import product, permutations
def f(x, y, z, w):
return (not x and not y) or (y == z) or not w
combs = [list(map(int, c)) for c in product('01', repeat=5)]
for c1, c2, c3, c4, c5 in combs:
t = [(c1, c2, c3, 1), (1, 0, 0, c4), (1, 0, 1, 1)]
if len(t) == len(set(t)):
for xyzw in permutations('xyzw'):
res = [f(**dict(zip(xyzw, r))) for r in t]
if res == [0] * 3:
print(xyzw)Ответ: yzxw.