Задание №8 ЕГЭ по информатике: разбор, шаблоны кода Python и анти-примеры | СмартКИМ
СмартКИМ УДОБНАЯ ПОДГОТОВКА К ЕГЭ И ОГЭ
Задачи №8 Решать в тренажере Войти в СмартКИМ
ЕГЭ (1–27) ОГЭ (1–15) Python: шпаргалка
Быстрый переход по номерам и темам
Базовый (1 балл) Время: 2-4 мин Python itertools.product itertools.permutations Все задачи №8 в каталоге

Задание №8. Комбинаторика, перестановки и слова по порядку

Тема: Модуль itertools (product, permutations), правила подсчета слов и алфавитные списки
Подсчёт количества допустимых слов или определение номера слова в алфавитном списке с ограничениями на повторы и соседние буквы. Решается за 10 строк на Python.

Что от тебя хотят

Дан алфавит из пары-тройки букв и правила вроде «длина 6, буква А ровно один раз, две гласные подряд нельзя». Нужно либо посчитать, сколько слов подходит, либо найти номер слова в списке «как в словаре». Формулы с сочетаниями и размещениями тоже работают, но на экзамене в них легко ошибиться на ровном месте. У компьютера такой проблемы нет.

Идея: пусть компьютер перебирает

Слов обычно от тысяч до нескольких миллионов, для Python это меньше секунды. Поэтому задача сводится к трём шагам: сгенерировать все слова, отфильтровать по условию, посчитать или найти нужное.

Что нужно Чем генерировать
Буквы могут повторяться («слова», «коды») product(алфавит, repeat=N)
Каждая буква ровно один раз («перестановки», «анаграммы») permutations(слово)
Нужен номер слова в словаре счётчик n += 1 + отсортированный алфавит

Разбор на живом примере

Игорь составляет кодовые слова длины 6 из букв М, А, С, Л, О, причём буква С встречается ровно один раз. Слово не должно начинаться с гласной и оканчиваться согласной. Сколько различных кодовых слов может использовать Игорь?

product выдаёт кортежи вида ('М', 'А', 'С', ...), поэтому каждый кортеж склеиваем в строку через "".join. Дальше условия из задачи переписываются почти дословно: s.count("С") == 1, первая буква s[0] not in "АО", последняя s[-1] in "АО". Ответ: 1536.

Как искать номер слова

Все пятибуквенные слова из букв Ф, О, К, У, С записаны в алфавитном порядке и пронумерованы. Под каким номером в списке идёт последнее слово, которое не содержит букв Ф и содержит ровно две буквы У?

Самое важное правило: алфавит надо отсортировать до генерации. product выдаёт слова в том порядке, в каком лежат буквы, поэтому при отсортированном алфавите список автоматически получается «как в словаре». Нумерация в задачах всегда с единицы, поэтому счётчик n увеличивается до проверки слова: первое слово получает номер 1, а не 0. Это та самая ошибка «на единицу», из-за которой теряют балл при верной идее. «Последнее слово» значит, что номер не печатаем сразу, а запоминаем и выводим после цикла. Ответ: 2313.

Для слов с повторами. Слово из задачи не обязательно состоит из разных букв. Если в «ТАТЬЯНА» три буквы А и две Т, то permutations честно выдаст 5040 перестановок, из которых уникальных слов всего 1260. Поэтому ответ нужно считать по set.

Разновидности и прототипы задания на экзамене

Тип 1: Номер слова в алфавитном списке
Алфавит сортируется через sorted, слова перебираются через product, а номер ведёт обычный счётчик n.
Тип 2: Количество слов с ограничениями на буквы
Гласные/согласные не стоят рядом или буква встречается не более N раз.
Тип 3: Анаграммы (перестановки permutations)
Перестановка букв слова без повторений с фильтрацией через set.
Тип 4: Числа в n-ичных системах счисления
N-значные числа в СС с основанием 5–9 с ограничениями на соседние цифры.
Тип 5: Слова с чётными/нечётными номерами
Подсчёт слов с фильтрацией по чётности индекса в алфавитном списке.

Код решения на Python

Запустить код в онлайн-песочнице
Сколько слов подходит под условие
from itertools import product

k = 0
for p in product("МАСЛО", repeat=6):
    s = "".join(p)
    if s.count("С") == 1 and s[0] not in "АО" and s[-1] in "АО":
        k += 1
print(k)
Под каким номером слово стоит в списке «как в словаре»
from itertools import product

alf = sorted("ФОКУС")
n = 0
for p in product(alf, repeat=5):
    n += 1
    s = "".join(p)
    if "Ф" not in s and s.count("У") == 2:
        last = n
print(last)

Типичные ошибки

✕ Не так
Забыть про sorted()
product('ФОКУС', repeat=5) выдаст слова в порядке букв «Ф, О, К, У, С», а не алфавитном. Номер получится неверным.
✓ Так
alf = sorted('ФОКУС'), и уже её отдаём в product.
✕ Не так
Начать нумерацию с нуля
Если n увеличивать после проверки слова, ответ окажется на единицу меньше.
✓ Так
Сначала n += 1, потом проверка. В задачах нумерация всегда с первого слова.
ГРОБ

ГРОБ №8: буква Ё

sorted('ЁЖЕ') выдаст ['Ё', 'Е', 'Ж']: в таблице символов Ё стоит перед А, а не после Е. Если в алфавите задачи есть Ё, нумерация слов съедет.

Как обойти
Сортируй по своему алфавиту: sorted(alf, key=lambda c: 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'.index(c)). Для задач без Ё (их большинство) достаточно обычного sorted.

Лайфхаки на экзамене

  1. Условие «гласные не стоят рядом»: замени все гласные в слове на одну букву, например «г», и проверь, что 'гг' not in s. Так не придётся перебирать пары руками.
  2. Прежде чем гнать перебор, прикинь размер: len(алфавит) ** N. Тысяч и даже нескольких миллионов слов Python не заметит, а сотни миллионов уже придётся считать математически.
  3. Сначала прогони код на упрощённом условии, где ответ можно посчитать пальцами (например, слова длины 2), и сравни с головой.
Банк реальных задач №8 Открыть в тренажере СмартКИМ