Задание 2 ОГЭ по информатике: решайте с автопроверкой
Задание 2 о кодировании. Каждой букве сопоставлен код из нулей и единиц, и сообщение записано без разделителей. Нужно расшифровать его или узнать, сколькими способами это можно сделать. Обычно номер решают на бумаге, а программа помогает проверить себя и разобраться, почему условие Фано делает расшифровку однозначной.
Решать задачи номераКак решать программой
Если код удовлетворяет условию Фано (ни один код не начинает другой), расшифровка однозначна. Идите по сообщению слева направо и набирайте символы в группу: как только группа совпала с кодом буквы, допишите букву и начните новую группу.
В программе коды удобно хранить в словаре «код → буква». Проверка part in codes работает мгновенно.
Если условие Фано не выполнено, способов расшифровки может быть несколько. Их считает рекурсия: от текущей позиции пробуем каждый код, который подходит к началу оставшейся строки.
Задачи о том, сколькими способами можно расшифровать сообщение, проверяют понимание условия Фано. Если ответ больше одного, значит, условие нарушено.
Разбор примера
Коды букв: А 00, Б 010, В 011, Г 10, Д 110, Е 111. Расшифруем сообщение 10110111.
codes = {'00': 'А', '010': 'Б', '011': 'В', '10': 'Г', '110': 'Д', '111': 'Е'}
msg = '10110111'
word, part = '', ''
for bit in msg:
part += bit
if part in codes:
word += codes[part]
part = ''
print(word)Программа печатает
ГДЕ
Сообщение делится на части 10, 110 и 111, это буквы Г, Д и Е. Код удовлетворяет условию Фано, поэтому другой способ разбить сообщение невозможен.
Решить эту задачуЗадачи к заданию 2
- Расшифровка сообщения по кодуЛёгкаяРешать
- Расшифровка с концаЛёгкаяРешать
- Сколько способов расшифроватьСредняяРешать
- Сообщение в шестнадцатеричной записиЛёгкаяРешать
Бесплатно и без регистрации: пишете код в браузере и проверяете его тестами (без аккаунта — несколько задач в день).
Вопросы и ответы
- Что такое условие Фано?
- Ни один код не совпадает с началом другого кода. Тогда сообщение без разделителей читается однозначно.
- Как расшифровать сообщение руками?
- Так же, как программа: слева направо, отделяя первый подходящий код.
- Что если код записан в шестнадцатеричной системе?
- Сначала переведите каждую цифру в четыре двоичных разряда, затем расшифровывайте.
- Как посчитать способы расшифровки?
- Рекурсией по позиции в сообщении: от каждой позиции пробуйте все коды, с которых начинается остаток строки, и складывайте результаты.