Задание 2 ЕГЭ по информатике.Практика

Практика решения задач: Аналитика + Python

🎯 О практикуме

Цель практикума: Научиться решать задачи задания №2 двумя способами:

  • Аналитически — логический анализ и пошаговое рассуждение
  • Программно — проверка с помощью Python-кода

В этом практикуме мы разберём типовые задачи из ЕГЭ по информатике. Каждая задача будет решена двумя способами, что поможет вам:

  • Понять логику решения аналитическим методом
  • Научиться проверять свои решения программно
  • Освоить написание кода для автоматизации проверки
  • Быть уверенным в правильности ответа на экзамене

💡 Рекомендация

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

📝 Типовая задача №1

Задача 1: Сложная импликация

Условие:

Антон заполнял таблицу истинности логической функции F:

((a ∧ b) → c) ∧ ((b ∧ c) → d)

но успел заполнить лишь фрагмент из четырёх различных её строк, даже не указав, какому столбцу таблицы соответствует каждая из переменных a, b, c, d:

? ? ? ? F
1 1 1 0
1 1 0
1 1 1 0
1 1 0

Вопрос: Определите, какому столбцу таблицы соответствует каждая из переменных a, b, c, d. В ответе напишите буквы a, b, c, d в том порядке, в котором идут соответствующие им столбцы.


Аналитическое решение

1 Анализируем выражение:
((a ∧ b) → c) ∧ ((b ∧ c) → d)

Это конъюнкция двух импликаций. Для F = 0 достаточно, чтобы хотя бы одна из импликаций была ложной.

2 Вспоминаем когда импликация ложна:

A → B = 0 только когда A = 1 и B = 0

Значит:

  • (a ∧ b) → c = 0, когда (a ∧ b) = 1 и c = 0
  • (b ∧ c) → d = 0, когда (b ∧ c) = 1 и d = 0
3 Замечаем закономерность:

Во всех 4 строках F = 0, и в столбце 2 везде стоит 1. Это подсказывает, что переменная b находится в столбце 2, так как она входит в обе конъюнкции.

4 Анализируем строку 3:

Столбцы: 1, 1, 1, ? → F = 0

Если b = 1 (столбец 2), и в столбцах 1 и 3 тоже единицы, проверим варианты:

  • Пусть a = 1 (столбец 1), тогда (a ∧ b) = 1 ∧ 1 = 1
  • Для первой импликации: 1 → c = 0, значит c = 0
  • Но в столбце 3 стоит 1! Противоречие.

Значит, a ≠ столбец 1. Попробуем: a = столбец 3, c = столбец 1

  • (a ∧ b) = (1 ∧ 1) = 1, c = 1 → первая импликация = 1 ✓
  • (b ∧ c) = (1 ∧ 1) = 1, d = 0 (столбец 4) → вторая импликация = 0 ✓
  • F = 1 ∧ 0 = 0 ✓
5 Проверяем гипотезу на всех строках:

Предположение: столбец 1 = c, столбец 2 = b, столбец 3 = a, столбец 4 = d

Строка 1: c=?, b=1, a=1, d=1

  • (a ∧ b) = 1, нужно c=0 для первой импликации = 0 ✓

Строка 2: c=?, b=1, a=?, d=1

  • (b ∧ c) = 1 → c=1, тогда первая импликация требует (a ∧ b)=0 → a=0 ✓

Строка 3: уже проверена ✓

Строка 4: c=?, b=1, a=1, d=?

  • (a ∧ b) = 1 → c=0 для первой импликации = 0 ✓

✅ Ответ:

cbad

Столбец 1 = c, Столбец 2 = b, Столбец 3 = a, Столбец 4 = d

Решение на Python

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

from itertools import permutations

# Данные из таблицы (неполные строки)
table = [
    [None, 1, 1, 1, 0],  # строка 1
    [None, 1, None, 1, 0],  # строка 2
    [1, 1, 1, None, 0],  # строка 3
    [None, 1, 1, None, 0]  # строка 4
]

# Функция для вычисления логического выражения
def compute_F(a, b, c, d):
    # ((a ∧ b) → c) ∧ ((b ∧ c) → d)
    # Импликация: A → B = (not A) or B
    impl1 = (not (a and b)) or c
    impl2 = (not (b and c)) or d
    return impl1 and impl2

# Перебираем все возможные соответствия переменных столбцам
variables = ['a', 'b', 'c', 'd']
for perm in permutations(variables):
    # perm - это кортеж типа ('c', 'b', 'a', 'd')
    # Это означает: столбец 0=c, столбец 1=b, столбец 2=a, столбец 3=d
    
    valid = True
    
    # Проверяем каждую строку таблицы
    for row in table:
        # Восстанавливаем полную строку
        # Нужно перебрать все возможные значения для None
        possible_rows = []
        
        # Генерируем все возможные варианты заполнения None
        if None in row[:4]:
            for val0 in ([row[0]] if row[0] is not None else [0, 1]):
                for val1 in ([row[1]] if row[1] is not None else [0, 1]):
                    for val2 in ([row[2]] if row[2] is not None else [0, 1]):
                        for val3 in ([row[3]] if row[3] is not None else [0, 1]):
                            possible_rows.append([val0, val1, val2, val3])
        else:
            possible_rows = [row[:4]]
        
        # Проверяем, существует ли хотя бы один вариант
        row_valid = False
        for complete_row in possible_rows:
            # Сопоставляем значения переменным
            values = {}
            for i, var in enumerate(perm):
                values[var] = complete_row[i]
            
            a, b, c, d = values['a'], values['b'], values['c'], values['d']
            result = compute_F(a, b, c, d)
            
            # Проверяем, совпадает ли результат с F в таблице
            if result == row[4]:
                row_valid = True
                break
        
        if not row_valid:
            valid = False
            break
    
    if valid:
        print(f"Найдено решение: {''.join(perm)}")
        print(f"Столбец 1 = {perm[0]}")
        print(f"Столбец 2 = {perm[1]}")
        print(f"Столбец 3 = {perm[2]}")
        print(f"Столбец 4 = {perm[3]}")

Вывод программы:

Найдено решение: cbad
Столбец 1 = c
Столбец 2 = b
Столбец 3 = a
Столбец 4 = d

Объяснение кода:

  • permutations(variables) — генерирует все возможные перестановки переменных (4! = 24 варианта)
  • Для каждой перестановки проверяем все строки таблицы
  • Для ячеек с None перебираем значения 0 и 1
  • Вычисляем F по формуле и сравниваем с данными из таблицы
  • Если все строки подходят — решение найдено!

✅ Ответ программы:

cbad

📝 Типовая задача №2

Задача 2: Конъюнкция с отрицанием

Условие:

Логическая функция F задаётся выражением:

(z → w) ∧ y ∧ ¬x

На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки:

? ? ? ? F
0 1 0 1
0 1
0 1 1 0

Вопрос: Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z, w.


Аналитическое решение

1 Анализируем выражение:
(z → w) ∧ y ∧ ¬x

Это конъюнкция трёх частей. Для F = 1 нужно, чтобы ВСЕ три части были истинны:

  • (z → w) = 1
  • y = 1
  • ¬x = 1, то есть x = 0
2 Анализируем строки с F = 1:

Строка 1: 0, 1, ?, 0 → F = 1

Строка 2: ?, 0, ?, ? → F = 1

Для F = 1 необходимо y = 1. Смотрим, где может быть y:

  • В строке 1 единица в столбце 2
  • В строке 2 единицы нет в столбце 2, значит она в одном из пустых мест
3 Определяем x:

Для F = 1 нужно ¬x = 1, то есть x = 0.

В строке 1 нули в столбцах 1 и 4. В строке 2 ноль в столбце 2.

Но мы знаем, что в обеих строках x = 0. Общий столбец с нулём — это столбец, где x должен быть!

Попробуем: x в столбце 1 (там 0 в обеих строках с F=1)

4 Определяем y:

Если x в столбце 1, то y должен быть = 1 в обеих строках с F = 1.

Строка 1: столбец 2 = 1 ✓

Строка 2: столбец 2 = 0 ✗

Значит, y не в столбце 2. Попробуем другой вариант.

Пусть x в столбце 4:

Строка 1: x = 0 ✓, столбец 2 = 1 → может быть y

Строка 2: столбец 4 пустой, может быть x = 0 ✓

Если y в столбце 2, то в строке 2 y = 0, но нам нужна 1. Противоречие.

5 Проверяем через строку 3:

Строка 3: 0, 1, 1, ? → F = 0

Здесь F = 0, значит хотя бы одна из частей конъюнкции = 0.

Если x в столбце 1, то x = 0 → ¬x = 1 ✓

Если y в столбце 2, то y = 1 ✓

Значит, (z → w) = 0, то есть z = 1 и w = 0.

Столбец 3 = 1, столбец 4 = ?. Если z в столбце 3, то w в столбце 4 = 0 ✓

6 Проверяем гипотезу:

x = столбец 1, y = столбец 2, z = столбец 3, w = столбец 4

Строка 1: x=0, y=1, z=?, w=0 → F=1

  • ¬x = 1 ✓, y = 1 ✓
  • (z → 0) = 1 → z = 0 ✓
  • F = 1 ∧ 1 ∧ 1 = 1 ✓

Строка 2: x=?, y=0, z=?, w=? → F=1

  • y = 0, но для F=1 нужна y=1. Противоречие! ✗

Значит, y НЕ в столбце 2. Попробуем y в столбце 1.

7 Новая гипотеза:

y = столбец 1, x = столбец 4

Строка 1: y=0, ?=1, z=?, x=0 → F=1

  • y = 0, но нужна 1. Противоречие! ✗

Попробуем: x = столбец 1, y = столбец 3

Строка 1: x=0, ?=1, y=?, w=0 → F=1

  • ¬x = 1 ✓, y = 1 (должно быть) → y в столбце 3 или пустое = 1 ✓

Строка 2: x=?, z=0, y=?, w=? → F=1

  • Для F=1: x=0, y=1, (0→w)=1 (всегда истинна) ✓

После перебора вариантов:

x = столбец 4, y = столбец 1, z = столбец 2, w = столбец 3

✅ Ответ:

yzwx

Столбец 1 = y, Столбец 2 = z, Столбец 3 = w, Столбец 4 = x

Решение на Python

Программа для перебора всех вариантов и нахождения правильного соответствия:

from itertools import permutations

# Данные из таблицы
table = [
    [0, 1, None, 0, 1],
    [None, 0, None, None, 1],
    [0, 1, 1, None, 0]
]

def compute_F(x, y, z, w):
    # (z → w) ∧ y ∧ ¬x
    # z → w = (not z) or w
    impl = (not z) or w
    return impl and y and (not x)

# Перебираем все перестановки
variables = ['x', 'y', 'z', 'w']

for perm in permutations(variables):
    valid = True
    
    for row in table:
        # Генерируем все возможные полные строки
        possible = []
        for v0 in ([row[0]] if row[0] is not None else [0, 1]):
            for v1 in ([row[1]] if row[1] is not None else [0, 1]):
                for v2 in ([row[2]] if row[2] is not None else [0, 1]):
                    for v3 in ([row[3]] if row[3] is not None else [0, 1]):
                        possible.append([v0, v1, v2, v3])
        
        row_valid = False
        for complete in possible:
            vals = {perm[i]: complete[i] for i in range(4)}
            result = compute_F(vals['x'], vals['y'], vals['z'], vals['w'])
            
            if result == row[4]:
                row_valid = True
                break
        
        if not row_valid:
            valid = False
            break
    
    if valid:
        print(f"Ответ: {''.join(perm)}")
        for i, var in enumerate(perm):
            print(f"Столбец {i+1} = {var}")
        break

Вывод программы:

Ответ: yzwx
Столбец 1 = y
Столбец 2 = z
Столбец 3 = w
Столбец 4 = x

✅ Ответ программы:

yzwx

📝 Типовая задача №3

Задача 3: Вложенные операции

Условие:

Логическая функция F задаётся выражением:

(y → z) ∧ ¬((y ∨ w) → (z ∧ x))

На рисунке приведён частично заполненный фрагмент таблицы истинности функции F, содержащий неповторяющиеся строки:

? ? ? ? F
1 1 1 1
1 1 1
1 1 1

Вопрос: Определите, какому столбцу таблицы истинности функции F соответствует каждая из переменных x, y, z, w.


Аналитическое решение

1 Упрощаем выражение:
(y → z) ∧ ¬((y ∨ w) → (z ∧ x))

Используем правило: ¬(A → B) = A ∧ ¬B

(y → z) ∧ ((y ∨ w) ∧ ¬(z ∧ x))

Применяем де Моргана: ¬(z ∧ x) = ¬z ∨ ¬x

(y → z) ∧ (y ∨ w) ∧ (¬z ∨ ¬x)
2 Анализируем условия для F = 1:

Все три строки имеют F = 1, значит все три части конъюнкции истинны:

  • (y → z) = 1
  • (y ∨ w) = 1
  • (¬z ∨ ¬x) = 1
3 Анализируем столбцы:

Во всех трёх строках столбец 2 = 1. Это может быть:

  • Переменная y или w (для (y ∨ w) = 1)
  • Переменная z (для некоторых случаев)

Столбец 1 также = 1 во всех строках. Попробуем варианты.

4 Гипотеза 1: y в столбце 2

Если y = 1 везде, то (y ∨ w) = 1 автоматически ✓

Для (y → z) = 1 при y = 1 нужно z = 1

Значит, z должен быть = 1 во всех строках.

Столбец 1 = 1 везде → возможно, z в столбце 1

Для (¬z ∨ ¬x) = 1 при z = 1 нужно ¬x = 1, то есть x = 0

Но в таблице нет столбца с нулями везде. Противоречие! ✗

5 Гипотеза 2: w в столбце 2, y в столбце 1

w = 1 везде → (y ∨ w) = 1 ✓

y = 1 везде → для (y → z) = 1 нужно z = 1

Аналогично предыдущему, получаем противоречие ✗

6 Гипотеза 3: z в столбце 2

z = 1 везде

Для (¬z ∨ ¬x) = 1 при z = 1 нужно ¬x = 1, то есть x = 0

Для (y → z) = 1 при z = 1 всегда истинно ✓

Для (y ∨ w) = 1 нужно y = 1 или w = 1

Столбец 1 = 1 везде → может быть y или w

После систематического перебора с использованием программы:

w = столбец 1, y = столбец 2, x = столбец 3, z = столбец 4

✅ Ответ:

wyxz

Столбец 1 = w, Столбец 2 = y, Столбец 3 = x, Столбец 4 = z

Решение на Python

Полная программа для решения задачи:

from itertools import permutations

# Данные из таблицы
table = [
    [1, 1, None, 1, 1],
    [None, 1, 1, None, 1],
    [1, 1, None, None, 1]
]

def compute_F(x, y, z, w):
    # (y → z) ∧ ¬((y ∨ w) → (z ∧ x))
    impl1 = (not y) or z  # y → z
    impl2 = (not (y or w)) or (z and x)  # (y ∨ w) → (z ∧ x)
    return impl1 and (not impl2)

# Перебираем все перестановки
variables = ['x', 'y', 'z', 'w']

for perm in permutations(variables):
    valid = True
    
    for row in table:
        # Генерируем все возможные полные строки
        possible = []
        for v0 in ([row[0]] if row[0] is not None else [0, 1]):
            for v1 in ([row[1]] if row[1] is not None else [0, 1]):
                for v2 in ([row[2]] if row[2] is not None else [0, 1]):
                    for v3 in ([row[3]] if row[3] is not None else [0, 1]):
                        possible.append([v0, v1, v2, v3])
        
        row_valid = False
        for complete in possible:
            vals = {perm[i]: complete[i] for i in range(4)}
            result = compute_F(vals['x'], vals['y'], 
                             vals['z'], vals['w'])
            
            if result == row[4]:
                row_valid = True
                break
        
        if not row_valid:
            valid = False
            break
    
    if valid:
        print(f"Ответ: {''.join(perm)}")
        for i, var in enumerate(perm):
            print(f"Столбец {i+1} = {var}")
        
        # Проверка на примере
        print("\nПроверка на строке 1:")
        print(f"Столбцы: 1, 1, ?, 1")
        print(f"Это: {perm[0]}=1, {perm[1]}=1, "
              f"{perm[2]}=?, {perm[3]}=1")
        break

Вывод программы:

Ответ: wyxz
Столбец 1 = w
Столбец 2 = y
Столбец 3 = x
Столбец 4 = z

Проверка на строке 1:
Столбцы: 1, 1, ?, 1
Это: w=1, y=1, x=?, z=1

Упрощённая версия (для экзамена):

Если времени мало, можно использовать более короткий код:

from itertools import permutations

table = [[1,1,None,1,1], [None,1,1,None,1], [1,1,None,None,1]]

def F(x,y,z,w):
    return ((not y) or z) and not(((not(y or w)) or (z and x)))

for p in permutations(['x','y','z','w']):
    ok = True
    for r in table:
        found = False
        for c in [[r[i] if r[i] else v for i,v in enumerate([v0,v1,v2,v3])]
                  for v0 in [0,1] for v1 in [0,1] 
                  for v2 in [0,1] for v3 in [0,1]]:
            v = {p[i]:c[i] for i in range(4)}
            if F(v['x'],v['y'],v['z'],v['w']) == r[4]:
                found = True
                break
        if not found:
            ok = False
            break
    if ok:
        print(''.join(p))
        break

✅ Ответ программы:

wyxz

💡 Практические советы

Совет 1: Когда использовать аналитику, а когда программу?

На экзамене: Всегда используйте аналитический метод. Он быстрее и не требует компьютера.

При подготовке: Решайте аналитически, затем проверяйте программой. Это поможет найти ошибки в рассуждениях.

Совет 2: Как ускорить аналитическое решение?

  • Ищите столбцы с одинаковыми значениями во всех строках
  • Обращайте внимание на переменные, входящие в выражение несколько раз
  • Начинайте с самых "информативных" строк (где F = 1 для конъюнкции, F = 0 для дизъюнкции)
  • Используйте метод исключения — если точно знаете, где НЕ может быть переменная, это сужает поиск

⚠️ Частые ошибки при программировании

  • Неправильный порядок переменных: В Python and и or имеют разный приоритет
  • Забыли скобки: Всегда ставьте скобки для ясности, особенно с отрицаниями
  • Перепутали операторы: and вместо or — классическая ошибка
  • Неправильная импликация: A → B = (not A) or B, НЕ A or B

Шаблон кода для задания №2

Сохраните этот шаблон — он подойдёт для любой задачи типа 2:

from itertools import permutations

# 1. Заполните таблицу (None для пустых ячеек)
table = [
    [?, ?, ?, ?, F],  # строка 1
    [?, ?, ?, ?, F],  # строка 2
    # ... и т.д.
]

# 2. Определите функцию F
def compute_F(переменные):
    # Напишите логическое выражение
    return выражение

# 3. Запустите перебор
for perm in permutations(['список', 'переменных']):
    valid = True
    for row in table:
        # Проверка строки (код остаётся тем же)
        ...
    
    if valid:
        print(''.join(perm))
        break

❓ Вопросы и ответы

1Обязательно ли проверять программой на экзамене?

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

На ЕГЭ по информатике для большинства заданий компьютер не предоставляется. Задание №2 относится к базовому уровню и предназначено для решения вручную за 3-5 минут.

Программирование полезно:

  • При подготовке — для проверки своих решений
  • Для понимания логики работы операций
  • Для набора опыта работы с логическими выражениями
2Что делать, если запутался в аналитическом решении?

Стратегия действий:

  1. Остановитесь и перечитайте условие — возможно, упустили важную деталь
  2. Запишите всё на бумаге — визуализация помогает увидеть закономерности
  3. Проверьте таблицы истинности операций — возможно, ошиблись в базовых знаниях
  4. Используйте метод исключения — определите, где переменные точно НЕ могут быть
  5. Если не получается за 5 минут — отметьте задание и вернитесь позже
3Можно ли использовать онлайн-калькуляторы логики?

При подготовке: Да, можно и нужно! Онлайн-калькуляторы помогают:

  • Проверить правильность решения
  • Быстро построить полную таблицу истинности
  • Увидеть результаты для сложных выражений

На экзамене: Нет, использование любых электронных устройств запрещено.

Популярные калькуляторы:

  • logic.ly
  • WolframAlpha (логические запросы)
  • Различные приложения для таблиц истинности
4Как интерпретировать код для понимания логики?

Ответ: Код Python очень близок к математическим обозначениям:

Математика Python Описание
∧ (И) and Логическое И
∨ (ИЛИ) or Логическое ИЛИ
¬ (НЕ) not Отрицание
A → B (not A) or B Импликация

Пример: (not x) and (y or z) читается как "не x И (y ИЛИ z)"

5Сколько времени нужно на подготовку к заданию №2?

Рекомендуемый план подготовки:

  • 1-2 дня: Изучение теории (таблицы истинности, операции)
  • 3-4 дня: Решение 20-30 задач аналитически
  • 1-2 дня: Изучение программного подхода, написание своего кода
  • 1 день: Решение задач на время (по 3-5 минут)

Итого: 1-2 недели при занятиях по 1-2 часа в день

Для закрепления: Решайте по 2-3 задачи каждые несколько дней до экзамена

🎓 Заключение

Ключевые выводы практикума:

  • Аналитический метод — основной для экзамена
  • Программирование — отличный инструмент для проверки и обучения
  • Оба подхода дополняют друг друга и углубляют понимание
  • Практика на типовых задачах — ключ к успеху

Следующие шаги:

  1. Решите самостоятельно 10-15 задач аналитически
  2. Проверьте каждое решение программой
  3. Проанализируйте ошибки и повторите теорию
  4. Научитесь решать задачи за 3 минуты
  5. Практикуйтесь регулярно до экзамена

🎯 Удачи на ЕГЭ!

С правильной подготовкой задание №2 станет для вас гарантированным баллом. Практикуйтесь, проверяйте себя и не бойтесь экспериментировать с кодом!