8.02 Подсчет количества слов/чисел
Ошибка.
Попробуйте повторить позже
Максим придумывает 12-буквенные слова, состоящие из букв слова ЕВКЛИД. Сколько слов, содержащих комбинацию ЕВКЛИД, может составить Максим, если справа от этой комбинации находятся только гласные в обратном алфавитном порядке (больше 0), а слева равное количество (больше 0) гласных и согласных. Буквы в словах могут повторяться любое количество раз или же не встречаться вовсе.
Решение аналитически:
Всего существует два варианта: когда справа от слова ЕВКЛИД 4 буквы, а слева 2; когда справа 2 буквы, а слева 4. Рассмотрим каждый из них.
1. Если справа 4 буквы, то есть 5 способов расставить гласные: ИИИИ, ИИИЕ, ИИЕЕ, ИЕЕЕ, ЕЕЕЕ. Если слева 2
буквы, то есть 16 способов расставить гласные и согласные – . Получаем общее число для этого варианта:
.
2. Если справа 2 буквы, то есть 3 способа расставить гласные: ИИ, ИЕ, ЕЕ. Если слева 4 буквы, то есть 384
способа расставить гласные и согласные – . Получаем общее число для этого варианта:
.
Всего число вариантом слов: .
Решение программой с помощью циклов:
Напишем программу для перебора всевозможных 6-буквенных слов из заданных букв. Для этого организуем
вложенных циклов (по одному на каждую позицию в слове). Каждый цикл перебирает буквы заданной строки,
формируя все возможные комбинации. Запишем количество подходящих слов.
count = set() # Множество подходящих слов # Идея решения заключается в том, чтобы исключить условие из задачи про ЕВКЛИД в слове, считая, по умолчанию, что оно выполнено. Таким образом, мы сокращаем перебор и уменьшаем время выполнения программы. # Есть две вариации слова, которое удовлетворяет всем условиям: **ЕВКЛИД**** и ****ЕВКЛИД**, то есть 2 буквы слева и 4 справа или 4 буквы слева и 4 справа gl = "ЕИ" # Гласные к задаче sogl = "ВКЛД" # Согласные к задаче a = "ЕВКЛИД" # Алфавит к задаче for x1 in a: for x2 in a: for x3 in gl: for x4 in gl: for x5 in gl: for x6 in gl: s1 = x1+x2 s2 = x3+x4+x5+x6 # Если количество гласных равно количеству согласных в первой части if len([i for i in s1 if i in gl]) == len([i for i in s1 if i in sogl]): # Если гласные идут в обратном алфавитном порядке во второй части if all(s2[i] >= s2[i + 1] for i in range(len(s2) - 1)): count.add(s1 + s2) # Соединим слово и добавим в список for x1 in a: for x2 in a: for x3 in a: for x4 in a: for x5 in gl: for x6 in gl: s1 = x1+x2+x3+x4 s2 = x5+x6 # Если количество гласных равно количеству согласных в первой части if len([i for i in s1 if i in gl]) == len([i for i in s1 if i in sogl]): # Если гласные идут в обратном алфавитном порядке во второй части if all(s2[i] >= s2[i + 1] for i in range(len(s2) - 1)): count.add(s1 + s2) # Соединим слово и добавим в список print(len(count)) # Выведем нужную длину
Решение программой с помощью модуля itertools:
Для решения задачи с помощью модуля itertools воспользуемся функцией product. Она генерирует все возможные слова из заданного алфавита. Запишем количество подходящих слов.
from itertools import product count = set() # Множество подходящих слов gl = "ЕИ" # Гласные к задаче sogl = "ВКЛД" # Согласные к задаче a = "ЕВКЛИД" # Алфавит к задаче # Идея решения заключается в том, чтобы исключить условие из задачи про ЕВКЛИД в слове, считая, по умолчанию, что оно выполнено. Таким образом, мы сокращаем перебор и уменьшаем время выполнения программы. # Есть две вариации слова, которое удовлетворяет всем условиям: **ЕВКЛИД**** и ****ЕВКЛИД**, то есть 2 буквы слева и 4 справа или 4 буквы слева и 4 справа for x1 in product(a,repeat = 2): # Перебираем буквы для левой части for x2 in product(gl,repeat = 4): # Перебираем гласные буквы для правой части s1 = "".join(x1) s2 = "".join(x2) # Если количество гласных равно количеству согласных в первой части if len([i for i in s1 if i in gl]) == len([i for i in s1 if i in sogl]): # Если гласные идут в обратном алфавитном порядке во второй части if all(s2[i] >= s2[i + 1] for i in range(len(s2) - 1)): count.add(s1 + s2) # Соединим слово и добавим в список for x1 in product(a,repeat = 4): # Перебираем буквы для левой части for x2 in product(gl,repeat = 2): # Перебираем гласные буквы для правой части s1 = "".join(x1) # join объединяет буквы s2 = "".join(x2) # join объединяет буквы # Если количество гласных равно количеству согласных в первой части if len([i for i in s1 if i in gl]) == len([i for i in s1 if i in sogl]): if all(s2[i] >= s2[i + 1] for i in range(len(s2) - 1)): # Если гласные идут в обратном алфавитном порядке во второй части count.add(s1 + s2) # Соединим слово и добавим в список print(len(count)) # Выведем нужную длину
Специальные программы

Программа
лояльности v2.0
Приглашай друзей в Школково и получай вознаграждение до 10%!

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

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

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

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

Вернём деньги за курс
за твою сотку на ЕГЭ
Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!