Задание 4 ЕГЭ по информатике 2027: условие Фано и кодирование
- Раздел
- Теоретические основы информатики
- Максимальный балл
- 1 балл
- Уровень
- базовый
- Что проверяет
- Умение кодировать и декодировать информацию
- Что нужно сделать
- Построить префиксный код по условию Фано и найти длину кодового слова или закодированного сообщения.
- Как записать ответ
- только число: целое, без пробелов и единиц измерения
- Время
- Около 2 минут по обобщённому плану ФИПИ
- Элемент кодификатора
- 2.1
- Компьютер
- Специальное ПО по плану ФИПИ не нужно: задание решают рассуждением, программа — для проверки
- Файл к заданию
- Нет — все данные в условии
- В 2026 году
- Тоже задание 4
Задание 4 ЕГЭ по информатике 2027 года проверяет, по формулировке ФИПИ, «умение кодировать и декодировать информацию». В демоверсии это задача про префиксный код: кодовые слова для части букв известны, для двух-трёх букв их нужно подобрать так, чтобы сообщение заняло минимально возможное число двоичных знаков.
Задание базового уровня, компьютер и файлы для него не нужны, ответ — одно целое число, которое вносят в поле на станции КЕГЭ. По обобщённому плану на него отводится около 2 минут, за верный ответ — 1 балл. Тема в 2027 году не менялась: изменились темы заданий 10, 13 и 23 и формат ответа задания 27, а здесь по-прежнему действует предметное требование 2.4 кодификатора — «Умение строить код, обеспечивающий наименьшую возможную среднюю длину сообщения при известной частоте символов».
Средний процент выполнения в 2026 году — 71,5 %, в 2025 году — 82,9 %. Ниже — три типа задания с разбором и решением на Python, разбор демоверсии 2027 года и типичные ошибки.
Тренажёр задания 4
Десять заданий номера 4 из банка тренажёра — с файлами, как на станции КЕГЭ. Решайте в песочнице Python прямо на странице или у себя; ответ проверяется по ключу, после проверки — верный ответ, разбор и решение на Python, а при ошибке — разбор от ИИ. Кнопка «Ещё 5 таких» у типа задания ниже даёт задания одного типа.
Задание 4 вместе с остальными — в вариантах целиком.
Типы задания 4 с решением
Наименьшая длина кодирования слова
По каналу связи передаются сообщения из букв Б, И, Н, Р, Т. Код двоичный и удовлетворяет условию Фано; известны слова Б — 1, Р — 01, Т — 0011, а для И и Н коды не заданы. Какое количество двоичных знаков требуется для кодирования слова ННТТББИНН, если оно закодировано минимально возможным числом знаков?
Для этого примера ответ — 26. Тот же прототип, что и в демоверсии 2027 года.
1. Считаем частоты букв без кодов: Н встречается 4 раза, И — 1 раз. 2. Выписываем свободные слова: после кодов 1, 01 и 0011 доступны 000, 0010 и их продолжения, а слова 00 и 001 заняты — они являются началом известного кода 0011. 3. Короткое слово отдаём частой букве: Н получает 000 (3 знака), И — 0010 (4 знака). 4. Занять 00 нельзя: это начало известного кодового слова 0011, поэтому условие Фано нарушилось бы.
На примере: 4 · 3 + 1 · 4 = 16, буквы с известными кодами добавляют 2 · 1 + 2 · 4 = 10, всего 26.
from itertools import combinations, product
# известные коды букв
known = {'Б': '1', 'Р': '01', 'Т': '0011'}
word = 'ННТТББИНН' # слово, длину кодирования которого ищем
hidden = 'ИН' # буквы, которым код ещё не назначен
# 1. Свободные слова: не совпадают с известными, не начинаются с них
# и сами не являются началом известного слова.
candidates = []
for length in range(1, 7):
for bits in product('01', repeat=length):
w = ''.join(bits)
if any(w.startswith(k) or k.startswith(w) for k in known.values()):
continue
candidates.append(w)
# 2. Частая буква должна получить короткий код.
freq = sorted((word.count(ch) for ch in hidden), reverse=True)
# 3. Перебираем пары свободных слов и берём самую дешёвую по длине слова.
best = None
for a, b in combinations(candidates, 2):
if a.startswith(b) or b.startswith(a):
continue # условие Фано нарушено
cost = sum(f * l for f, l in zip(freq, sorted((len(a), len(b)))))
best = cost if best is None else min(best, cost)
# 4. Прибавляем вклад букв с известными кодами.
fixed = sum(word.count(ch) * len(code) for ch, code in known.items())
print(best + fixed)
Ответ: 26
Кратчайшее кодовое слово для буквы
Сообщения передаются буквами В, Г, З, Р, С, Т. Известны коды Г — 011, З — 10, Р — 00, а для букв В, С и Т кодовые слова неизвестны. Определите, какое наименьшее количество двоичных знаков может содержать кодовое слово для буквы С, чтобы код допускал однозначное декодирование.
Для этого примера ответ — 2.
1. Свободные позиции после кодов 011, 10 и 00 — это 11, 010 и их продолжения; остальное закрыто. 2. Оцениваем запас по сумме Крафта: известные слова занимают 1/8 + 1/4 + 1/4 = 5/8, значит, для трёх букв без кодов свободно 3/8. 3. Слова длины 1 не годятся: 0 — начало кода 00, 1 — начало кода 10. 4. Слово 11 длины 2 свободно и весит 1/4, а это меньше 3/8: остаток 1/8 остаётся позиции 010, в которой разместятся коды двух других букв, например 0100 и 0101.
На примере: буква С получает код 11, то есть 2 знака; короче быть не может.
from itertools import product
known = {'Г': '011', 'З': '10', 'Р': '00'}
need = 3 # столько кодов нужно разместить: у букв В, С и Т
used = list(known.values())
# 1. Свободные слова — те, что не конфликтуют с известными кодами.
candidates = []
for length in range(1, 7):
for bits in product('01', repeat=length):
w = ''.join(bits)
if any(w.startswith(k) or k.startswith(w) for k in used):
continue
candidates.append(w)
candidates.sort(key=len)
def kraft(words):
"""Сумма 1/2 в степени длины: у однозначного кода она не больше 1."""
return sum(2 ** (-len(w)) for w in words)
# 2. Идём от коротких слов: слово подходит, если после него остаётся
# место для кодов остальных букв (или буква всего одна).
for w in candidates:
left = 1 - kraft(used) - kraft([w])
if left > 0 or need == 1:
print(len(w))
break
Ответ: 2
Наименьшая суммарная длина кодовых слов
Известны коды Б — 0000, Ж — 111, К — 110, Т — 01, а для букв Д, Р и Ю кодовые слова не заданы. Какое наименьшее количество двоичных знаков требуется для кодирования оставшихся букв? В ответе — суммарная длина кодовых слов для Д, Р и Ю.
Для этого примера ответ — 9.
1. Свободные позиции после известных кодов — 10, 001, 0001 и их продолжения. 2. Нужны три слова, и ни одно из них не должно быть началом другого. 3. Самые короткие совместимые свободные слова — 10 (2 знака), 001 (3 знака) и 0001 (4 знака): 2 + 3 + 4 = 9. 4. Дешевле не выйдет: без слова 10 три кода будут не короче 3 знаков каждый, то есть те же 9, а продолжения и деление слов только удлиняют коды.
На примере: суммарная длина 2 + 3 + 4 = 9.
from itertools import product
known = {'Б': '0000', 'Ж': '111', 'К': '110', 'Т': '01'}
need = 3 # столько кодов нужно разместить: Д, Р и Ю
# 1. Свободные слова: не заняты, не начинаются с известного кода
# и сами не являются его началом.
candidates = []
for length in range(1, 7):
for bits in product('01', repeat=length):
w = ''.join(bits)
if any(w.startswith(k) or k.startswith(w) for k in known.values()):
continue
candidates.append(w)
candidates.sort(key=len) # короткие слова считаем первыми
# 2. Ищем тройку попарно совместимых слов с наименьшей суммой длин.
best = None
for i in range(len(candidates)):
for j in range(i + 1, len(candidates)):
for k in range(j + 1, len(candidates)):
a, b, c = candidates[i], candidates[j], candidates[k]
total = len(a) + len(b) + len(c)
if best is not None and total >= best:
break # слова отсортированы, короче уже не будет
if (a.startswith(b) or b.startswith(a) or a.startswith(c)
or c.startswith(a) or b.startswith(c) or c.startswith(b)):
continue # условие Фано нарушено
best = total
print(best)
Ответ: 9
Как выполнять задание
- Выпишите известные кодовые слова и отметьте их в двоичном дереве: занятое слово и всё его поддерево для новых кодов недоступны.
- Найдите свободные слова — те, что не начинаются с известного кода и сами не служат его началом. Это кандидаты на коды неизвестных букв.
- Решите, что именно требуется: длину кодирования всего слова считают по частотам букв, кратчайшее слово для одной буквы берут из самых коротких свободных позиций, меньшую сумму длин дают несколько коротких свободных слов.
- Проверьте ответ вручную: подставьте найденные коды в слово, сложите длины и убедитесь, что ни один код не является началом другого.
- В ответе — одно целое число без пробелов и единиц измерения; введите его на станции КЕГЭ и нажмите «Сохранить».
Что нужно знать
- Условие Фано. Никакое кодовое слово не является началом другого, поэтому сообщение расшифровывается однозначно. Кодовые слова удобно рисовать листьями двоичного дерева: у занятого слова потомков быть не может.
- Обратное условие Фано. Никакое слово не является концом другого; расшифровка тоже однозначна. Читайте, какое из двух условий стоит в задании.
- Свободные позиции. Код неизвестной буквы берут из вершин, у которых нет занятых предков и потомков: он не начинается с известного слова и не служит его началом.
- Частоты букв. Сообщение короче, когда частым буквам достаются короткие слова: в слове КОЛОБОК буква О стоит три раза, а К — два.
- Неравенство Крафта. Для однозначного кода сумма 2−l по всем кодовым словам не больше 1; если сумма равна 1, свободных позиций не осталось и новую букву придётся кодировать длиннее.
- Длина сообщения. Это сумма по буквам: сколько раз буква встречается, умноженное на длину её кода.
Задание 4 в формате 2027 года можно пройти в демоверсии КЕГЭ 2027 на сайте.
Как оценивается
Проверка автоматическая, по ключу: ответ должен быть записан в форме из условия и полностью совпасть с эталоном. Код и черновики не проверяют — значение имеет только ответ. За верный ответ — 1 балл, частичного балла нет.
Критерии всех заданий экзамена — на странице критериев ЕГЭ.
Разбор задания демоверсии 2027
В демоверсии 2027 года в наборе пять букв — Б, К, Л, О, Н; известны коды Б — 00, Н — 010, Л — 111, а для К и О кодовые слова нужно подобрать так, чтобы слово КОЛОБОК заняло минимально возможное число знаков.
Разберём руками. В слове КОЛОБОК буква О стоит три раза, К — два, Л и Б — по одному, поэтому короткий код выгодно отдать О. После кодов 00, 010 и 111 свободными остаются короткие слова 10, 011 и 110; остальные слова либо начинаются с известного кода, либо сами служат его началом. Продолжения этих трёх слов допустимы, но длиннее и результата не улучшают. Самое короткое свободное слово — 10, его и получает О, а К берёт 011. Тогда КОЛОБОК кодируется как 011 10 111 10 00 10 011, длина 3 + 2 + 3 + 2 + 2 + 2 + 3 = 17. Обмен кодами между К и О дал бы 2 · 2 + 3 · 3 = 13 для них, то есть 18 вместо 17.
Файла у задания 4 нет, поэтому ключ ФИПИ — это ответ демоверсии: 17.
Типичные ошибки
Новое слово — начало известного кода
Если известно слово 0011, то занять 001 нельзя: оно является началом известного кода, и расшифровка станет неоднозначной. Новое слово не должно ни начинаться с известного, ни быть его началом.
Короткий код отдан редкой букве
Длину кодирования считают по частотам: короткие слова должны достаться буквам, которые встречаются чаще. В демоверсии обмен кодами между К и О даёт 18 вместо 17.
Взято продолжение свободного слова
Продолжение всегда длиннее своего слова, поэтому занимать 100, когда свободно 10, невыгодно. Исключение — когда свободных позиций меньше, чем букв без кода: тогда свободное слово действительно делят.
Не проверено, хватает ли места всем буквам
Свободных позиций должно хватить на все буквы без кодов. Если после выбранного слова места не осталось, остальные буквы получат более длинные коды и ответ изменится.
Вопросы и ответы
Что такое условие Фано?
Это требование к коду: никакое кодовое слово не является началом другого. При таком коде сообщение расшифровывается однозначно, без разделителей между буквами.
Чем обратное условие Фано отличается от прямого?
Прямое запрещает слова, которые начинаются с другого кодового слова, обратное — слова, которые другим кодовым словом заканчиваются. Однозначное декодирование дают оба, но в задании указано только одно из них.
Нужна ли программа для задания 4?
Нет: компьютер для этого задания не требуется и файла к нему нет. Достаточно черновика и двоичного дерева. Программа на Python полезна для самопроверки: на этой странице она перебирает свободные слова и считает длину.
С чего начинать решение?
С дерева кодов: отметьте известные слова, выпишите свободные позиции, а затем смотрите на вопрос. Для длины слова сравните частоты букв, для одного слова возьмите самое короткое свободное, для суммы длин — несколько коротких.
Изменилось ли задание 4 в 2027 году?
Нет: как и в 2026 году, это кодирование и декодирование, условие Фано. Тема и номер сохранились; в 2027 году изменены темы заданий 10, 13 и 23 и формат ответа задания 27.
Другие задания раздела «Теоретические основы информатики»
- Задание 1схема дорог и таблица расстояний · до 1 балла
- Задание 2таблицы истинности · до 1 балла
- Задание 7объём изображения и звука · до 1 балла
- Задание 8слова и комбинаторика · до 1 балла
- Задание 11объём сообщения и пароли · до 1 балла
- Задание 14системы счисления · до 1 балла
- Задание 15логические выражения · до 1 балла
- Задание 19теория игр: выигрыш первым ходом · до 1 балла
- Задание 20теория игр: выигрыш вторым ходом · до 1 балла
- Задание 21теория игр: дерево игры · до 1 балла
- Задание 23кратчайший путь в графе · до 1 балла
По демоверсии, спецификации и кодификатору ФИПИ 2027
Обновлено: