8.02 Подсчет количества слов/чисел
Ошибка.
Попробуйте повторить позже
Суперкомпьютер для разминки генерирует тройки слов. Первое слово имеет длину 5 и состоит из букв слова ПИРОГ, в нём каждая буква может встречаться любое количество раз, при этом буква Р может стоять только после буквы О. Второе слово имеет длину 4 и состоит из цифр шестеричной системы счисления. Третье слово имеет также длину 4 и состоит из цифр пятеричной системы счисления. Причём количество чётных цифр во втором и третьем словах должно быть одинаковым и они не могут начинаться с 0.
Необходимо найти общее число троек, которое может составить Суперкомпьютер.
Идея решения через циклы:
Мы разбиваем задачу на три части: первое слово из букв "ПИРОГ второе слово из цифр шестиричной системы и третье слово из цифр пятеричной системы.
1. Для первого слова длиной 5 букв из "ПИРОГ"проверяем условие: буква "Р"может стоять только после буквы "О". Мы формируем все комбинации с повторениями и считаем количество подходящих слов, удовлетворяющих этому условию.
2. Для второго и третьего слов проверяем два условия одновременно:
- числа не могут начинаться с 0,
- количество чётных цифр во втором и третьем словах должно совпадать.
После подсчёта допустимых слов для каждой части мы перемножаем результаты, чтобы получить общее число троек.
Решение через циклы:
a = "ПИРОГ" # Символы первого слова b = "012345" # Символы второго слова (шестеричная система) c = "01234" # Символы третьего слова (пятеричная система) count1 = 0 # Счётчик для первого слова count23 = 0 # Счётчик для второй и третьей частей # Генерация всех 5-буквенных слов первого слова for x1 in a: # 1-я буква for x2 in a: # 2-я буква for x3 in a: # 3-я буква for x4 in a: # 4-я буква for x5 in a: # 5-я буква s = x1 + x2 + x3 + x4 + x5 # Собираем слово # Проверяем условие для буквы "Р": она идёт только после "О" if s.count("Р") == s.count("ОР"): count1 += 1 # Увеличиваем счётчик подходящих слов # Генерация всех 4-значных чисел второго слова for x1 in "12345": # первая цифра не равна "0" for x2 in b: for x3 in b: for x4 in b: s1 = x1 + x2 + x3 + x4 # Собираем число второго слова # Генерация всех 4-значных чисел третьего слова for x5 in "1234": # первая цифра не равна "0" for x6 in c: for x7 in c: for x8 in c: s2 = x5 + x6 + x7 + x8 # Собираем число третьего слова # Считаем количество чётных цифр во втором числе m1 = [i for i in s1 if int(i) % 2 == 0] # Считаем количество чётных цифр в третьем числе m2 = [i for i in s2 if int(i) % 2 == 0] # Проверяем условие равенства количества чётных цифр if len(m1) == len(m2): count23 += 1 # Увеличиваем счётчик print(count1 * count23) # Перемножаем результаты для общего числа троек
Идея решения через itertools:
Для более компактного решения используем функцию product из модуля itertools.
1. Генерируем все 5-буквенные слова первого слова с повторениями, проверяем условие для "Р".
2. Генерируем все 4-значные комбинации второго слова и 4-значные комбинации третьего слова с учётом, что первая цифра не равна "0".
3. Для проверки количества чётных цифр используем замену всех чётных цифр на "0"и сравниваем их количество в двух словах.
После подсчёта допустимых слов для каждой части перемножаем результаты.
Решение через itertools:
from itertools import product # Импортируем функцию product s1 = "ПИРОГ" # Символы первого слова cnt1 = 0 # Счётчик для первого слова # Генерация всех 5-буквенных слов первого слова for i in product(s1, repeat=5): word = "".join(i) # Преобразуем кортеж в строку if word.count("Р") == word.count("ОР"): # Проверка условия для "Р" cnt1 += 1 s2 = "012345" # Символы второго слова (шестеричная система) s3 = "01234" # Символы третьего слова (пятеричная система) cnt23 = 0 # Счётчик для второго и третьего слов # Генерация всех 4-значных чисел второго слова for i in product(s2, repeat=4): i = "".join(i) if i[0] != "0": # Первая цифра не равна 0 # Генерация всех 4-значных чисел третьего слова for j in product(s3, repeat=4): j = "".join(j) if j[0] != "0": # Первая цифра не равна 0 # Замена всех чётных цифр на "0" для удобства подсчёта i_even = i.replace("2", "0").replace("4", "0") j_even = j.replace("2", "0").replace("4", "0") # Проверка равенства количества чётных цифр if i_even.count("0") == j_even.count("0"): cnt23 += 1 print(cnt1 * cnt23) # Перемножаем результаты для общего числа троек
Специальные программы

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

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

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

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

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

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