1. Как "правильно" писать программы на ЕГЭ (задания типов 2, 5, 12, 15)



Вступление
Решение одного задания или серии заданий одного типа отличается от решения серии из заданий разного типа.
ЕГЭ состоит из серии заданий, которые условно можно разбить на несколько цепочек.
Рассмотрим одну из таких цепочек, состоящую из заданий типа 2 - 5 - 12 - 15. Это задания базового уровня сложности, на решение которых, согласно спецификации, отводиться 16 минут. Далее рассмотрим "программный" подход к решению (некоторые из задач можно/нужно решать "вручную").
"Правильным" будем считать решение  в котором:
  • выделяется "частный" блок ввиде подпрограммы
  • используются однотипные подходы для решения всех задач цепочки
  • решение следующей программы можно получить модификацией уже написанных

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


Для решения этого задания можно написать основной блок, который будет перебирать все строки таблицы истинности и 
выводить те, в которых значение функции принимает нужное значение для заданного порядка
Ниже текст такой программы ( подробности здесь)


Представлен возможный код программы (если убрать комментарий, то так он может выглядеть на экзамене)
Почему такой? 
Порядок определяем в подпрограмме, а перебор значений отрезка пригодиться далее.
Можно попробовать написать аналогичное решение в следующем окне и найти ответ на задание


Задание типа 5 (Формальное исполнение простого алгоритма, записанного на естественном языке, или умение создавать линейный алгоритм для формального испол- нителя с ограниченным набором команд, или умение восстанавливать исходные данные линейного алгоритма по результатам его работы)
Пример задания типа 5 ( демоверсия 2025)
На вход алгоритма подаётся натуральное число N.
Алгоритм строит по нему новое число R следующим образом.
1. Строится двоичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
а) если число чётное, то к двоичной записи числа слева дописывается 10;
б) если число нечётное, то к двоичной записи числа слева дописывается 1 и справа дописывается 01.
Полученная таким образом запись является двоичной записью искомого числа R.
3. Результат переводится в десятичную систему и выводится на экран.
Например, для исходного числа 410 = 1002 результатом является число 2010 = 101002,
а для исходного числа 510 = 1012 это число 5310 =1101012.
Укажите максимальное число R, которое может быть результатом работы данного алгоритма,
при условии, что N не больше 12.
В ответе запишите это число в десятичной системе счисления.
 

Только что написали решение задания типа 2, которое было сохранено под имененм .... (например, zadanie_2)
Сразу сохраним его еще раз под другим именем ... (например, zadanie_5). 
Итак на экране код
def f2(A):
    w,x,y,z = A # здесь меняем порядок следования
    return ((w<=y)<= x) or (1-z)
for n in range (16, 32):
    A=[int(s) for s in bin(n)[-4:]]
    if f2(A) == 0 : print(*A)  

  • Добавим/заменим  программу f5(n), которая будет возвращать двоичную строку, полученную из n
  • Изменим основную программу по вывод максимального значения -
    поскольку значений немного, то можно выводить все (и не надо делать отладку)


Поясним, почему "выгоднее" возвращать строку, а не число. 
Возврат строки упрощает проверку по примерам из задачи - например, её можно сделать отдельным принтом в основной программе

Задание типа 12 ( Умение исполнить алгоритм для конкретного исполнителя с фиксированным набором команд)
Пример задания (демоверсия 2025)
Исполнитель Редактор получает на вход строку цифр и преобразовывает её.
(описание команд опустим для компактности изложения)
Какая строка получится в результате применения приведённой ниже программы к строке,
состоящей из 81 идущей подряд цифре 1? В ответе запишите полученную строку.
НАЧАЛО
  ПОКА нашлось (11111) ИЛИ нашлось (888)
    ЕСЛИ нашлось (11111)
      ТО заменить (11111, 88)
      ИНАЧЕ заменить (888, 8)
    КОНЕЦ ЕСЛИ
  КОНЕЦ ПОКА
КОНЕЦ

 

После решение заданий типа 2 и типа 5 пересохраняем программу по новым именем ... (например, zadanie_12)
Итак на экране код
def f2(A):
    w,x,y,z = A # здесь меняем порядок следования
    return ((w<=y)<= x) or (1-z)
def f5( n ):
    s = bin( n )[ 2 : ]
    if n % 2 == 0 : s = '10' + s
    else : s = '1' + s + '01' 
    return s
for n in range ( 1, 13 ) :
    s = f5(n)
    print(int(s,2),n,s) 

Выполняем следующие действия:
  • пишем программу f12 (s),  которая из входной строки делает выходную
  • надо преобразовать конкретную строку, но мы не будем удалять цикл
    (а это, при решении одинарной задачи, похоже на глупость)


Цикл не удалили, поскольку:
  • это требует времени
  • он будет нужен в следующей программе

Задание типа 15 (Знание основных понятий и законов математической логики)
Задание бывает нескольких типов и не все из них стоит решать "программным" способом.
Рассмотрим один из типов, который удобно решать "программным" способом
(Подробнее об этом можно посмотреть здесь)
Пример задания ( основная волна 2024 )
Обозначим через ДЕЛ(n, m) утверждение «натуральное число n делится без остатка на натуральное число m».
Пусть на числовой прямой дан отрезок B = [70, 90]. 
Для какого наибольшего натурального числа А логическое выражение
ДЕЛ(x, А) \/ ((x ∈ B) → ¬ДЕЛ(x, 22))
истинно (т.е. принимает значение 1) при любом целом положительном значении переменной х?

 

После решение заданий типа 2, типа 5 и типа 12 пересохраняем программу по новым именем ... (например, zadanie_15)
Итак на экране код
def f2(A):
    w,x,y,z = A # здесь меняем порядок следования
    return ((w<=y)<= x) or (1-z)
def f5( n ):
    s = bin( n )[ 2 : ]
    if n % 2 == 0 : s = '10' + s
    else : s = '1' + s + '01' 
    return s
def f12(s):
    while '11111' in s or '888' in s :
        if '11111' in s : s =  s.replace('11111', '88', 1)
        else : s =  s.replace('888', '8', 1)
    return s
for n in range ( 81, 82 ) :
    s = '1' * n
    print(f12(s)) 

Для решения задания потребуется написать две функции:
  • f15(x,A)  - проверяющую истинность для конкретных x, A (B - неизменяется )
  • g15(A) - проверяющую истинность для всех x при заданном А
Задача функции f15 очень похожа на задачу функции f2 и её написание не представляет осбой сложности.
По смыслу задания, функция g15 должна проверять на истинность ВСЕ натуральные значения для x, что невозможно.
Значит надо понять, какой диапазон проверять - это можно сделать, если преобразовать функцию или...
взять все x от 1 до .... (хотя бы 1000). Ещё сложность в том, что А должно быть максимальным ...
Попробуем сделать "бездумное"/"бешенное" решения 
  


Конечно, в этом задании, надо вначале преобразовать формулу и получить
ДЕЛ(x, А)  \/  ¬(x ∈ B)  \/ ¬ДЕЛ(x, 22)
Тогда станет ясно, что по х интересны числа от 70 до 90, а  далее ...
по подходящим А увидеть и понять что А делить числа 88 
Ниже дана версия программы, для преобразованнй функции


Подведем итоги
  • Задания ЕГЭ не надо решать по принципу "слева направо, сверху вниз". Можно/нужно решать их в оптимальном порядке (для каждого этот порядок может быть свой), используя общий подход - это экономит время и повышает эффективность работы
  • Использование подпрограмм упрощает переход от задания к заданию и позволяет сократить временные затраты на решение заданий.
  • Последовательное решение однотипных (по средствам) заданий также сокращает затраты и упрощает переход от задания к заданию
  • выбор порядка зависит от предпочтений конкретного участника, но мы предлагаем следующий порядок
    тип 2 - тип 15 - тип 5 - тип 12 - и сюда можно добавить тип 16
Предложенные методы не претендуют на "только так и не иначе" (некоторые из заданий "выгоднее" решать "ручным" способом или другим "программным" способом)

 

time 1000 ms
memory 256 Mb

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