Тема 8. Комбинаторика

8.02 Подсчет количества слов/чисел

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела комбинаторика
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#65605

Жук составляет 5-буквенные слова, в которых есть только буквы Р, У, К, А, причём в словах нет двух рядом стоящих гласных или согласных букв. Каждая из допустимых букв может встречаться в слове любое количество раз или не встречаться совсем. Словом считается любая допустимая последовательность букв, не обязательно осмысленная. Сколько существует таких слов, которые может написать Жук?

Показать ответ и решение

Решение руками

Чтобы соблюсти условия, нам надо расставить гласные и согласные буквы в следующем порядке:

ГСГСГ либо СГСГС

Так как согласных и гласных букв у нас одинакове количество, то количество слов будет:

2⋅2 ⋅2⋅2⋅2 = 32⋅2 = 64

Решение через циклы:

Для решения задачи через циклы мы будем поэтапно формировать все 5-буквенные слова из букв ’РУКА’ и проверять условие: в слове не должно быть двух рядом стоящих гласных или согласных букв. Алгоритм реализуется следующим образом:

Сначала создаём строки для гласных gl = ’УА’ и согласных sogl = ’РК’. Создаём пустое множество count = set() для хранения уникальных слов.

Для упрощения перебора мы разделяем все слова на два вида:

1. Слова вида ГСГСГ (гласная, согласная, гласная, согласная, гласная) — перебираем все возможные комбинации, используя 5 вложенных циклов for, где каждая позиция выбирает букву из соответствующего набора (гласная или согласная). После формирования слова добавляем его в множество count.

2. Слова вида СГСГС (согласная, гласная, согласная, гласная, согласная) — аналогично формируем все комбинации с 5 вложенными циклами и добавляем в множество count.

После перебора всех вариантов выводим размер множества len(count), что и является количеством допустимых слов.

# Доступные буквы слова
a = ’РУКА’

# Гласные буквы
gl = ’УА’

# Согласные буквы
sogl = ’РК’

# Множество для хранения уникальных слов
count = set()

# Перебор букв для слов вида ГСГСГ
for x1 in gl:
    for x2 in sogl:
        for x3 in gl:
            for x4 in sogl:
                for x5 in gl:
                    # Формируем слово из выбранных букв
                    s = x1+x2+x3+x4+x5
                    # Добавляем слово в множество
                    count.add(s)

# Перебор букв для слов вида СГСГС
for x1 in sogl:
    for x2 in gl:
        for x3 in sogl:
            for x4 in gl:
                for x5 in sogl:
                    # Формируем слово из выбранных букв
                    s = x1+x2+x3+x4+x5
                    # Добавляем слово в множество
                    count.add(s)

# Выводим количество допустимых слов
print(len(count))

Решение через itertools:

Для упрощения перебора используем модуль itertools и функцию product, которая генерирует декартово произведение букв, т.е. все 5-буквенные комбинации из букв ’РУКА’.

1. Преобразуем кортеж x в строку s с помощью ’’.join(x).

2. Проверяем условие, что в слове нет рядом стоящих гласных или согласных. Для этого используем функцию all и генератор: для каждой пары соседних букв сравниваем принадлежность гласным (s[i] in gl) != (s[i+1] in gl). Если результат True для всех соседних пар, слово допустимо.

3. Добавляем допустимое слово в множество count.

После перебора всех комбинаций выводим размер множества len(count).

from itertools import product

# Гласные буквы
gl = ’УА’

# Множество для хранения уникальных слов
count = set()

# Перебор всех 5-буквенных комбинаций
for x in product(’РУКА’, repeat = 5):
    # Преобразуем кортеж в строку
    s = ’’.join(x)
    # Проверяем условие: нет рядом стоящих гласных или согласных
    if all((s[i] in gl) != (s[i+1] in gl) for i in range(len(s)-1)):
        # Добавляем слово в множество
        count.add(s)

# Выводим количество допустимых слов
print(len(count))

Ответ: 64

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

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

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!