Главная › ЕГЭ по информатике › Задание 8
ЕГЭ по информатике · задание №8

Задание 8: учимся решать перебором на Python

От условия к рабочему коду по шпаргалке: нумеруем слова, считаем числа и проверяем соседние цифры. Три подробных разбора, наглядные проверки и практика написания программ.

Пишем решение вместе

Научись выполнять задание 8 своим кодом

Пройди шаги: пойми действие, напиши строки, запусти Python и проверь значения. Затем реши задачу с пустого редактора.

Слова из ALPHABET длины LENGTH идут по алфавиту с номера 1. Найди первый нечётный номер слова, которое не начинается с букв BANNED и содержит LETTER не менее MIN_COUNT раз.

1. Получить первое слово

Импортируй product, получи первый вариант и склей его в s.

Product выдаёт кортеж. Join превращает его в строку, для которой доступны индексы и count.

Строки этого шага и порядок действий

from itertools import product

word = next(product(sorted('АПРЕЛЬ'), repeat=6))
s = ''.join(word)
Дано для запуска

Эти переменные уже доступны в редакторе. Используй их в решении.

Tab — 4 пробела для отступа · Ctrl+Enter — проверка · код сохраняется в этом браузере

Python работает в браузере. Первый запуск загружает среду и требует интернета; затем можно запускать и исправлять код здесь.

Вывод программы

Здесь появится вывод print.

Значения после выполнения

Запусти код, чтобы увидеть значения.

Скачать все учебные программы и условия этого задания

Видеоразбор

Видео по заданию №8

Видео скоро выйдет.

Шпаргалка, дополнительные разборы и упражнения
Сначала читаем вопрос

Как решать задание 8 ЕГЭ на Python

В задачах из этой шпаргалки нужно составлять слова или записи чисел, отбирать подходящие варианты и находить ответ. product берёт перебор на себя. Твоя работа — выбрать алфавит, длину и точно записать ограничения.

алфавит + длина→product→ строка s →проверки→ ответ

Номер в списке или количество подходящих?

Вопрос задачиЧто считаемГде увеличиваем счётчик
Под каким номером стоит первое подходящее слово?number — номер в полном спискеУ каждого слова до if. Печатаем первый подходящий номер и ставим break.
Сколько существует подходящих чисел или слов?count — количество прошедших отборТолько внутри всех проверок. Печатаем после полного перебора.
Под каким номером стоит конкретное слово?number — номер в полном спискеУ каждого слова до if. Сравниваем s с нужным словом.
Имена похожи, действия разныеs.count('П') считает буквы П внутри одного слова. Переменная count считает подходящие слова целиком. Переменная number считает строки полного списка, включая неподходящие.
Нужные строки из шпаргалки

Переводим условие в код

Что сказаноКак записатьНа что обратить внимание
Все шестибуквенные слова из А, П, Р, Е, Л, Ьproduct(sorted('АПРЕЛЬ'), repeat=6)Каждая позиция получает любую из шести букв. Буквы могут повторяться.
Алфавитный порядокsorted('АПРЕЛЬ') → А, Е, Л, П, Р, ЬДля этого набора порядок совпадает с алфавитным. Если в условии дан особый порядок, передай именно его.
Получить слово из текущего вариантаs = ''.join(word)Кортеж ('А', 'П', 'Р') превращается в строку 'АПР'.
Не начинается с А и с Лs[0] != 'А' and s[0] != 'Л'Можно короче: s[0] not in 'АЛ'. Здесь нужен and: обе буквы запрещены.
Не менее двух П / ровно две Пs.count('П') >= 2 / s.count('П') == 2«Не менее» разрешает и три, и четыре П.
Номер слова нечётныйnumber % 2 == 1Проверяем номер строки, а не количество букв.
Пятизначное девятеричное числоproduct('012345678', repeat=5) и s[0] != '0'Цифры от 0 до 8; начальный ноль отсекаем отдельно.
Нужное слово — ВОРОТАs == 'ВОРОТА'Сравниваем целую строку, а не наличие отдельных букв.

Почему product, а не permutations

product('АБ', repeat=3) выдаёт ААА, ААБ, АБА, АББ, БАА, БАБ, ББА, БББ. Повторы букв разрешены. permutations('АБВ', 3) переставляет три имеющихся элемента без повторного использования: АБВ, АВБ, БАВ и так далее. Выбирай по условию, можно ли брать букву заново. Если исходный набор сам содержит одинаковые буквы, permutations может выдавать одинаковые строки.

Для трёх разборов ниже достаточно from itertools import product. Это тот же product, что и при импорте * в шпаргалке. Все варианты перебирать вручную и писать шесть вложенных циклов не нужно.

Тип 1 · номер первого подходящего слова

АПРЕЛЬ: собираем условия в один if

Все шестибуквенные слова из букв А, П, Р, Е, Л, Ь записаны в алфавитном порядке и пронумерованы с 1. Найди номер первого слова с нечётным номером, которое не начинается с А или Л и содержит не менее двух букв П.

1. Задаём полный список

sorted('АПРЕЛЬ') даёт А, Е, Л, П, Р, Ь. В product первой меняется последняя позиция. Поэтому начало списка: АААААА, АААААЕ, АААААЛ, АААААП, АААААР, АААААЬ, ААААЕА.

2. Нумеруем каждое слово

number = 0
for word in product(sorted('АПРЕЛЬ'), repeat=6):
    s = ''.join(word)
    number += 1
    # Только теперь проверяем s и number

До цикла number = 0. Для первого слова сначала выполняется number += 1, поэтому его номер равен 1. Прибавление стоит на одном уровне с if: неподходящие слова тоже занимают места в исходном списке.

3. Соединяем четыре ограничения

ОграничениеПроверка
Первый символ не Аs[0] != 'А'
Первый символ не Лs[0] != 'Л'
Букв П минимум двеs.count('П') >= 2
Номер нечётныйnumber % 2 == 1

Нужны все четыре свойства одновременно, значит соединяем их через and. Запись s[0] != 'А' or s[0] != 'Л' ошибочна: она пропустит любую первую букву, ведь одна буква не может одновременно быть и А, и Л.

4. Печатаем первое совпадение

Полная программа · первый подходящий номер
from itertools import product

number = 0
for word in product(sorted('АПРЕЛЬ'), repeat=6):
    s = ''.join(word)
    number += 1
    if (s[0] != 'А' and s[0] != 'Л'
            and s.count('П') >= 2 and number % 2 == 1):
        print(number)
        break

break останавливает перебор сразу после ответа. Это допустимо: список уже идёт в нужном порядке, все предыдущие слова проверены. В шпаргалке программа печатает все подходящие номера; здесь добавлена остановка после первого, который и требуется.

Что происходит перед ответом

numbersЧисло ПНомер нечётный?Результат
7900ЕААПЛП2НетПропускаем
7901ЕААПЛР1ДаПропускаем
7902ЕААПЛЬ1НетПропускаем
7903ЕААППА2ДаПодходит
Ответ: 7903 — слово ЕААППАСлова перед этим номером не проходят все ограничения одновременно. Алфавит содержит 6 букв, длина равна 6: полный перебор содержит 6⁶ = 46 656 слов. Программа не требует подбирать произвольную верхнюю границу.
Посмотри, как меняются счётчики

Номер слова растёт всегда, count — только после отбора

Небольшой список: трёхбуквенные слова из А и Б. Требование — ровно две Б. Нажимай «Следующее слово» и следи за двумя разными числами.

Первое подходящее слово АББ имеет номер 4. Всего подходящих слов 3. Если перенести number += 1 внутрь if, номер АББ превратится в 1 — это уже нумерация отобранных слов, которой в условии нет.

Тип 2 · количество подходящих чисел

Пять цифр, ровно один ноль и ограничения соседей

Определи количество девятеричных пятизначных чисел, в записи которых ровно одна цифра 0, при этом никакая нечётная цифра не стоит рядом с цифрой 0.

1. Перечисляем допустимые цифры и длину

Девятеричная запись использует цифры 012345678. Пять разрядов задаёт repeat=5. Но product создаст и строки вида 02468: это ещё не пятизначное число. Поэтому добавляем s[0] != '0'.

2. Проверяем число нулей до проверки соседей

if s.count('0') == 1 and s[0] != '0':
    # Здесь ровно один 0, а первая цифра не 0

== 1 означает ровно один ноль. Условие >= 1 разрешило бы два и больше. Нули не нужны в отдельной переменной: s.count('0') считает их в текущей строке.

3. Заменяем нечётные цифры одним символом

Нечётные цифры в этом алфавите — 1, 3, 5, 7. Заменим их на * и сохраним в отдельной строке masked. Исходное s останется доступным для проверки и отладки.

Исходная запись sПосле замены maskedЧто проверяем
20413204**Рядом с 0 стоят 2 и 4: можно. Нечётные 1 и 3 в другом месте разрешены.
24013240**Есть 0*: нечётная цифра справа от 0, запрещено.
31024**024Есть *0: нечётная цифра слева от 0, запрещено.
2468024680У нуля один сосед — 8. Он чётный, число подходит.
0246802468Соседство допустимо, но запись начинается с 0: не пятизначное число.

'0*' not in masked запрещает нечётного соседа справа; '*0' not in masked — слева. Объединяем через and, чтобы запрет действовал в обе стороны. Проверка '**' not in masked здесь не нужна: нечётные цифры могут стоять рядом друг с другом.

4. Считаем только прошедшие все проверки числа

Способ 1 · замена нечётных цифр
from itertools import product

count = 0
for word in product('012345678', repeat=5):
    s = ''.join(word)
    if s.count('0') == 1 and s[0] != '0':
        masked = s.replace('1', '*').replace('3', '*').replace('5', '*').replace('7', '*')
        if '0*' not in masked and '*0' not in masked:
            count += 1
print(count)

count += 1 находится внутри двух if. print(count) стоит после цикла без отступа: нужен итог для всех чисел. break здесь не ставим, иначе посчитаем только часть вариантов. Переводить s в десятичное число не требуется: все ограничения относятся к цифрам записи.

Ответ: 5120Product перебирает 9⁵ = 59 049 строк, включая ведущие нули. Все проверки проходят 5120 пятизначных чисел.
Независимая проверка ответа без перебора

Если единственный ноль стоит на второй, третьей или четвёртой позиции, два его соседа выбираются из 2, 4, 6, 8. Остальные две цифры — любые ненулевые из восьми. Получаем 3 × 4² × 8² = 3072.

Если ноль последний, слева 4 варианта чётной ненулевой цифры, остальные три позиции дают по 8 вариантов: 4 × 8³ = 2048. На первой позиции ноль запрещён. Итого 3072 + 2048 = 5120.

Тот же тип · другой способ

Проверяем соседние цифры через индексы

Можно обойтись без замены. Последовательно проверяем пары s[i] и s[i + 1]. Плохая пара — ноль и нечётная цифра в любом порядке.

iПара индексовДля s = 24013Запрещена?
00 и 12 и 4Нет
11 и 24 и 0Нет
22 и 30 и 1Да
33 и 41 и 3Нет: нуля в паре нет

В пятизначной строке четыре соседние пары, поэтому цикл range(len(s) - 1) даёт i от 0 до 3. Если взять range(len(s)), последний i = 4 приведёт к обращению к несуществующему s[5].

Способ 2 · подсчёт запрещённых пар
from itertools import product

count = 0
for word in product('012345678', repeat=5):
    s = ''.join(word)
    if s.count('0') == 1 and s[0] != '0':
        bad_pairs = 0
        for i in range(len(s) - 1):
            if ((s[i] in '1357' and s[i + 1] == '0') or
                    (s[i + 1] in '1357' and s[i] == '0')):
                bad_pairs += 1
        if bad_pairs == 0:
            count += 1
print(count)

Два направления плохой пары соединены через or: достаточно встретить «нечётная → 0» либо «0 → нечётная». Внутри каждого направления стоит and, потому что оба свойства пары должны выполняться.

bad_pairs = 0 создаём заново для каждого s. Если после просмотра всех соседей он остался равен 0, увеличиваем общий count. В шпаргалке этот внутренний счётчик назван number; здесь он переименован, чтобы не путать его с номером слова.

Соседство здесь не кольцевоеПервая и последняя цифры не образуют пару. У нуля в конце только один сосед. Оба способа дают один и тот же ответ 5120 — выбери тот, который легче восстановить самостоятельно.
Проверь одно число

Почему запись проходит или не проходит отбор

Тренажёр проверяет условие пятизначного девятеричного примера. Введи запись цифрами 0–8: увидишь замену нечётных цифр, все четыре соседние пары и причины отказа.

Тип 3 · номер конкретного слова

Как найти ВОРОТА в алфавитном списке

Все шестибуквенные слова из букв А, В, О, Р, Т записаны в алфавитном порядке и пронумерованы с 1. Под каким номером стоит слово ВОРОТА?

Алфавит здесь АВОРТ, длина 6. Снова нужен номер каждой строки, поэтому number растёт перед if. Вместо набора ограничений достаточно сравнения s == 'ВОРОТА'.

Полная программа · номер слова ВОРОТА
from itertools import product

number = 0
for word in product(sorted('АВОРТ'), repeat=6):
    s = ''.join(word)
    number += 1
    if s == 'ВОРОТА':
        print(number)
        break
numberss == ВОРОТА?
4819ВОРОРРНет
4820ВОРОРТНет
4821ВОРОТАДа
4822ВОРОТВНет
Ответ: 4821Как только найдена строка ВОРОТА, печатаем её текущий номер. Break завершает уже выполненный поиск.
Как проверить номер другим способом?

Нумеруем буквы с нуля: А = 0, В = 1, О = 2, Р = 3, Т = 4. У слова ВОРОТА получаем 1, 2, 3, 2, 4, 0. Его номер с нуля равен 1 × 5⁵ + 2 × 5⁴ + 3 × 5³ + 2 × 5² + 4 × 5 = 4820. В условии счёт с 1, значит добавляем 1 и получаем 4821.

Если в новой задаче нужно найти слово по его номеру, меняется только проверка: if number == нужный_номер:, затем print(s) и break. Если нужен последний подходящий номер, ранняя остановка уже не годится: придётся просмотреть весь список и запомнить последнее совпадение.

От подсказок к самостоятельному коду

Собери три программы и проверь результат

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

«Проверить строки» сверяет фрагменты с разобранным шаблоном. Страница не исполняет введённый Python. Другие решения проверяй запуском в Python и по числовому ответу. Обычные одинарные и двойные кавычки и пробелы между частями выражения допустимы.

Решено: 0 из 12

Сборка 1. Первое слово по ограничениям

Все четырёхбуквенные слова из А, Б, В, Г записаны в алфавитном порядке и пронумерованы с 1. Найди номер первого слова с нечётным номером, которое не начинается с А и содержит не менее двух букв В.
from itertools import product

number = 0
for word in product(⟦1⟧, repeat=⟦2⟧):
    s = ⟦3⟧
    number += 1
    if ⟦4⟧ and ⟦5⟧ and ⟦6⟧:
        print(number)
        break

1. Какой ответ напечатала программа?

Введи итоговое число после запуска своего решения.

Сборка 2. Сколько четырёхзначных семеричных чисел?

Посчитай четырёхзначные числа в системе с основанием 7. В записи ровно один 0; ни слева, ни справа от него нет нечётной цифры. Нечётные цифры здесь 1, 3, 5.
from itertools import product

count = 0
for word in product('0123456', repeat=⟦1⟧):
    s = ''.join(word)
    if ⟦2⟧ and ⟦3⟧:
        masked = ⟦4⟧
        if ⟦5⟧ and ⟦6⟧:
            count += 1
print(count)

2. Какой ответ напечатала программа?

Введи итоговое число после запуска своего решения.

Сборка 3. Номер заданного слова

Все четырёхбуквенные слова из К, О, Р, Т записаны в алфавитном порядке и пронумерованы с 1. Под каким номером стоит слово ТОРТ?
from itertools import product

number = ⟦1⟧
for word in product(⟦2⟧, repeat=⟦3⟧):
    s = ⟦4⟧
    number = ⟦5⟧
    if s == ⟦6⟧:
        print(number)
        break

3. Какой ответ напечатала программа?

Введи итоговое число после запуска своего решения.

Девять коротких проверок понимания

Ответ можно исправить и проверить повторно.

4. Номер в полном списке

Все двухбуквенные слова из А, Б, В идут в алфавитном порядке с номера 1. Какой номер у БА?

5. Количество слов

Сколько трёхбуквенных слов из А и Б содержат ровно две Б?

6. Первый подходящий номер

В том же списке трёхбуквенных слов из А и Б под каким номером стоит первое слово с ровно двумя Б?

7. Цифры системы счисления

Какова наибольшая цифра девятеричной записи?

8. Нечётные цифры далеко от нуля

Подходит ли запись 20413 под условие второго разбора? Ответь «да» или «нет».

9. Две стороны соседства

Подходит ли 31024? Ответь «да» или «нет».

10. Сколько соседних пар?

Сколько раз выполнится цикл for i in range(len(s) - 1), если в s пять символов?

11. Начальный ноль

Можно ли засчитать запись 02468 как пятизначное девятеричное число? Ответь «да» или «нет».

12. Можно ли остановиться?

В задаче требуется количество всех подходящих чисел. Можно ли поставить break после первого count += 1? Ответь «да» или «нет».

Теперь с чистого листа

Скачать код и задания для практики в Python

Четыре готовые программы к трём разборам: первый номер, два способа проверки соседей и номер ВОРОТА. В папке practice — три условия для самостоятельного написания, в solutions — решения для сверки после попытки.

Скачать учебные файлы PythonНужен обычный Python 3. Ввод данных и дополнительные библиотеки не требуются: itertools входит в стандартную библиотеку.

Порядок работы: прочитай вопрос → выбери number или count → задай алфавит и длину → перенеси каждое ограничение в if → проверь один вариант вручную → запусти полный перебор.

Если ответ не совпадает

ПроблемаЧто исправить
Номер заметно меньше ожидаемогоВынеси number += 1 из if: нумероваться должны все слова.
Все номера сдвинуты на 1Начни с number = 0 и увеличивай до проверки. Первая строка должна иметь номер 1.
Первое слово отличается от начала списка в условииПроверь порядок символов в алфавите: product сохраняет именно его.
Повторяющиеся буквы исчезлиДля слов с разрешёнными повторами нужен product, а не permutations.
Посчитаны записи с начальным нулёмДобавь s[0] != '0' для многозначного числа.
Запрещено слишком много чиселНечётные цифры могут соседствовать друг с другом; запрещено только соседство нечётной с 0.
Одна сторона нуля проверяется, другая пропускаетсяПроверь обе пары: '0*' и '*0'; соедини запреты через and.
Проверка пар падает в конце строкиИспользуй range(len(s) - 1), чтобы i + 1 не вышел за строку.
После одного плохого числа следующие тоже отвергаютсяОбнуляй bad_pairs внутри внешнего цикла для каждой новой строки.
Выводится много промежуточных количествПоставь print(count) после внешнего цикла, без отступа.

Для поиска ошибки временно выводи print(number, s) перед if в задаче о номере. В задаче о соседях проверь одну строку из таблицы: выведи s и masked либо bad_pairs. Затем убери отладочную печать и оставь только ответ.

Вопросы по заданию 8

Всегда ли нужен sorted?

Product выдаёт варианты в порядке символов переданного алфавита. В двух буквенных примерах из шпаргалки sorted даёт нужный порядок. Если условие задаёт свой порядок символов, сохраняй его. Не записывай один и тот же символ в алфавите несколько раз: одинаковые элементы могут породить одинаковые варианты повторно.

Можно ли вместо number использовать enumerate?

Да: for number, word in enumerate(product(...), start=1). Тогда отдельные number = 0 и number += 1 не нужны. Сначала полезно освоить развёрнутый шаблон из шпаргалки, чтобы понимать, какие слова получают номера.

Почему начало слова — s[0], а первая строка имеет номер 1?

Это разные счёты. Индексы символов в Python начинаются с 0. Нумерация слов дана в условии с 1, поэтому её ведём отдельной переменной.

Как узнать, что перебраны все варианты?

Product с repeat=n перебирает все записи длины n из заданного алфавита. Для k разных символов это k**n вариантов. Список заранее создавать не нужно: проходи по product циклом, как в примерах. С ростом длины число вариантов растёт быстро; перед запуском оцени k**n.

Нужно ли здесь повторять весь курс программирования?

Для этих решений достаточно разобранных строк перебора и проверок. Если конкретный приём Python забылся, открой учебник, затем вернись к программе и допиши её самостоятельно.

Закрепи каждый из трёх типов

Реши по одному новому примеру из учебного архива с пустого файла. Перед запуском объясни себе, что считает каждая переменная и почему счётчик увеличивается именно в этом месте.