Задача к ЕГЭ по информатике на тему «подсчет количества слов/чисел» №1

Максим придумывает 12-буквенные слова, состоящие из букв слова ЕВКЛИД. Сколько слов, содержащих комбинацию ЕВКЛИД, может составить Максим, если справа от этой комбинации находятся только гласные в обратном алфавитном порядке (больше 0), а слева равное количество (больше 0) гласных и согласных. Буквы в словах могут повторяться любое количество раз или же не встречаться вовсе.

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

Всего существует два варианта: когда справа от слова ЕВКЛИД 4 буквы, а слева 2; когда справа 2 буквы, а слева 4. Рассмотрим каждый из них.

1. Если справа 4 буквы, то есть 5 способов расставить гласные: ИИИИ, ИИИЕ, ИИЕЕ, ИЕЕЕ, ЕЕЕЕ. Если слева 2 буквы, то есть 16 способов расставить гласные и согласные – 2 ⋅4⋅2 = 16  . Получаем общее число для этого варианта: 5 ⋅16 = 80  .

2. Если справа 2 буквы, то есть 3 способа расставить гласные: ИИ, ИЕ, ЕЕ. Если слева 4 буквы, то есть 384 способа расставить гласные и согласные – 2⋅4 ⋅2⋅4⋅6 = 384  . Получаем общее число для этого варианта: 3 ⋅384 = 1152  .

Всего число вариантом слов: 80+ 1152 = 1232  .

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

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))

Ответ: 1232
Оцените статью
Я решу все!