Задание №8 ЕГЭ информатика: перечисления, нумерация слов, Python

Задание №8 ЕГЭ по информатике: перечисления и нумерация слов на Python

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

1. Условие задачи

Все пятибуквенные слова, составленные из букв А, К, Ц, Е, Н, Т, записаны в алфавитном порядке и пронумерованы.

Вот начало списка:

1. ААААА
2. ААААЕ
3. ААААК
4. ААААН
5. ААААТ
6. ААААЦ
……

Определите, под каким номером в этом списке стоит первое слово с чётным номером, которое не начинается с букв А, Е или К и при этом содержит в своей записи не менее одной буквы Т.

2. Что нужно понять перед решением

Первое. Алфавитный порядок букв — это не тот порядок, в котором они перечислены в условии. Смотрим на начало списка: ААААА, ААААЕ, ААААК, ААААН, ААААТ, ААААЦ. Значит, порядок такой:

А, Е, К, Н, Т, Ц
Именно в этой строке и будем перебирать буквы.

Второе. Слова нумеруются с 1. Значит, в программе счётчик нужно начинать с 1, а не с 0.

Третье. Условие состоит из трёх частей, которые должны выполняться одновременно:
  • номер чётный;
  • первая буква не А, не Е и не К;
  • в слове есть хотя бы одна буква Т.

3. Решение 1: вложенные циклы

Самый прямолинейный способ — перебрать все комбинации пятью вложенными циклами и посчитать их счётчиком.

s = "АЕКНТЦ"
not_s = "АЕК"
c = 0
for x1 in s:
    for x2 in s:
        for x3 in s:
            for x4 in s:
                for x5 in s:
                    c += 1
                    x = x1 + x2 + x3 + x4 + x5
                    if (c % 2 == 0) and (x1 not in not_s) and (x.count("Т") >= 1):
                        print(c, x)
Разбор по шагам

Шаг 1. Задаём алфавит в правильном порядке:
s = "АЕКНТЦ"
Шаг 2. Запоминаем буквы, с которых слово начинаться не должно:
not_s = "АЕК"
Шаг 3. Заводим счётчик:
c = 0
Шаг 4. Пять вложенных циклов перебирают все возможные комбинации. Каждая переменная x1…x5 — это одна буква будущего слова. Поскольку циклы вложены, комбинации перебираются именно в алфавитном порядке — как в условии.

Шаг 5. На каждой итерации увеличиваем счётчик и склеиваем слово:
c += 1
x = x1 + x2 + x3 + x4 + x5
Шаг 6. Проверяем условие:
if (c % 2 == 0) and (x1 not in not_s) and (x.count("Т") >= 1):
    print(c, x)
Важный момент
Этот код выводит все подходящие слова, а не только первое. Если запустить его, на экране будет список. Первая строка этого списка и есть ответ.
Если вы хотите, чтобы программа остановилась сразу после первого найденного слова (а нам нужно именно первое), добавьте break:
if (c % 2 == 0) and (x1 not in not_s) and (x.count("Т") >= 1):
    print(c, x)
    break
Но учтите: break выйдет только из самого внутреннего цикла. Чтобы остановить всё полностью, нужно либо использовать флаг, либо перейти ко второму решению — там break работает как надо.

Ответ: 3914.

4. Решение 2: itertools.product

Второй способ — использовать библиотеку itertools, а точнее функцию product. Она делает то же самое, что наши пять вложенных циклов, но в одну строку.

from itertools import product

s = "АЕКНТЦ"
not_s = "АЕК"
for c, tup in enumerate(product(s, repeat=5), start=1):
    x = ''.join(tup)
    if (c % 2 == 0) and (tup[0] not in not_s) and ('Т' in x):
        print(c, x)
        break
Разбор по шагам

Шаг 1. Подключаем product:
from itertools import product
Шаг 2. product(s, repeat=5) создаёт все комбинации из 5 букв, взятых из строки s. Порядок такой же, как при вложенных циклах, — алфавитный.

Шаг 3. enumerate(..., start=1) даёт нам сразу и номер, и комбинацию. Первая комбинация получает номер 1 — как в условии.

Шаг 4. ''.join(tup) склеивает кортеж букв в строку:
('А', 'А', 'А', 'А', 'А')  →  'ААААА'
Шаг 5. Проверяем условие. Здесь tup[0] — это первая буква, а 'Т' in x проверяет наличие буквы Т в слове.

Шаг 6. break останавливает цикл сразу после первого найденного слова — именно то, что нам нужно.

Ответ: 3914.

5. Плюсы и минусы

Сравнение способов перебора

Главное преимущество product — он избавляет от необходимости писать много вложенных циклов. Для слова из 8 букв пришлось бы писать 8 циклов, а product справляется одной строкой.

Главный недостаток product — нужно помнить про repeat, enumerate и join. Если забыть ''.join(tup), то x будет кортежем, и методы строки (например, .count()) не сработают.

6. Что запомнить

  1. Алфавитный порядок — смотрим на начало списка, а не на порядок букв в условии.
  2. Нумерация с 1 — используем start=1 в enumerate или начинаем счётчик с 0 и увеличиваем до проверки.
  3. Условие из нескольких частей — соединяем через and.
  4. break — останавливает перебор, но во вложенных циклах работает только для самого внутреннего.

Нужна помощь с подготовкой?

Я — Олег Алексеевич, репетитор по информатике. Готовлю к ЕГЭ более 15 лет.

На своих занятиях мы:

  • разбираем структуру экзамена и стратегии решения;
  • пишем код на Python так, чтобы он работал с первого раза;
  • отрабатываем сложные задания 26 и 27 на реальных примерах.

Хотите попробовать? Запишитесь на первое занятие — познакомимся, определим ваш уровень и составим план подготовки.

Переходите на мой сайт, чтобы узнать подробности и записаться: Репетиторы рядом

Made on
Tilda