#1-27 номера ЕГЭ по информатике
March 13, 2023

Разбор теории для 1️⃣5️⃣-го номера ЕГЭ по информатике 2023 года  

Условие: Тип 15 № 34521

Обозначим через m & n поразрядную конъюнкцию неотрицательных целых чисел m и n.

Например, 14 & 5 = 1110_2 & 0101_2 = 0100_2 = 4.

Для какого наибольшего целого числа А формула

x & 51 = 0 ∨ (x & 41 = 0 → x & А = 0)

тождественно истинна (т. е. принимает значение 1 при любом неотрицательном целом значении переменной x)?



Вариант 1: классическое решение через переменную True

Комментарии к первому варианту решения задачи:

  1. создаем свою функцию для обработки формулы логики из условия, функция принимает всего два аргумента
  2. возвращаем значение логической функции из условия
  3. создадим пустой список для удобства поиска наибольшего подходящего числа
  4. пробегаем диапазон неотрицательных целых чисел через range()
  5. для каждого нового взятого числа А создаем переменную со значением True
  6. таким же образом пробегаем диапазон для переменной х - просто большое кол-во чисел
  7. если функция при переданных ей аргументах вернет ложь, то такое А нам не подходит по условию
  8. в таком случае меняем переменную flag на False значение
  9. и прерываем цикл перебора переменной х, так как это просто трата времени
  10. но если же пройдя всезначения диапазона х переменной, ни разу не произошел break и значение flag равно True, то такое число А нам подходит по условию – при А формула тождественно истинна при любых х (большом кол-ве)
  11. добавляем подходящее число в список R
  12. и выводим максимальный элемент из всех подходящих чисел А, лежащих в списке R
# Код решения Вариант 1
def F(x, A):
    return (x & 51 == 0) or ((x & 41 == 0) <= (x & A == 0))

R = []
for A in range(0, 1000):
    flag = True
    for x in range(0, 1000):
        if F(x, A) == False:
            flag = False
            break
    if flag == True:
        R.append(A)
print(max(R))

Вариант 2: решение с использованием функции all и списка list

Комментарии ко второму варианту решения задачи:

1-4. строки идентичные прошлому решению

  1. пробегаем подходящие по условию целые, неотрицательные числа А
  2. если все функции в all() буду истинными, то условие if истинно
  3. добавляем подходящее число А в список R
  4. и выводим максимальный элемент из всех подходящих чисел А, лежащих в списке R
# Код решения Вариант 2
def F(x):
    return (x & 51 == 0) or ((x & 41 == 0) <= (x & A == 0))

R = []
for A in range(0, 1000):
    if all(F(x) for x in range(0, 1000)):
        R.append(A)
print(max(R))

Вариант 3: решение с использованием только лишь функции all

Комментарии к третьему варианту решения задачи:

  1. обратите внимание, если пробегать диапазон от большего к меньшему, то первое найденное число будет - наибольшим
  2. если все функции в all() будут истинными, то условие if истинно
  3. выводим подходящее число А на экран
  4. и прерываем цикл перебора, чтобы остаться с наибольшим подходящим А
# Код решения Вариант 3
def F(x):
    return (x & 51 == 0) or ((x & 41 == 0) <= (x & A == 0))

for A in range(1000, -1, -1):
    if all(F(x) for x in range(0, 1000)):
        print(A)
        break

Вариант 4: компактное решение без использования самописной функции F

Комментарии к четвертому варианту решения задачи:

  1. пробегаем диапазон целых неотрицательных чисел
  2. если все функции в all() буду истинными, то условие if истинно
  3. выводим на экран первое подошедшее число
  4. так как мы пробегали убывающий диапазон, то первое - будет наибольшим
# Код решения Вариант 4
for A in range(1000, -1, -1):
    if all(((x & 51 == 0) or ((x & 41 == 0) <= (x & A == 0))) for x in range(0, 1000)):
        print(A)
        break

Вариант 5: просто полюбуйтесь на эту красоту

Комментарии к пятому варианту решения задачи:

  1. Данное решение является совокупностью предыдущих, оставим Вам на саморазбор
# Код решения Вариант 5
print(max([A for A in range(0, 1000) if all(((x & 51 == 0) or ((x & 41 == 0) <= (x & A == 0))) for x in range(0, 1000))]))


Ответ:41