Максим придумывает 12-буквенные слова, состоящие из букв слова ЕВКЛИД. Сколько слов, содержащих комбинацию ЕВКЛИД, может составить Максим, если справа от этой комбинации находятся только гласные в обратном алфавитном порядке (больше 0), а слева равное количество (больше 0) гласных и согласных. Буквы в словах могут повторяться любое количество раз или же не встречаться вовсе.
Решение руками
Всего существует два варианта: когда справа от слова ЕВКЛИД 4 буквы, а слева 2; когда справа 2 буквы, а слева 4. Рассмотрим каждый из них.
1. Если справа 4 буквы, то есть 5 способов расставить гласные: ИИИИ, ИИИЕ, ИИЕЕ, ИЕЕЕ, ЕЕЕЕ. Если слева 2 буквы, то есть 16 способов расставить гласные и согласные – . Получаем общее число для этого варианта:
.
2. Если справа 2 буквы, то есть 3 способа расставить гласные: ИИ, ИЕ, ЕЕ. Если слева 4 буквы, то есть 384 способа расставить гласные и согласные – . Получаем общее число для этого варианта:
.
Всего число вариантом слов: .
Решение через циклы
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
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)
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)
print(len(count))