Научись выполнять задание 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)Эти переменные уже доступны в редакторе. Используй их в решении.
Учебный CSV в рабочей папке
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, что и при импорте * в шпаргалке. Все варианты перебирать вручную и писать шесть вложенных циклов не нужно.
АПРЕЛЬ: собираем условия в один if
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)
breakbreak останавливает перебор сразу после ответа. Это допустимо: список уже идёт в нужном порядке, все предыдущие слова проверены. В шпаргалке программа печатает все подходящие номера; здесь добавлена остановка после первого, который и требуется.
Что происходит перед ответом
| number | s | Число П | Номер нечётный? | Результат |
|---|---|---|---|---|
| 7900 | ЕААПЛП | 2 | Нет | Пропускаем |
| 7901 | ЕААПЛР | 1 | Да | Пропускаем |
| 7902 | ЕААПЛЬ | 1 | Нет | Пропускаем |
| 7903 | ЕААППА | 2 | Да | Подходит |
Номер слова растёт всегда, count — только после отбора
Небольшой список: трёхбуквенные слова из А и Б. Требование — ровно две Б. Нажимай «Следующее слово» и следи за двумя разными числами.
| number | Слово | Две Б? | count после проверки |
|---|
Первое подходящее слово АББ имеет номер 4. Всего подходящих слов 3. Если перенести number += 1 внутрь if, номер АББ превратится в 1 — это уже нумерация отобранных слов, которой в условии нет.
Пять цифр, ровно один ноль и ограничения соседей
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 | Что проверяем |
|---|---|---|
| 20413 | 204** | Рядом с 0 стоят 2 и 4: можно. Нечётные 1 и 3 в другом месте разрешены. |
| 24013 | 240** | Есть 0*: нечётная цифра справа от 0, запрещено. |
| 31024 | **024 | Есть *0: нечётная цифра слева от 0, запрещено. |
| 24680 | 24680 | У нуля один сосед — 8. Он чётный, число подходит. |
| 02468 | 02468 | Соседство допустимо, но запись начинается с 0: не пятизначное число. |
'0*' not in masked запрещает нечётного соседа справа; '*0' not in masked — слева. Объединяем через and, чтобы запрет действовал в обе стороны. Проверка '**' not in masked здесь не нужна: нечётные цифры могут стоять рядом друг с другом.
4. Считаем только прошедшие все проверки числа
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 в десятичное число не требуется: все ограничения относятся к цифрам записи.
Независимая проверка ответа без перебора
Если единственный ноль стоит на второй, третьей или четвёртой позиции, два его соседа выбираются из 2, 4, 6, 8. Остальные две цифры — любые ненулевые из восьми. Получаем 3 × 4² × 8² = 3072.
Если ноль последний, слева 4 варианта чётной ненулевой цифры, остальные три позиции дают по 8 вариантов: 4 × 8³ = 2048. На первой позиции ноль запрещён. Итого 3072 + 2048 = 5120.
Проверяем соседние цифры через индексы
Можно обойтись без замены. Последовательно проверяем пары s[i] и s[i + 1]. Плохая пара — ноль и нечётная цифра в любом порядке.
| i | Пара индексов | Для s = 24013 | Запрещена? |
|---|---|---|---|
| 0 | 0 и 1 | 2 и 4 | Нет |
| 1 | 1 и 2 | 4 и 0 | Нет |
| 2 | 2 и 3 | 0 и 1 | Да |
| 3 | 3 и 4 | 1 и 3 | Нет: нуля в паре нет |
В пятизначной строке четыре соседние пары, поэтому цикл range(len(s) - 1) даёт i от 0 до 3. Если взять range(len(s)), последний i = 4 приведёт к обращению к несуществующему s[5].
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; здесь он переименован, чтобы не путать его с номером слова.
Почему запись проходит или не проходит отбор
Тренажёр проверяет условие пятизначного девятеричного примера. Введи запись цифрами 0–8: увидишь замену нечётных цифр, все четыре соседние пары и причины отказа.
| Индексы | Пара | 0 рядом с нечётной? |
|---|
Как найти ВОРОТА в алфавитном списке
Алфавит здесь АВОРТ, длина 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| number | s | s == ВОРОТА? |
|---|---|---|
| 4819 | ВОРОРР | Нет |
| 4820 | ВОРОРТ | Нет |
| 4821 | ВОРОТА | Да |
| 4822 | ВОРОТВ | Нет |
Как проверить номер другим способом?
Нумеруем буквы с нуля: А = 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. Первое слово по ограничениям
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Запусти программу в Python и проверь ответ ниже.
1. Какой ответ напечатала программа?
Введи итоговое число после запуска своего решения.
Сборка 2. Сколько четырёхзначных семеричных чисел?
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)Запусти программу в Python и проверь ответ ниже.
2. Какой ответ напечатала программа?
Введи итоговое число после запуска своего решения.
Сборка 3. Номер заданного слова
from itertools import product
number = ⟦1⟧
for word in product(⟦2⟧, repeat=⟦3⟧):
s = ⟦4⟧
number = ⟦5⟧
if s == ⟦6⟧:
print(number)
breakЗапусти программу в Python и проверь ответ ниже.
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 забылся, открой учебник, затем вернись к программе и допиши её самостоятельно.
Закрепи каждый из трёх типов
Реши по одному новому примеру из учебного архива с пустого файла. Перед запуском объясни себе, что считает каждая переменная и почему счётчик увеличивается именно в этом месте.