ЕГЭ 2025 Информатика: кодирование сообщения (задача 4)

Задача 4 (Яндекс)

В новогоднюю ночь Максим решил украсить дом гирляндой из красных и зелёных лампочек, закодировав с их помощью праздничное послание, используя систему шифрования, удовлетворяющую условию Фано (никакое кодовое слово не является началом другого). Он уже придумал кодовые слова для некоторых букв: Н — КК, Ы — КЗ, А — ЗКК, О — ЗКЗ. Помогите Максиму определить минимальное количество лампочек для кодирования сообщения «Новый год».

Заменим К на 0 и З на 1:

  • Н: 00
  • Ы: 01
  • А: 100
  • О: 101

Сообщение «Новый год» содержит буквы Н, О, В, Ы, Й, Г, О, Д. Построим бинарное дерево, начиная с 1 (так как уже есть 00 и 01). Каждая ветвь разветвляется на 0 и 1. Добавим кодовые слова длиной 4 для В, Й, Г, Д и остальные буквы алфавита.

Подсчитаем длину кодового слова для каждой буквы в сообщении «Новый год»:

  • Н: 2
  • О: 3
  • В: 4 (предполагается)
  • Ы: 2
  • Й: 4 (предполагается)
  • Г: 4 (предполагается)
  • О: 3
  • Д: 4 (предполагается)

Общее количество лампочек: 2 + 3 + 4 + 2 + 4 + 4 + 3 + 4 = 26. Ответ: 26.

Задача 8

Определите количество натуральных чисел, удовлетворяющих условиям:

  1. Восьмеричная запись числа содержит ровно четыре цифры.
  2. Сумма любых двух соседних цифр восьмеричной записи нечётна.
  3. Двоичная запись числа не содержит двух идущих подряд единиц.

Решение с использованием модуля itertools:

from itertools import product

k = 0
for w in product('01234567', repeat=4):
    s = ''.join(w)
    if s[0] != '0' and all((int(s[i]) + int(s[i+1])) % 2 != 0 for i in range(len(s)-1)) and '11' not in bin(int(s, 8))[2:]:
        k += 1
print(k) # Ответ: 136

Задача (Яндекс, 5 декабря)

Максим составляет таблицу сигналов для новогодних гирлянд из пяти лампочек красного (К), зелёного (З), белого (Б) и синего (С) цветов. Зелёная лампочка может быть не более двух раз, красные и белые не должны стоять рядом. Сколько разных сигнальных последовательностей возможно?

from itertools import product

k = 0
for w in product('КЗБС', repeat=5):
    l = ''.join(w)
    if l.count('З') <= 2 and 'КБ' not in l and 'БК' not in l:
        k += 1
print(k) # Ответ: 536

Задача 13 (Яндекс)

IP-адрес 137.219.220.63 принадлежит сети. Какое максимальное количество единиц может быть в её маске?

import ipaddress

for m in range(32, -1, -1):
    net = ipaddress.ip_network(f'137.219.220.63/{m}', False)
    if str(ipaddress.ip_address('137.219.220.63')) != str(net.broadcast_address):
        print(m)
        break # Ответ: 25

Задача 13 (Яндекс)

В сети с IP-адресом 185.178.54.144 и маской 255.255.255.0, сколько IP-адресов имеют в двоичной записи правого байта сочетание трёх подряд идущих нулей и четырёх подряд идущих единиц?

import ipaddress

net = ipaddress.ip_network('185.178.54.144/24')
k = 0
for ip in net.hosts():
    ip4 = bin(int(str(ip).split('.')[-1]))[2:].zfill(8)
    if '000' in ip4 and '1111' in ip4:
        k += 1
print(k)

Задача (Файл с последовательностью чисел)

Файл содержит последовательность чисел от 0 до 10000. Определите количество пар чётных чисел (идущих подряд) с наибольшим общим делителем > 20 и наибольшую разность между числами в таких парах.

import math

s = []
with open('17.txt') as f:
    for line in f:
        s.append(int(line))

res = []
for i in range(len(s) - 1):
    if s[i] % 2 == 0 and s[i+1] % 2 == 0 and math.gcd(s[i], s[i+1]) > 20:
        res.append(abs(s[i] - s[i+1]))

print(len(res), max(res) if res else 0) # Ответ: 126 8592

Что будем искать? Например,программа