2. Как "правильно" решать задание типа 2 из ЕГЭ


Задание типа 2 - Умение строить таблицы истинности и логические схемы
Базовый уровень сложности. На выполнение задания отводиться 3 минуты (по спецификации КЕГЭ )
Это задание не может быть сложным!!! 
Оптимальный способ его решения "ручной", но для других заданий "придется" писать программы.
Попробуем решить это задание "программным-ручным" способом - то есть написать программу,
которая не выдает "точный ответ", но помогает решить задание.
Требование к такой программе могут быть следующие:
  • простой код
  • возможность быстрой модификации для следующих заданий
Расскажем об одном из таких способов.

Пример задания (демоверсия 2025 года)

Миша заполнял таблицу истинности логической функции 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 в том порядке, в котором идут соответствующие им столбцы (сначала буква, соответствующая первому столбцу; затем буква, соответствующая второму столбцу, и т.д.).
Буквы в ответе пишите подряд, никаких разделителей между буквами ставить не нужно


Почти во всех разборах можно найти такой подход к решению:
for x in 0, 1:
  for y in 0, 1:
    for z in 0, 1:
      for w in 0, 1:
        # вычисление функции F
        # вывод (x, y, z, w), если F=0
Нашему ученику по имени Фома он совсем не понравился, причем сразу по нескольким причинам:
  • зачем так много вложенных циклов? - но их можно получать копированием
  • а если переменных будет больше, то надо будет увеличивать вложенность? - не бойся Фома, не будет!?
Использовать соответствующую функцию из библиотеки Фома тоже не согласился и предложил:
  • перебрать все пятизначные двоичные числа и вывести из них по 4 последних знака 


Тогда мы стали возражать - а как вычислить функцию от строки?
Фома ответил, что вместо строки можно получить список из 0 и 1, а вычисление значения функции
реализовать в подпрограмме. Вот код, в котором функция вычисляется в подпрограмме


Мы сказали Фоме, что его код строит таблицу истинности, но громозкий и как искать ответ?
Фома ответил, что так должны решать репетиторы (они за это деньги получают - как Пушкин за каждую строчку laugh), 
а школьник может заметить, что переменная z не может быть нулем и значит стоит на 1 месте!
Фома быстро переписал код


Мы не сразу все поняли, но ответ код и результат нам понравился devil
         F
    1   0
  0     0
  1 0 0 0
 Сравнили с таблицей и почти хором сказали:
последний столбик это .....
Скопировали код Фомы,  изменили порядок переменных в  подпрограмме,
запустили и быстро нашли ответ
Проверить решение можно здесь

Рекомендую решение о Фомы, поскольку:
  • вычисление функции выделено в подпрограмму
  • перебор строк таблицы истинности осуществляется более в общем виде и
    может быть использовано при решении других заданий
  • содержит "стандартные" приемы Питона, упрощающие написание программ 
    yes

time 1000 ms
memory 256 Mb

Комментарий учителя