Задание номер 8 — задание базового уровня сложности, выполнение которого предполагает знание о методах измерения количества информации и не требует использования специального ПО.
Зачастую в номере 8 мы можем встретить задания связанные с комбинаторикой — перестановками, количеством вариантов выборки и т.д. Для решения заданий такого типа можно приспособить модуль itertools языка python.
Сразу оговорюсь, что я не рекомендую решать задание именно таким способом. Я советую проверять свой ответ, полученный ручным решением. Написанная программа не должна быть единственным вариантом решения.
Модуль itertools доступен в питоне «из коробки», т.е. его нет необходимости устанавливать дополнительно. А значит, он будет доступен на экзамене.
Ссылка на документацию по модулю https://docs.python.org/3/library/itertools.html
Использованные в данной статье методы и функции доступны как минимум с версии питона 3.6
Для импорта необходимых функции необходимо их импортировать из модуля
from itertools import product, permutations
- product
Позволяет получить прямое, или декартово произведеение двух множеств — множество, элементами которого являются все возможные упорядоченные пары элементов исходных множеств.
a = ‘AB’
b = ‘CD’
print(*product(a, b))
(‘A’, ‘C’) (‘A’, ‘D’) (‘B’, ‘C’) (‘B’, ‘D’)
Получение произведения двух множеств не очень актуально в 8 задании, но мы можем использовать другую возможность функции product: получение всевозможных комбинаций определенной длины для одного множества.
a = ‘AB’
print(*product(a, repeat=3))
(‘A’, ‘A’, ‘A’) (‘A’, ‘A’, ‘B’) (‘A’, ‘B’, ‘A’) (‘A’, ‘B’, ‘B’) (‘B’, ‘A’, ‘A’) (‘B’, ‘A’, ‘B’) (‘B’, ‘B’, ‘A’) (‘B’, ‘B’, ‘B’)
Мы получили всевозможные комбинации длины 3 для набора из двух букв АВ. Причем результат работы функции — набор кортежей.
Параметр repeat отвечает за длину слова.
Из полученных наборов мы можем выбрать подходящие для нас. Например, так можно решить задание из демоверсии 2021.
Длина слова здесь 3, а набор букв — ШКОЛА. Получим всевозможные комбинации:
a = ‘ШКОЛА’
comb = product(a, repeat=3))
Осталось выбрать те, где буква К встречается ровно 1 раз.
Поскольку подсчет количества вхождений в кортеж организовать сложнее, чем в строке, здесь элементы кортежа «склеиваются» по пустой строке, образуя тем самым не кортеж, а строку. Метод count подсчитывает количество вхождений подстроки ‘K’.
Этот же код можно оформить в одну строку через списочное выражение
print(len([item for item in product(‘ШКОЛА’, repeat=3) if ”.join(item).count(‘К’) == 1]))
2. permutations
Позволяет получить всевозможные перестановки.
print(*permutations(‘ABC’))
(‘A’, ‘B’, ‘C’) (‘A’, ‘C’, ‘B’) (‘B’, ‘A’, ‘C’) (‘B’, ‘C’, ‘A’) (‘C’, ‘A’, ‘B’) (‘C’, ‘B’, ‘A’)
Это опять набор кортежей.
Рассмотрим такое задание с сайта kpolyakov.spb.ru
Получаем перестановки
a = ‘КАПКАН’
comb = permutations(a)
И отбираем нужные варианты
Поскольку в слове КАПКАН есть повторяющиеся буквы А и К, мы должны поделить итоговое количество на 4 (дважды поделить на 2), поскольку с нашей точки зрения эти комбинации неотличимы друг от друга.
Другой способ убрать повторяющиеся комбинации — превратить набор перестановок в множество, которое в питоне исключает повторы
Так-же можно написать решение в одну строку
print(len([i for i in set(permutations(‘КАПКАН’)) if all(i[j] != i[j + 1] for j in range(5))]))
Подведем итог. Задачи на составление слов путем выбора букв из набора или путем перестановки букв в слове можно решить с использованием модуля itertools. Написание кода не займет много времени, зато будет уверенность в ручном решении.
Учитель информатики высшей
категории Жевтило Ирина Аскольдовна
МБОУ «Лицей «Дубна»
Использование
библиотеки itertools при решении задач ЕГЭ по информатике
В встроенном в Python модуле itertools существует
ряд комбинаторных функций. Рассмотрим некоторые из них:
· product() –
прямое произведение одного или нескольких итераторов.
· permutations() –
перестановки и размещения элементов множества.
Данная библиотека позволяет
решать задачи с комбинаторикой, упрощая программу решения.
Вызов модуля itertools:
from itertools import *
Данный модуль можно
использовать для решения задач №8 ЕГЭ по информатике.
Примеры заданий и способы
использования данного модуля.
Пример 1. МАРИНА из букв своего имени составляет слова перестановкой
исходных букв. Сколько различных слов может составить МАРИНА, если первая буква
не может быть гласной?
Аналитический способ решения
Общее количество слов с
учетом, что в слове две буквы «А» (перестановка этих букв не дает нового слова)
Вычтем количество слов,
начинающихся с гласной с учетом 2 букв «А»:
|
Позиция в слове |
* |
* |
* |
* |
* |
* |
|
Количество букв |
3 (МРН) |
5 |
4 |
3 |
2 |
1 |
Получаем =180 слов
Итого: 360 – 180 = 180
Программа для решения данной
задачи:
from itertools import *
a=’МАРИНА‘
k=0
for i in set(permutations(a)):
s=».join(i)
if s[0] not in ‘АИ‘:
k+=1
print(k)
В программе
используем
1) функцию:
permutations(a), т.к. слова составляются
перестановкой букв;
2)
используем множества (set), чтобы слова не повторялись;
3) в условии проверяем отсутствие гласных в начале слова.
Пример 2. Используем функцию product
Миша составляет
5-буквенные коды из букв К, А, Л, Ь, К, А. Каждая допустимая гласная буква
может входить в код не более одного раза. Сколько кодов может составить Миша?
Аналитический способ решения
Количество слов без «А»
3*3*3*3*3= 35 =243
Количество слов с одной «А»
5 вариантов *3*3*3*3 = 405
Итого: 243 + 405 = 648
Программа для решения данной
задачи:
from itertools import*
a=’КАЛЬ’
k=0
for i in product(a, repeat=5):
s=».join(i)
if s.count(‘А’)<=1 :
k+=1
print (k)
В программе
используем
1) функцию
product (a, repeat=5):
, т.к. буквы в слове могут повторяться;
2) в условии проверяем количество гласных не более 1.
На уроке рассматривается разбор 8 задания ЕГЭ по информатике про измерение количества информации
8-е задание: «Измерение количества информации»
Уровень сложности
— базовый,
Требуется использование специализированного программного обеспечения
— нет,
Максимальный балл
— 1,
Примерное время выполнения
— 4 минуты.
Проверяемые элементы содержания: Знание о методах измерения количества информации
До ЕГЭ 2021 года — это было задание № 10 ЕГЭ
Типичные ошибки и рекомендации по их предотвращению:
«При использовании способа решения со системой счисления с основанием N следует помнить, что слова в списке нумеруются с единицы, поэтому числу 0 будет соответствовать первое слово»
ФГБНУ «Федеральный институт педагогических измерений»
Содержание:
- Объяснение темы
- Измерение количества информации
- Двоичное кодирование сообщений (равновероятностные события)
- Количество различных сообщений в алфавите разной мощности
- Количество сообщений при различном вхождении (встречаемости) букв
- Дополнительные формулы
- Тренировочные задания 8 ЕГЭ по информатике и их решение
- Сколько вариантов шифра или кодовых слов
- Перестановка букв в слове (каждая буква 1 раз)
- Сколько существует n-значных чисел, записанных в m-ной системе счисления
- Список в алфавитном порядке
- Вероятность событий
Объяснение темы
Рассмотрим кратко необходимые для решения 8 задания ЕГЭ понятия и формулы.
Измерение количества информации
- Кодирование — это представление информации в форме, удобной для её хранения, передачи и обработки. Правило преобразования информации к такому представлению называется кодом.
- 1 бит – это количество информации, которое можно передать с помощью одного знака в двоичном коде (0 или 1).
- Алфавит — это набор знаков, используемый в том или ином языке.
- Мощность алфавита — это количество используемых в алфавите знаков.
- Сообщение — это любая последовательность символов какого-либо алфавита.
1 байт (bytе) = 8 бит
1 Кб (килобайт) = 1024 байта
1 Мб (мегабайт) = 1024 Кб
1 Гб (гигабайт) = 1024 Мб
1 Тб (терабайт) = 1024 Гб
1 Пб (петабайт) = 1024 Тб
8 = 23
1024 = 210
Рассмотрим еще несколько определений:
Мощность алфавита
Для вычисления количества информации применяются несколько различных формул в зависимости от ситуации:
Двоичное кодирование сообщений (равновероятностные события)
При вычислении количества информации в сообщении для равновероятностных событий, общее количество которых равно N, используется формула:
N = 2L
* следует иметь в виду, что также приняты следующие обозначения: Q = 2k
Пример 2: Зашифруем буквы А, Б, В, Г при помощи двоичного кодирования равномерным кодом и посчитаем количество возможных сообщений:

Решение:
Таким образом, мы получили равномерный код, т.к. длина каждого кодового слова одинакова для всех кодовых слов (L = 2).
Количество сообщений длиной L битов:
N = 2L
Т.е. количество сообщений длиной 2 бита, как в примере с нашими буквами, будет равно N = 22 = 4
Ответ: 4
Количество различных сообщений в алфавите разной мощности
Рассмотрим вариант с 5 буквами (мощность алфавита = 5), которые надо разместить в сообщении длиной 2 символа:
Найдем формулу для нахождения количества различных сообщений в алфавите различной мощности:
Если мощность некоторого алфавита составляет N, то количество различных сообщений длиной L знаков:
- N – мощность алфавита
- L – длина сообщения
- Q – количество различных сообщений
Пример: Сколько существует всевозможных трехбуквенных слов в английском языке?
Решение:
В английском алфавите 26 букв. Значит, мощность алфавита = 26. Длина сообщения = 3. Найдем по формуле количество трехбуквенных слов:
Q = 263
или
26
*
26
*
26
= 17576
Ответ: 17576
N = n1 * n2 * … * nL
Количество сообщений при различном вхождении (встречаемости) букв
В таком случае можно использовать формулу для вычисления числа перестановок с повторениями; для двух разных символов она выглядит так:
[ P = frac{na+n*!}{na!n*!} ]
na – количество букв a n* — количество звёздочек или кол-во вариантов
Иногда в заданиях 8 можно использовать формулу комбинаторики для проверки полученных результатов перебора. Число сочетаний из n элементов по k элементов:
[ C{binom{k}{n}}= frac{n!}{k!(n-k)!} ]
n! = 1 * 2 * 3 * … * n
Пример: Сколько существует всевозможных четырехбуквенных слов в алфавите из 4 букв: А, Б, В, Г, если известно, что буква А встречается ровно два раза?
Решение:
- Длина сообщения = 4. Мощность алфавита = 4. Но мешает условие: буква А встречается ровно два раза.
- В таких заданиях можно использовать способ перебора всевозможных вариантов:
два раза буква А, на остальных местах - одна из трех оставшихся букв: А А 3 3 = 3 * 3 = 32 = 9 А 3 А 3 = 9 А 3 3 А = 9 3 А А 3 = 9 3 А 3 А = 9 3 3 А А = 9
Число сочетаний из n элементов по k элементов:
[ C{binom{k}{n}}= frac{n!}{k!(n-k)!} ]
[ C{binom{2}{4}}= frac{4!}{2!(4-2)!} = frac{24}{2*2} = 6 ]
* Факториал числа n! = 1 * 2 * 3 *..* n
6 * 9 = 54
Дополнительные формулы
Количество информации и равновероятные события
При определении количества информации для равновероятностных событий могут понадобиться две формулы:
x = log2(1/p)
p(A) = m / n
Количество информации и неравновероятные события
При использовании неравновероятного события, вероятность которого равна p, для вычисления количества информации используется формула:
i = -[log2p]
*квадратные скобки означают ближайшее целое, меньшее или равное значению выражения в скобках
Формула Хартли:
Формула Хартли
Алфавитный подход:
Информационный объем сообщения длиной L:
Алфавитный подход
Плейлист видеоразборов задания на YouTube:
Задание демонстрационного варианта 2022 года ФИПИ
Сколько вариантов шифра или кодовых слов
Cartesian(n) — метод расширения последовательности, возвращающий декартову степень множества символов |
Когда применяется: Если требуется полный перебор вариантов букв для каждой позиции (каждая буква может встречаться в кодовом слове любое количество раз) |
||||||
|---|---|---|---|---|---|---|---|
| Пример: Сравним полный перебор букв слова «школа», размещенных на две позиции: |
|||||||
| Pascal | PascalABC.NET | ||||||
|
|
||||||
| Результат: | |||||||
|
[ш,ш] [ш,к] [ш,о] [ш,л] [ш,а] [к,ш] [к,к] [к,о] Итого 25 штук (5*5) |
[ш,ш] [ш,к] [ш,о] [ш,л] [ш,а] [к,ш] [к,к] [к,о] [к,л] [к,а] [о,ш] [о,к] [о,о] [о,л] [о,а] [л,ш] [л,к] [л,о] [л,л] [л,а] [а,ш] [а,к] [а,о] [а,л] [а,а] |
||||||
Permutations — метод возвращает все перестановки множества элементов, заданного массивом или последовательностью |
Когда применяется: Если требуется перестановка букв в слове. То есть количество каждой буквы в словах сохраняется, и каждая буква встречается только 1 раз |
||||||
| Пример: Сравним перестановку букв слова «мимикрия»: |
|||||||
| Pascal | PascalABC.NET | ||||||
|
|
|
||||||
| Результат: | |||||||
|
[М,И,М,И,К,Р,И,Я] [М,И,М,И,К,Р,Я,И] [М,И,М,И,К,И,Р,Я] [М,И,М,И,К,И,Я,Р] [М,И,М,И,К,Я,Р,И] [М,И,М,И,К,Я,И,Р] [М,И,М,И,Р,К,И,Я] [М,И,М,И,Р,К,Я,И] … |
Используются также следующие запросы и методы LINQ:
Фильтрация последовательностей (Where)
Метод Count([Type -> boolean]) Вычисление скаляра
Метод CountOf(s: Type) — Возвращает количество элементов, равных указанному значению
Метод First() — Возвращает первый элемент последовательности.
Метод Last() — Возвращает последний элемент последовательности.
Метод Pairwise(Self: sequence of T; func: (T,T)->Res) — Превращает последовательность в последовательность пар соседних элементов, применяет func к каждой паре полученных элементов и получает новую последовательность
8_1:
Шифр кодового замка представляет собой последовательность из пяти символов, каждый из которых является цифрой от 1 до 6.
Сколько различных вариантов шифра можно задать, если известно, что цифра 1 должна встречаться в коде ровно 1 раз, а каждая из других допустимых цифр может встречаться в шифре любое количество раз или не встречаться совсем?
Типовые задания для тренировки
✍ Решение:
✎ Решение теоретическое:
- Формула нахождения количества различных сообщений:
- Итак, что у нас дано из этой формулы:
- Длина сообщения (L) = 5 символов
- Мощность алфавита (N) = 6 (цифры от 1 до 6).
- Но так как цифра 1 встречается по условию ровно один раз, а остальные 5 цифр — любое количество раз, то будем считать, что N = 5 (цифры от 2 до 6, исключая 1). Т.е. возьмем вариант, когда 1 стоит на первом месте, а остальные 5 цифр размещаем на 4 позиции:
Q = NL
1 5 5 5 5 - 1 * Q = 54 = 625
✎ 1 способ. Найдем количество вариантов методом перебора:
1 5 5 5 5 -1 * Q=54= 625 5 1 5 5 5 -1 * Q=54= 625 5 5 1 5 5 -1 * Q=54= 625 5 5 5 1 5 -1 * Q=54= 625 5 5 5 5 1 -1 * Q=54= 625
✎ 2 способ. Найдем количество вариантов при помощи формулы комбинаторики:
[ C{binom{4}{5}}= frac{5!}{4!(5-4)!} = 5 ]
625 * 5 = 3125
Результат: 3125
✎ Решение с использованием программирования:
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
PascalABC.net (использование LINQ, быстрое решение):
* LINQ (Language Integrated Query) — язык интегрированных запросов |
||
Python:
|
||
| С++: |
Детальный теоретический разбор задания 8 ЕГЭ по информатике предлагаем посмотреть в видеоуроке:
📹 YouTube здесьздесь (теоретическое решение)
8_2:
Шифр кодового замка представляет собой последовательность из пяти символов, каждый из которых является либо буквой (A или B) или цифрой (1, 2 или 3).
Сколько различных вариантов шифра можно задать, если известно, что в коде присутствует ровно одна буква, а все другие символы являются цифрами?
✍ Решение:
-
✎ Решение теоретическое:
- Формула нахождения количества различных сообщений:
- Посчитаем количество возможных шифров для одного из вариантов (например, когда буквы находятся на первой позиции). Так как цифры (1, 2, 3) могут занимать 4 позиции из пяти, а две буквы (А и В) одну из позиций, значит:
Q = NL
Q = 2 * 34 = 162
AB 123 123 123 123 = 162
"2" означает одна из двух букв: А или B, "3" - одна из трех цифр: 2 3 3 3 3 -> Q = 2 * 34 = 162 3 2 3 3 3 -> Q = 2 * 34 = 162 3 3 2 3 3 -> Q = 2 * 34 = 162 3 3 3 2 3 -> Q = 2 * 34 = 162 3 3 3 3 2 -> Q = 2 * 34 = 162
5 * 162 = 810
Результат: 810
✎ Решение с использованием программирования:
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
PascalABC.net (использование LINQ, быстрое решение):
Cartesian(5) — метод расширения последовательности, возвращающий декартову степень множества символов, т.е. в нашем случае перебор 5-знаковых слов из заданных символов * LINQ (Language Integrated Query) — язык интегрированных запросов |
||
Python:
|
||
| С++: |
Подробное теоретическое решение данного задания предлагаем посмотреть на видео:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
8_3:
Олег составляет таблицу кодовых слов для передачи сообщений, каждому сообщению соответствует своё кодовое слово. В качестве кодовых слов Олег использует 4-буквенные слова, в которых есть только буквы A, Б, В, Г, Д и Е, причём буква Г появляется ровно 1 раз и только на первом или последнем месте. Каждая из других допустимых букв может встречаться в кодовом слове любое количество раз или не встречаться совсем.
Сколько различных кодовых слов может использовать Олег?
✍ Решение:
-
✎ Решение теоретическое:
- Вспомним формулу получения количества возможных вариантов слов:
- где n1 — количество вариантов выбора первой буквы, n2 — количество вариантов выбора второй буквы и т.п.
- Рассмотрим варианты, когда буква Г встречается на первом или последнем месте:
N = n1 * n2 * n3 * … * nL = nL
Г ? ? ? = 1 * 5 * 5 * 5 = 53 = 125 ? ? ? Г = 5 * 5 * 5 * 1 = 53 = 125
125 + 125 = 250
Результат: 250
✎ Решение с использованием программирования:
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
PascalABC.net (использование LINQ, быстрое решение):
Cartesian(4) — метод расширения последовательности, возвращающий декартову степень множества символов, т.е. в нашем случае перебор 4-знаковых слов из заданных символов * LINQ (Language Integrated Query) — язык интегрированных запросов |
||
Python:
|
||
| С++: |
Видеоразбор данного задания (теоретический способ):
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
8_4:
Шифр кодового замка представляет собой последовательность из пяти символов, каждый из которых является одной из букв X, Y или Z.
Сколько различных вариантов шифра можно задать, если известно, что буква X должна встречаться в коде ровно 2 раза, а каждая из других допустимых букв может встречаться в шифре любое количество раз или не встречаться совсем?
Типовые задания для тренировки
✍ Решение:
-
✎ Решение теоретическое:
- Формула нахождения количества различных сообщений:
- Итак, что у нас дано из этой формулы:
- Начальная мощность алфавита (N) = 3 (буквы X, Y, Z). Но так как буква X встречается ровно два раза, то мы ее рассмотрим отдельно, а остальные 2 буквы — встречаются любое количество раз, значит, будем считать, что:
Q = NL
N = 3 - 1 = 2 (Y и Z)
(L) = 5 - 2 = 3 символа (остальные два символа отведем на размещение X)
X X ? ? ? -> 12 * Q = 23 = 8
✎1 способ. Перебор всех вариантов:
X X ? ? ? - 12 * Q = 23 = 8 X ? X ? ? - 12 * Q = 23 = 8 X ? ? X ? - 12 * Q = 23 = 8 X ? ? ? X - 12 * Q = 23 = 8 ? X X ? ? - 12 * Q = 23 = 8 ? X ? X ? - 12 * Q = 23 = 8 ? X ? ? X - 12 * Q = 23 = 8 ? ? X X ? - 12 * Q = 23 = 8 ? ? X ? X - 12 * Q = 23 = 8 ? ? ? X X - 12 * Q = 23 = 8
✎ 2 способ. При помощи формулы поиска числа сочетаний:
[ C{binom{k}{n}}= frac{n!}{k!(n-k)!} ]
Число сочетаний из n элементов по k элементов:
[ C{binom{2}{5}}= frac{5!}{2!(5-2)!} = frac{120}{12} = 10 ]
* Факториал числа: n! = 1 * 2 * 3 * .. * n
8 * 10 = 80
* задание достаточно решить одним из способов!
Результат: 80
✎ Решение с использованием программирования:
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
PascalABC.net (использование LINQ, быстрое решение):
Cartesian(5) — метод расширения последовательности, возвращающий декартову степень множества символов, т.е. в нашем случае перебор 5-знаковых слов из заданных символов * LINQ (Language Integrated Query) — язык интегрированных запросов |
||
Python:
|
||
| С++: |
Детальный теоретический разбор задания 8 ЕГЭ по информатике теоретическим способом предлагаем посмотреть в видеоуроке:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
8_5:
Сколько слов длины 5, начинающихся с согласной буквы и заканчивающихся гласной буквой, можно составить из букв ОСЕНЬ? Каждая буква может входить в слово несколько раз. Слова не обязательно должны быть осмысленными словами русского языка.
Типовые задания для тренировки
✍ Решение:
-
✎ Решение теоретическое:
- Из букв слова ОСЕНЬ имеем 2 гласных буквы (О, Е) и 2 согласных буквы (С, Н). Буква мягкий знак «нейтральна».
- Подсчитаем количество букв на каждой из 5 позиций:
2 5 5 5 2 СН все все все ОЕ
N = n1 * n2 * n3 * … * nL = nL
N = 2 * 5 * 5 * 5 * 2 = 500
✎ Решение с использованием программирования:
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
PascalABC.net (использование LINQ, быстрое решение):
* LINQ (Language Integrated Query) — язык интегрированных запросов |
||
Python:
|
||
| С++: |
Результат: 500
Разбор можно также посмотреть на видео (теоретическое решение):
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
8_6:
Вася составляет 4-буквенные слова, в которых есть только буквы Л, Е, Т, О, причём буква Е используется в каждом слове хотя бы 1 раз. Каждая из других допустимых букв может встречаться в слове любое количество раз или не встречаться совсем.
✍ Решение:
-
✎ Решение теоретическое:
- Количество вариантов различных слов вычислим по формуле:
- n1 — количество вариантов выбора первой буквы и т.п.
- Рассмотрим все варианты расположения буквы Е:
✎ 1 способ:
N = n1 * n2 * n3 * …
где
1. Е ? ? ? или 2. ? Е ? ? или 3. ? ? Е ? или 4. ? ? ? Е Где вопросительный знак означает любую букву из Л, Е, Т, О.
Е ? ? ? = 1 * 4 * 4 * 4 = 64 т.е. на первой позиции - только 1 буква - Е, на каждой последующей - одна из четырех букв Л, Е, Т, О.
? Е ? ? = 3 * 1 * 4 * 4 = 48
? ? Е ? = 3 * 3 * 1 * 4 = 36
? ? ? Е = 3 * 3 * 3 * 1 = 27
64 + 48 + 36 + 27 = 175
Результат: 175
✎ 2 способ:
- Так как по условию буква Е встретится хотя бы 1 раз, значит, можно утверждать, что не может быть такого, чтобы буква Е не встретилась бы ни одного раза.
- Таким образом, рассчитаем случай, когда буква Е встречается все 4 раза (т.е. все случаи) и отнимем от результата невозможный случай: когда буква Е не встретится ни одного раза:
1. Буква Е используется 4 раза (т.е. на всех позициях): 4 * 4 * 4 * 4 = 256 2. Буква Е не используется совсем (т.е. только 3 буквы): 3 * 3 * 3 * 3 = 81
256 - 81 = 175
Результат: 175
✎ Решение с использованием программирования:
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
PascalABC.net (использование LINQ, быстрое решение):
Cartesian(4) — метод расширения последовательности, возвращающий декартову степень множества символов, т.е. в нашем случае перебор 4-знаковых слов из заданных символов * LINQ (Language Integrated Query) — язык интегрированных запросов |
||
Python:
|
||
| С++: |
Теоретическое решение задания 8 смотрите в видеоуроке:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
8_7:
Вася составляет 4-буквенные слова, в которых есть только буквы К, А, Т, Е, Р, причём буква Р используется в каждом слове хотя бы 2 раза. Каждая из других допустимых букв может встречаться в слове любое количество раз или не встречаться совсем.
✍ Решение:
-
✎ Решение теоретическое:
- Количество возможных вариантов слов вычислим по формуле:
- где n1 — количество вариантов выбора первой буквы, n2 — количество вариантов выбора второй буквы и т.п.
- Сначала по формуле получим все варианты для всех пяти букв, включая букву Р:
N = n1 * n2 * n3 * … * nL = nL
5 * 5 * 5 * 5 = 54 = 625
4 * 4 * 4 * 4 = 44 = 256
р ? ? ? = 1 * 4 * 4 * 4 = 43 ? р ? ? = 4 * 1 * 4 * 4 = 43 ? ? р ? = 4 * 4 * 1 * 4 = 43 ? ? ? р = 4 * 4 * 4 * 1 = 43 Получим 43 * 4 = 256
625 - 256 - 256 = 113
✎ Решение с использованием программирования:
PascalABC.net (традиционный):
|
||
PascalABC.net (LINQ):
|
||
Python:
|
||
| С++: |
Результат: 113
Теоретическое решение 8 задания предлагаем посмотреть в видеоуроке:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
8_8:
Олег составляет таблицу кодовых слов для передачи сообщений, каждому сообщению соответствует своё кодовое слово. В качестве кодовых слов Олег использует 5-буквенные слова, в которых есть только буквы A, Б, В, и Г, причём буква Г появляется не более одного раза и только на последнем месте. Каждая из других допустимых букв может встречаться в кодовом слове любое количество раз или не встречаться совсем.
Сколько различных кодовых слов может использовать Олег?
✍ Решение:
-
✎ Решение теоретическое:
- Вспомним формулу получения количества возможных вариантов слов:
- где n1 — количество вариантов выбора первой буквы,
- n2 — количество вариантов выбора второй буквы и т.п.
- Так как буква Г появляется не более одного раза и только на последнем месте, значит, она может либо появиться 1 раз на последнем месте, либо не появиться совсем.
- Рассмотрим варианты, когда буква Г встречается 1 раз на последнем месте и встречается 0 раз:
N = n1 * n2 * n3 * … * nL = nL
1 раз: ? ? ? ? Г = 3 * 3 * 3 * 3 * 1 = 34 = 81 0 раз: ? ? ? ? ? = 3 * 3 * 3 * 3 * 3 = 35 = 243
81 + 243 = 324
✎ Решение с использованием программирования:
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
PascalABC.net (использование LINQ, быстрое решение):
Cartesian(5) — метод расширения последовательности, возвращающий декартову степень множества символов, т.е. в нашем случае перебор 5-знаковых слов из заданных символов * LINQ (Language Integrated Query) — язык интегрированных запросов |
||
| Python: | ||
| С++: |
Результат: 324
8_9:
Вася составляет 4-буквенные слова, в которых есть только буквы К, О, М, А, Р, причём буква А используется в них не более 3-х раз. Каждая из других допустимых букв может встречаться в слове любое количество раз или не встречаться совсем. Словом считается любая допустимая последовательность букв, необязательно осмысленная.
✍ Решение:
-
✎ Решение теоретическое:
- Вспомним формулу получения количества возможных вариантов слов:
- где n1 — количество вариантов выбора первой буквы,
- n2 — количество вариантов выбора второй буквы и т.п.
- Так как буква А по условию используется не более 3-х раз, это значит, что она используется либо 3 раза, либо 2 раза, либо 1 раз, либо не используется совсем. Рассмотрим все эти варианты отдельно.
- 1. Буква А используется 3 раза:
N = n1 * n2 * n3 * … * nL = nL
А А А _ -> 1 * 1 * 1 * 4 = 4 А А _ А -> 1 * 1 * 4 * А = 4 А _ А А -> 1 * 4 * 1 * 1 = 4 _ А А А -> 4 * 1 * 1 * 1 = 4
_ может быть любая из 4 букв: К О М Р. Значит, имеем:4 * 4 = 16 вариантов
А А _ _ -> 1 * 1 * 4 * 4 = 16 А _ А _ -> 1 * 4 * 1 * 4 = 16 А _ _ А -> 1 * 4 * 4 * 1 = 16 _ А А _ -> 4 * 1 * 1 * 4 = 16 _ А _ А -> 4 * 1 * 4 * 1 = 16 _ _ А А -> 4 * 4 * 1 * 1 = 16
_ может быть любая из 4 букв: К О М Р. Значит имеем:16 * 6 = 96 вариантов
А _ _ _ -> 1 * 4 * 4 * 4 = 64 _ А _ _ -> = 64 _ _ А _ -> = 64 _ _ _ А -> = 64
64 * 4 = 256 вариантов
_ _ _ _ -> 44 = 256
16 + 96 + 256 + 256 = 624
✎ Решение с использованием программирования:
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
PascalABC.net (использование LINQ, быстрое решение):
Cartesian(4) — метод расширения последовательности, возвращающий декартову степень множества символов, т.е. в нашем случае перебор 4-знаковых слов из заданных символов * LINQ (Language Integrated Query) — язык интегрированных запросов |
||
Python:
|
||
| С++: |
Результат: 624
Теоретическое решение смотрите также на видео:
📹 YouTube здесьздесь (теоретическое решение)
8_10:
Сколько существует различных символьных последовательностей длины 3 в четырёхбуквенном алфавите {A,B,C,D}, если известно, что одним из соседей A обязательно является D, а буквы B и C никогда не соседствуют друг с другом?
✍ Решение:
✎ Решение теоретическое:
- Вспомним формулу получения количества возможных вариантов слов:
- где n1 — количество вариантов выбора первой буквы,
- n2 — количество вариантов выбора второй буквы и т.п.
- Будем рассматривать варианты, расставляя каждую букву последовательно по алфавиту, начиная с первой буквы. При этом будем учитывать указанные ограничения для букв А, B и С:
N = n1 * n2 * n3 * … * nL = nL
Начинаем с A: A D 4ABCD = 1 * 1 * 4 = 4 Начинаем с B: B A D, B B 2BD, B D 4ABCD = 7 Начинаем с C: C A D, C C 2CD, C D 4ABCD = 7 Начинаем с D: D A 3BCD, D B 2BD, D C 2CD, D D 4ABCD = 11
4 + 7 + 7 + 11 = 29
Результат: 29
Видеоурок демонстрирует подробное теоретическое решение задания:
📹 YouTube здесьздесь (теоретическое решение)
8_22:
Лена составляет 5-буквенные слова из букв Я, С, Н, О, В, И, Д, Е, Ц, причём слово должно начинаться с согласной и заканчиваться гласной. Первая и последняя буквы слова встречаются в нем только один раз; остальные буквы могут повторяться.
Сколько слов может составить Лена?
✍ Решение:
✎ Решение с использованием программирования:
PascalABC.net (использование LINQ, быстрое решение):
|
||
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
| Python: | ||
| С++: |
Результат: 6860
Использование метода Pairwise()
8_11:
Из букв С, Р, Е, Д, А составляются трехбуквенные комбинации по следующему правилу – в комбинации не может быть подряд идущих гласных и одинаковых букв.
Например, комбинации ААР или ЕСС не являются допустимыми.
Сколько всего комбинаций можно составить, используя это правило?
✍ Решение:
-
✎ Решение теоретическое:
- Рассмотрим два варианта: когда слово начинается с гласной буквы, и когда оно начинается с согласной.
1. С гласной:
1.1 2 3 2 = 2 * 3 * 2 = 12 гл с с 1.2 2 3 2 = 2 * 3 * 2 = 12 гл с гл
2. С согласной:
2.1 3 2 2 = 3 * 2 * 2 = 12 с с с 2.2 3 2 3 = 3 * 2 * 3 = 18 с гл с 2.3 3 2 2 = 3 * 2 * 2 = 12 с с гл
12 + 12 + 12 + 18 + 12 = 66
✎ Решение с использованием программирования:
PascalABC.net (использование LINQ, быстрое решение):
|
||
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
Python:
|
||
| С++: |
Результат: 66
Перестановка букв в слове (каждая буква 1 раз)
8_12:
Дано слово КОРАБЛИКИ. Таня решила составлять новые 5-буквенные слова из букв этого слова по следующим правилам:
1) слово начинается с гласной буквы;
2) гласные и согласные буквы в слове должны чередоваться;
3) буквы в слове не должны повторяться.
✍ Решение:
-
✎ Решение теоретическое:
- Учтем, что в слове КОРАБЛИКИ две буквы К и две И.
- Всего в слове 4 гласных, но поскольку две буквы
И, то необходимо считать только 3 гласных. - Всего в слове 5 согласных, однако две из них — буквы
К, поэтому считать следует 4 согласных. - Посчитаем количество согласных и гласных для каждой из 5 позиций слова, учитывая, что с каждой последующей буквой количество используемых гласных/согласных уменьшается. Под позициями приведем пример букв:
гл с гл с гл 3 4 2 3 1 оаи крбл оа крб и
3 * 4 * 2 * 3 * 1 = 72
Результат: 72
✎ Решение с использованием программирования:
PascalABC.net (использование LINQ, быстрое решение):
|
||
| Python: | ||
| С++: |
Результат: 72
8_21:
Ксюша составляет слова, меняя местами буквы в слове МИМИКРИЯ.
Сколько различных слов, включая исходное, может составить Ксюша?
✍ Решение:
-
✎ Решение с использованием программирования:
PascalABC.net (приближенный к традиционному, долгое решение):
Смысл решения в использовании типа множества ( |
||
PascalABC.net (использование LINQ, быстрое решение):
* LINQ (Language Integrated Query) — язык интегрированных запросов |
||
| Python: | ||
| С++: |
Ответ: 3360
Подробное решение программным способом смотрите на видео:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (программное решение)
8_19:
Петя составляет шестибуквенные слова
перестановкой букв
слова АДЖИКА. При этом он избегает слов с двумя подряд одинаковыми буквами. Сколько всего различных слов может составить Петя?
Типовые задания для тренировки
✍ Решение:
-
✎ Решение теоретическое:
- Посчитаем количество слов без двух подряд одинаковых букв. Будем считать относительно буквы А, которых две в заданном слове АДЖИКА. Буквы не могут повторяться, поэтому их кол-во в каждом варианте будет уменьшается:
А*А*** = 4*3*2*1 = 24 слова с данным расположением буквы А. А**А** = 4*3*2*1 = 24 А***А* = 4*3*2*1 А****А = ... *А*А** *А**А* *А***А **А*А* **А**А ***А*А
10 * 24 = 240
✎ Решение с использованием программирования:
PascalABC.net (приближенный к традиционному, долгое решение):
Смысл решения в использовании типа — множества ( |
||
PascalABC.net (использование LINQ, быстрое решение):
|
||
| Python: | ||
| С++: |
Ответ: 240
8_20:
Маша составляет 7-буквенные коды из букв В, Е, Н, Т, И, Л, Ь. Каждую букву нужно использовать
ровно 1 раз
, при этом код буква Ь не может стоять на последнем месте и между гласными. Сколько различных кодов может составить Маша?
Типовые задания для тренировки
✍ Решение:
-
✎ Решение теоретическое:
- Выполним задание следующим образом: 1. посчитаем общее количество слов, не учитывая никакие ограничения. 2. Затем посчитаем случаи, которые необходимо исключить. 3. Вычтем из результата пункта 1 результат пункта 2.
- Общее количество независимо от ограничений (учтем, что буквы не должны повторяться):
7 6 5 4 3 2 1 - количество возможных вариантов букв на семи позициях ИТОГО: 7! = 5040 слов
6 5 4 3 2 1 Ь = 6! = 720
И Ь Е 4 3 2 1 = 24 варианта Так как буквы смещаются по всем позициям, то получим (4 И Ь Е 3 2 1, ...): 24 * 5 = 120 Е Ь И 4 3 2 1 = 24 варианта 24 * 5 = 120
5040 - 720 - 120 - 120 = 4080
✎ Решение с использованием программирования:
Стоит заметить, что теоретическое решение занимает меньше времени, чем программный способ!
PascalABC.net (приближенный к традиционному, долгое решение):
|
||
PascalABC.net (использование LINQ, быстрое решение):
|
||
| Python: | ||
| С++: |
Ответ: 4080
8_23:
Артур составляет 6-буквенные коды перестановкой букв слова ВОРОТА. При этом нельзя ставить рядом две гласные.
Сколько различных кодов может составить Артур?
✍ Решение:
✎ Решение с использованием программирования:
PascalABC.net (использование LINQ, спортивное прогр-е):
* LINQ (Language Integrated Query) — язык интегрированных запросов |
||
| Python: | ||
| С++: |
Ответ: 72
Сколько существует n-значных чисел, записанных в m-ной системе счисления
8_18: Объяснение 8 задания экзамена ЕГЭ 2020 г. (со слов учащегося):
Сколько существует восьмизначных чисел, записанных в восьмеричной системе счисления, в которых все цифры различны и рядом не могут стоять 2 чётные или 2 нечётные цифры?
Типовые задания для тренировки
✍ Решение:
-
✎ Решение теоретическое:
- Выпишем все четные и нечетные цифры, которые могут использоваться в 8-й с.с.:
четные: 0, 2, 4, 6 - итого 4 цифры нечетные: 1, 3, 5, 7 - итого 4 цифры
1) с четной цифры: 3 4 3 3 2 2 1 1 = 3*4*3*3*2*2*1*1 = 432 ч н ч н ч н ч н
Самый старший разряд не может быть равен 0 (поэтому 3 цифры из 4 возможных), так как разряд просто потеряется, и число станет семизначным). Каждый последующий разряд включает на одну цифру меньше, так как по заданию цифры не могут повторяться.
2) с нечетной цифры: 4 4 3 3 2 2 1 1 = 4*4*3*3*2*2*1*1 = 576 н ч н ч н ч н ч
Каждый последующий разряд включает на одну цифру меньше, так как по заданию цифры не могут повторяться.
432 + 576 = 1008
✎ Решение с использованием программирования:
PascalABC.net (использование LINQ, быстрое решение):
* LINQ (Language Integrated Query) — язык интегрированных запросов |
||
| Python: | ||
| С++: |
Ответ: 1008
Список в алфавитном порядке
8_13:
Все 5-буквенные слова, составленные из букв А, О, У, записаны в алфавитном порядке. Ниже приведено начало списка:
1. ААААА
2. ААААО
3. ААААУ
4. АААОА
…
Запишите слово, которое стоит под номером 242 от начала списка.
✍ Решение:
-
✎ Решение теоретическое:
- Данное задание лучше решать следующим образом. Подставим вместо букв цифры (А -> 0, О -> 1, У -> 2):
1. 00000 2. 00001 3. 00002 4. 00010 ...
остатки 241 | 3 | 1 80 | 3 | 2 26 | 3 | 2 8 | 3 | 2 2 | |
✎ Решение с использованием программирования:
PascalABC.net (использование LINQ, быстрое решение):
Смотрим слова и находим по номеру нужное слово: … (241,[У,У,У,У,А]) (242,[У,У,У,У,О]) (243,[У,У,У,У,У])
* LINQ (Language Integrated Query) — язык интегрированных запросов |
||
| Python: | ||
| С++: |
Результат: УУУУО
Подробное решение теоретическим способом смотрите на видео:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
8_14: 8 задание. Демоверсия ЕГЭ 2018 информатика:
Все 4-буквенные слова, составленные из букв Д, Е, К, О, Р, записаны в алфавитном порядке и пронумерованы, начиная с 1.
Ниже приведено начало списка.
1. ДДДД 2. ДДДЕ 3. ДДДК 4. ДДДО 5. ДДДР 6. ДДЕД …
Под каким номером в списке идёт первое слово, которое начинается с буквы K?
✍ Решение:
-
✎ Решение теоретическое:
- Подставим вместо букв цифры (Д -> 0, Е -> 1, К -> 2, О -> 3, Р -> 4):
1. 0000 2. 0001 3. 0002 4. 0003 5. 0004 6. 0010 ...
K -> 2 -> 2000
По формуле разложения числа по степеням основания: 20005 = 2 * 53 + 0 * 22 + 0 + 0 = 2 * 125 = 25010
✎ Решение с использованием программирования:
PascalABC.net (использование LINQ, быстрое решение):
* LINQ (Language Integrated Query) — язык интегрированных запросов |
||
| Python: | ||
| С++: |
Результат: 251
Подробное решение 8 (10) задания демоверсии ЕГЭ 2018 года смотрите на видео:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
8_15:
Все 4-буквенные слова, составленные из букв П, Р, С, Т, записаны в алфавитном порядке.
Вот начало списка:
1. ПППП 2. ПППР 3. ПППС 4. ПППТ 5. ППРП ... ...
✍ Решение:
Результат: 65
Видеоразбор задания смотрите ниже:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
8_16:
Все четырёхбуквенные слова, составленные из букв В, Е, Г, А, Н записаны в алфавитном порядке и пронумерованы, начиная с 1. Начало списка выглядит так:
1. АААА 2. АААВ 3. АААГ 4. АААЕ 5. АААН 6. ААВА …
Под каким номером в списке идёт первое слово, в котором нет буквы А?
✍ Решение:
- ✎ Решение теоретическое:
- Пронумерованный список начинается со всех букв А. Представим, что А — 0, В — 1, Г — 2, Е — 3, Н — 4. Получим следующий список:
1. 0000 2. 0001 3. 0002 4. 0003 5. 0004 6. 0010
11115 = 1 * 53 + 1 * 52 + 1 * 51 + 1 * 50 = 156
156 + 1 = 157
✎ Решение с использованием программирования:
PascalABC.net (использование LINQ, быстрое решение):
* LINQ (Language Integrated Query) — язык интегрированных запросов |
||
| Python: | ||
| С++: |
Результат: 157
Видеорешение задания (теоретическое):
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
Вероятность событий
8_17:
За четверть Василий Пупкин получил 20 оценок. Сообщение о том, что он вчера получил четверку, несет 2 бита информации.
Сколько четверок получил Василий за четверть?
✍ Решение:
- Для решения данного задания необходимо вспомнить две формулы:
1. Формула Шеннона:
x = log2(1/p)
x - количество информации в сообщении о событии p - вероятность события
2. Формула вероятности случайного события:
p(A) = m/n
m - число случаев, способствующих событию А n - общее число равновозможных случаев
2 = log2(1/p);
=>
1/p = 4;
=>
p = 1/4
p = ?/20
1/4 = ?/20
? = 1/4 * 20 = 5
Результат: 5
Видеоразбор задания:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь (теоретическое решение)
Использование модуля itertools в Python при решении задач на уроках информатики по теме «Комбинаторика».
Очень часто на уроках информатики встречаются задачи перебора различных вариантов последовательностей, состоящих из букв или цифр. Данный класс задач встречается и в Компьютерном ЕГЭ. С 2022 года формат сдачи ЕГЭ изменился и теперь для решения задач можно использовать программные средства и языки программирования. Мы рассмотрим эту возможность решения на языке Python
Перестановки и комбинации набора элементов в Python – это различные расположения элементов набора:
Комбинация – это набор элементов, порядок которых не имеет значения.
Перестановка – это расположение набора, в котором порядок имеет значение.
Рассмотрим набор как:{A, B, C}
Перестановки вышеуказанного набора следующие:
(‘A’, ‘B’, ‘C’) (‘A’, ‘C’, ‘B’) (‘B’, ‘A’, ‘C’) (‘B’, ‘C’, ‘A’) (‘C’, ‘A’, ‘B’) (‘C’, ‘B’, ‘A’)
Комбинации вышеуказанного набора, когда два элемента взяты вместе, следующие:
(‘A’, ‘B’) (‘A’, ‘C’) (‘B’, ‘C’)
В этом руководстве мы узнаем, как получить перестановки и комбинации группы элементов в Python. Мы рассмотрим наборы символов и цифр. Мы будем использовать методы combinations() и permutations() в модуле itertools.
Перестановки числовых данных.
Чтобы использовать метод permutations() в модуле itertools, нам сначала нужно импортировать модуль.
from itertools import *
Теперь давайте определим набор чисел.
val = [1, 2, 3, 4]
Теперь, чтобы получить список перестановок, воспользуемся методом permutations().
perm_set = permutations(val)
Строка кода выше дает объект itertools.
Чтобы напечатать различные перестановки, мы будем перебирать этот объект.
for i in perm_set:
print( i,)
Мы получаем результат как кортежи четырех чисел:
(1, 2, 3, 4)-(1, 2, 4, 3)-(1, 3, 2, 4)-(1, 3, 4, 2)-(1, 4, 2, 3)-(1, 4, 3, 2)-(2, 1, 3, 4)-(2, 1, 4, 3)-(2, 3, 1, 4)-(2, 3, 4, 1)-(2, 4, 1, 3)-(2, 4, 3, 1)-(3, 1, 2, 4)-(3, 1, 4, 2)-(3, 2, 1, 4)-(3, 2, 4, 1)-(3, 4, 1, 2)-(3, 4, 2, 1)-(4, 1, 2, 3)-(4, 1, 3, 2)-(4, 2, 1, 3)-(4, 2, 3, 1)-(4, 3, 1, 2)-(4, 3, 2, 1)-
Полный код этого раздела приведен ниже:
from itertools import *
val = [1, 2, 3, 4]
perm_set = permutations(val)
for i in perm_set:
print(I, end=’-‘)
Перестановки строки
Далее мы узнаем, как получить перестановки символов в строке. Мы будем использовать метод permutations(), но на этот раз мы передадим строку в качестве аргумента.
from itertools import *
s = «ABC»
perm_set = permutations(s)
for val in perm_set:
print(val)
Вывод : (‘A’, ‘B’, ‘C’) (‘A’, ‘C’, ‘B’) (‘B’, ‘A’, ‘C’) (‘B’, ‘C’, ‘A’) (‘C’, ‘A’, ‘B’) (‘C’, ‘B’, ‘A’)
Перестановки фиксированной длины
Мы можем найти перестановки набора, в котором мы берем только указанное количество элементов в каждой перестановке.
Код для поиска перестановок фиксированной длины приведен ниже:
from itertools import *
val = [1, 2, 3, 4]
perm_set = permutations(val,2)
for i in perm_set:
print(i)
Вывод : (1, 2) (1, 3) (1, 4) (2, 1) (2, 3) (2, 4) (3, 1) (3, 2) (3, 4) (4, 1) (4, 2) (4, 3)
Комбинации числовых данных.
Так же, как метод permutations(), мы можем использовать combinations() для получения комбинаций набора. При вызове combinations() нам нужно передать два аргумента: набор для поиска комбинаций и число, обозначающее длину каждой комбинации.
from itertools import *
val = [1, 2, 3, 4]
com_set = combinations(val, 2)
for i in com_set: print(i)
Вывод : (1, 2) (1, 3) (1, 4) (2, 3) (2, 4) (3, 4)
Комбинации строки
Мы также можем получить комбинации строки.
from itertools import *
s = «ABC»
com_set = itertools.combinations(s, 2)
for i in com_set: print(i)
Вывод : (‘A’, ‘B’) (‘A’, ‘C’) (‘B’, ‘C’)
Комбинации с заменами
В модуле itertools есть еще один метод, который называется комбинациями with_replacement(). Этот метод также учитывает комбинацию числа с самим собой. Посмотрим, как это работает.
Для числового набора
from itertools import *
val = [1, 2, 3, 4]
com_set = itertools.combinations_with_replacement(val, 2)
for i in com_set:
print(i)
Вывод : (1, 1) (1, 2) (1, 3) (1, 4) (2, 2) (2, 3) (2, 4) (3, 3) (3, 4) (4, 4)
Вы можете видеть разницу в выводе выше и выводе для работы нормальной комбинации. Здесь у нас есть такие комбинации, как (1,1) и (2,2), которых нет в обычных комбинациях.
Для строки
from itertools import *
val = «ABCD»
com_set = combinations_with_replacement(val, 2)
for i in com_set:
print(i)
Вывод : (‘A’, ‘A’) (‘A’, ‘B’) (‘A’, ‘C’) (‘A’, ‘D’) (‘B’, ‘B’) (‘B’, ‘C’) (‘B’, ‘D’) (‘C’, ‘C’) (‘C’, ‘D’) (‘D’, ‘D’)
Пример 1
Петя составляет семибуквенные слова перестановкой букв слова ТРАТАТА. Сколько всего различных слов может составить Петя?
from itertools import *
val = ‘ТРАТАТА’
com_set = list(set(permutations(val)))
print(len(com_set))
Так как в слове ТРАТАТА есть повторяющие буквы Т и А. Создаем множество set в котором убираем одинаковые элементы созданные одинаковыми буквами.
Пример 2
Юрий составляет 4-буквенные слова из букв П, Р, И, К, А, З. Каждую букву можно использовать не более одного раза, при этом в слове нельзя использовать более одной гласной. Сколько различных кодов может составить Юрий?
from itertools import *
val = ‘ПРИКАЗ’
com_set = permutations(val, 4)
count = 0
for x in com_set:
if ‘И’ not in x and ‘А’ in x or ‘А’ not in x and ‘И’ in x or ‘И’ not in x and ‘А’ not in x:
count += 1
print(count)
Пример 3
Георгий составляет коды из букв своего имени. Код должен состоять из 7 букв, и каждая буква в нём должна встречаться столько же раз, сколько в имени Георгий. Кроме того, одинаковые буквы в коде не должны стоять рядом. Сколько кодов может составить Георгий?
from itertools import *
k = 0
for x in set(permutations(‘ГЕОРГИЙ’)):
s = ».join(x)
if ‘ГГ’ not in s:
k += 1
print(k)
Документация
Библиотека работает в Python 3.6+
Немного терминологии
Модуль — это файл с расширением .py, находящийся в библиотеке.
Например, модуль constants — это файл constants.py.
Модуль decorators
1. Декоратор cache
Для чего: мемоизация работы функции.
Пример использования:
from infEGE import cache @cache def fib(n): if n in {0,1}: return 1 return fib(n - 1) + fib(n - 2) fib(50)
Если убрать @cache, то вычисляться будет очень долго.
Модуль constants
Для чего: константы для использования в алгоритмах.
Содержимое:
E = 2.718281828459045 PI = 3.141592653589793 maxValue = float('inf') minValue = float('-inf')
Модуль algebra_logic
1. Функция print_true_table
Синтаксис: print_true_table(variables: str, expretion: str, value: Union[int, bool, ‘all’] = ‘all’) -> None
Для чего:
Вывод таблицы истинности лог.функции expretion от переменных variables.
Если value='all', выводятся все строки таблицы;
Если value=1 или True, выводятся строки таблицы, где функция истинна;
Если value=0 или False, выводятся строки таблицы, где функция ложна.
В качестве лог.операций можно использовать обычные операции Python
или такие эквиваленты:
{"&": " and ", "|": " or ", "~": " not ", "->": "<="}.
Пример использования #1:
from infEGE import print_true_table print_true_table("xy", "x->y", 1)
Вывод:
xy F
00 1
01 1
11 1
Внимание: в Python приоритет <= выше, чем and, or, not! Ставьте скобки!
Пример использования #2:
from infEGE import print_true_table print_true_table("xy", "x&(y|x)|y", 0)
Вывод:
xy F
00 0
Пример использования #3:
from infEGE import print_true_table print_true_table("xzy", "x or z and (y or not x)")
Вывод:
xzy F
000 0
001 0
010 1
011 1
100 1
101 1
110 1
111 1
Модуль combinatorics
1. Функция permutation_with_repeat
Синтаксис: permutation_with_repeat(seq: Union[list, tuple, str], repeat: int = 1)
Для чего:
Возвращает перестановки элкементов итерируемого
обьекта seq с repeat повторениями.
Пример использования:
from infEGE import permutation_with_repeat for el in permutation_with_repeat('123', 2): print(el)
Вывод:
('1', '1')
('1', '2')
('1', '3')
('2', '1')
('2', '2')
('2', '3')
('3', '1')
('3', '2')
('3', '3')
2. Функция permutations
Синтаксис: permutations(seq: Union[list, tuple, str]):
Для чего:
Возвращает перестановки элкементов итерируемого объекта seq.
Пример использования:
from infEGE import permutations for el in permutations('abc'): print(el)
Вывод:
abc
acb
bac
bca
cab
cba
Модуль lists_and_other
1. Функция prod
Синтаксис: prod(seq: Union[list, tuple, set]) -> Union[int, float]
Для чего:
Возввращает произведение элементов итерируемого объекта seq.
Пример использования:
from infEGE import prod print(prod([5, 8, 6, 100, 54]))
Вывод:
1296000
Модуль string
1. Функция replacing
Синтаксис: replacing(string: str, substring: str, new_string: str, mode: str = ‘обычно’, cnt: Union[int, str] = ‘all’) -> str
Для чего:
Возвращает строку string с заменённой подстрокой
substring на подстроку new_string в количестве cnt.
Режим "обычно":
замена стандартным replace
Режим "целиком":
замена подстроки substring если она не
является частью большей подстроки.
Пример использования #1:
from infEGE import replacing print(replacing("Питон плохой тон", "тон", "нот"))
Вывод:
Пинот плохой нот
Пример использования #2:
from infEGE import replacing print(replacing("Питон плохой тон", "тон", "нот", cnt=1))
Вывод:
Пинот плохой тон
Пример использования #3:
from infEGE import replacing print(replacing("Питон плохой тон", "тон", "нот", "целиком"))
Вывод:
Питон плохой нот
2. Функция index_n
Синтаксис: index_n(string: str, substring: str, n: int = 1) -> int
Для чего:
Возвращает индекс n-го вхождения СЛЕВА подстроки
substring в строку string. Если такого вхождения
нет, возвращается -1000.
Пример использования #1:
from infEGE import index_n print(index_n("01230123", "1"))
Вывод:
1
Пример использования #2:
from infEGE import index_n print(index_n("01230123", "1", 2))
Вывод:
5
Пример использования #3:
from infEGE import index_n print(index_n("01230123", "1", 3))
Вывод:
-1000
3. Функция is_number
Синтаксис: is_number(n: str) -> bool
Для чего:
Проверяет является ли строка n числом.
Если да возвращается True, иначе - False.
Пример использования #1:
from infEGE import is_number print(is_number("23"))
Вывод:
True
Пример использования #2:
from infEGE import is_number print(is_number("2n3"))
Вывод:
False
Модуль system_count
1. Функция to_base
Синтаксис: to_base(number: Union[int, str], old_base: int = 10, new_base: int = 10) -> Union[int, str]
Для чего:
Переводит число number с основанием old_base в число
с основанием new_base.
Пример использования #1:
from infEGE import to_base print(to_base(5, new_base=2))
Вывод:
101
Пример использования #2:
from infEGE import to_base print(to_base(15, new_base=16))
Вывод:
F
Пример использования #3:
from infEGE import to_base print(to_base("FA32", old_base=17, new_base=10))
Вывод:
76638
Пример использования #4:
from infEGE import to_base print(to_base("FA32", old_base=17, new_base=6))
Вывод:
1350450
Модуль mathematics
1. Функция is_prime
Синтаксис: is_prime(n: int) -> bool
Для чего:
Если n - простое, то возващается True, иначе - False.
Пример использования #1:
from infEGE import is_prime print(is_prime(5))
Вывод:
True
Пример использования #2:
from infEGE import is_prime print(is_prime(25))
Вывод:
False
Пример использования #3:
from infEGE import is_prime print(is_prime(1))
Вывод:
False
2. Функция is_even
Синтаксис: is_even(n: int) -> bool
Для чего:
Если n - чётно, то возващается True, иначе - False.
Пример использования #1:
from infEGE import is_even print(is_even(12))
Вывод:
True
Пример использования #2:
from infEGE import is_even print(is_even(25))
Вывод:
False
3. Функция is_odd
Синтаксис: is_odd(n: int) -> bool
Для чего:
Если n - нечётно, то возващается True, иначе - False.
Пример использования #1:
from infEGE import is_odd print(is_odd(12))
Вывод:
False
Пример использования #2:
from infEGE import is_odd print(is_odd(25))
Вывод:
True
4. Функция divided
Синтаксис: divided(n: int, d: int) -> bool
Для чего:
Если n нацело делится на d, то возвращается True, иначе - False.
Пример использования #1:
from infEGE import divided print(divided(12, 5))
Вывод:
False
Пример использования #2:
from infEGE import divided print(divided(121, 11))
Вывод:
True
5. Функция not_divisible
Синтаксис: not_divisible(n: int, d: int) -> bool
Для чего:
Если n не делится нацело на d, то возвращается True, иначе - False.
Пример использования #1:
from infEGE import not_divisible print(not_divisible(12, 5))
Вывод:
True
Пример использования #2:
from infEGE import not_divisible print(not_divisible(121, 11))
Вывод:
False
6. Функция factorial
Синтаксис: factorial(n: int) -> int
Для чего:
Возвращает n! (0! = 1)
Пример использования:
from infEGE import factorial print(factorial(6))
Вывод:
720
7. Функция factorize
Синтаксис: factorize(number: int) -> list
Для чего:
Возвращает разложение числа number на простые множители в list.
Пример использования #1:
from infEGE import factorize print(factorize(1))
Вывод:
[]
Пример использования #2:
from infEGE import factorize print(factorize(11))
Вывод:
[11]
Пример использования #3:
from infEGE import factorize print(factorize(55))
Вывод:
[5, 11]
8. Функция divisors
Синтаксис: divisors(n: int) -> list
Для чего:
Возвращает все натуральные делители числа n на интервале (1; n).
Пример использования #1:
from infEGE import divisors print(divisors(1))
Вывод:
[]
Пример использования #2:
from infEGE import divisors print(divisors(720))
Вывод:
[2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 30, 36, 40, 45, 48, 60, 72, 80, 90, 120, 144, 180, 240, 360]
9. Функция fib
Синтаксис: fib(n: int) -> int
Для чего:
Возвращает n-ый член последовательности Фибоначчи. Нумерация с 0.
Пример использования #1:
from infEGE import fib print(fib(0))
Вывод:
0
Пример использования #2:
from infEGE import fib print(fib(1))
Вывод:
1
Пример использования #3:
from infEGE import fib print(fib(2))
Вывод:
1
Пример использования #4:
from infEGE import fib print(fib(3))
Вывод:
2
Пример использования #5:
from infEGE import fib print(fib(2001))
Вывод:
6835702259575806647045396549170580107055408029365524565407553367798082454408054014954534318953113802726603726769523447478238192192714526677939943338306101405105414819705664090901813637296453767095528104868264704914433529355579148731044685634135487735897954629842516947101494253575869699893400976539545740214819819151952085089538422954565146720383752121972115725761141759114990448978941370030912401573418221496592822626
Примечание: Данный алгоритм работает быстрее рекурсивного! Асимптоматика: O(N)
В этом руководстве мы узнаем, как осуществить перестановку и комбинацию заданных данных с помощью Python. Мы будем использовать встроенный пакет Python для поиска перестановки и комбинации заданного числа.
Перестановка и комбинация в Python – важная часть математики. Python предоставляет библиотеку itertools, которая имеет встроенные функции для вычисления перестановок и комбинаций.
Импорт необходимой библиотеки
Чтобы вычислить перестановку и комбинацию, нам нужно импортировать библиотеку itertools. Мы можем сделать это, используя следующую команду.
import itertools
Вышеупомянутый оператор импортирует библиотеку itertools и определит путь к ее функции.
Теперь нам нужно создать список последовательности в качестве входных данных. Этот список ввода вернет кортеж, состоящий из перестановок и комбинаций. Мы также можем установить длину перестановки и комбинации.
Перестановка в Python – это расположение множества, в котором порядок имеет значение. Модуль Python itertools предоставляет встроенный метод permutation() для поиска перестановки. Давайте разберемся в следующем примере.
from itertools import permutations seq = permutations(['1','2','3']) print(seq) for p in list(seq): print(p)
Выход:
('1', '2', '3') ('1', '3', '2') ('2', '1', '3') ('2', '3', '1') ('3', '1', '2') ('3', '2', '1')
В приведенном выше коде мы импортировали модуль itertools. Мы вызвали метод permutation(), который принимает строку в качестве аргумента и предоставляет объект itertools. Для получения каждой перестановки необходимо использовать цикл for.
Возьмем два набора перестановок.
Пример 1.
from itertools import permutations seq = permutations(['A','B']) for p in list(seq): print(p)
Выход:
('A', 'B') ('A', 'C') ('B', 'C')
Пример 2.
from itertools import permutations list1 = [1, 2, 3, 4] seq = permutations(list1) print(seq) for p in list(seq): print(p)
Выход:
(1, 2, 3, 4) (1, 2, 4, 3) (1, 3, 2, 4) (1, 3, 4, 2) (1, 4, 2, 3) (1, 4, 3, 2) (2, 1, 3, 4) (2, 1, 4, 3) (2, 3, 1, 4) (2, 3, 4, 1) (2, 4, 1, 3) (2, 4, 3, 1) (3, 1, 2, 4) (3, 1, 4, 2) (3, 2, 1, 4) (3, 2, 4, 1) (3, 4, 1, 2) (3, 4, 2, 1) (4, 1, 2, 3) (4, 1, 3, 2) (4, 2, 1, 3) (4, 2, 3, 1) (4, 3, 1, 2) (4, 3, 2, 1)
В приведенном выше коде мы получили комбинацию нескольких целых чисел.
Перестановка фиксированной длины
Мы можем вычислить перестановку набора фиксированной длины, где мы берем только указанное количество перестановок каждого элемента.
Пример –
from itertools import permutations seq = permutations(['H', 'e', 'l', 'l', 'o'], 3) for p in list(seq): print(p)
Выход:
('H', 'e') ('H', 'l') ('H', 'l') ('H', 'o') ('e', 'H') ('e', 'l') ('e', 'l') ('e', 'o') ('l', 'H') ('l', 'e') ('l', 'l') ('l', 'o') ('l', 'H') ('l', 'e') ('l', 'l') ('l', 'o') ('o', 'H') ('o', 'e') ('o', 'l') ('o', 'l')
В приведенном выше коде мы вычислили фиксированную перестановку.
Что такое комбинация строки?
Комбинация в Python – это набор элементов, порядок которых не имеет значения. Модуль Python itertools предоставляет метод combination() для вычисления комбинации заданных данных. Мы можем вычислить комбинацию строки. Давайте разберемся в следующем примере.
Пример –
import itertools
seq = "ABC"
com_seq = itertools.combinations(seq, 2)
for c in com_seq:
print(c)
Выход:
('A', 'B') ('A', 'C') ('B', 'C')
Комбинация с заменой
Модуль itertools состоит из другого метода, называемого combination_with_replacement(), который также учитывает комбинацию самого числа. Давайте разберемся с его примером.
from itertools import combinations_with_replacement com = combinations_with_replacement(['J', 'a', 'v', 'a', 't', 'p', 'o', 'i', 'n', 't'], 2) #Print the list of combinations for c in list(com): print(c)
Выход:
('J', 'J') ('J', 'a') ('J', 'v') ('J', 'a') ('J', 't') ('J', 'p')
('J', 'o') ('J', 'i') ('J', 'n') ('J', 't') ('a', 'a') ('a', 'v') ('a', 'a') ('a', 't') ('a', 'p') ('a', 'o') ('a', 'i') ('a', 'n') ('a', 't') ('v', 'v') ('v', 'a') ('v', 't') ('v', 'p') ('v', 'o') ('v', 'i') ('v', 'n') ('v', 't') ('a', 'a') ('a', 't') ('a', 'p') ('a', 'o') ('a', 'i') ('a', 'n') ('a', 't') ('t', 't') ('t', 'p') ('t', 'o') ('t', 'i') ('t', 'n') ('t', 't') ('p', 'p') ('p', 'o') ('p', 'i') ('p', 'n') ('p', 't') ('o', 'o') ('o', 'i') ('o', 'n') ('o', 't') ('i', 'i') ('i', 'n') ('i', 't') ('n', 'n') ('n', 't') ('t', 't')
Комбинация числового набора
Если данный ввод находится в отсортированном порядке, комбинированные кортежи будут возвращены в отсортированном порядке. Давайте разберем на примере.
import itertools
v = [1, 2, 3, 4]
com_seq = itertools.combinations_with_replacement(v, 3)
for i in com_seq:
print(i)
Выход:
(1, 1, 1) (1, 1, 2) (1, 1, 3) (1, 1, 4) (1, 2, 2) (1, 2, 3) (1, 2, 4) (1, 3, 3) (1, 3, 4) (1, 4, 4) (2, 2, 2) (2, 2, 3) (2, 2, 4) (2, 3, 3) (2, 3, 4) (2, 4, 4) (3, 3, 3) (3, 3, 4) (3, 4, 4) (4, 4, 4)
В этом руководстве мы обсудили модуль itertools для поиска перестановки и комбинации заданных данных с помощью скрипта Python.

Изучаю Python вместе с вами, читаю, собираю и записываю информацию опытных программистов.
Комбинаторика — это раздел математики, в котором изучают, сколько комбинаций, подчинённых тем или иным условиям, можно составить из данных объектов. Короче, это все о сочетаниях, перестановках, числе способов и тому подобному.
Почему важна комбинаторика? Нет, не только лишь для решения олимпиадных задач, но также комбинаторика – один из столпов теории вероятностей, которая в свою очередь служит фундаментом для машинного обучения – одно из мощнейших трендов в ПО начале 21-го века!
В встроенном в Python модуле itertools существует ряд комбинаторных функций. Это:
product()– прямое (Декартово) произведение одного или нескольких итераторов.permutations()– перестановки и размещения элементов множества.combinations()– уникальные комбинации из элементов множества.combinations_with_replacement()– комбинации с замещением (повторами, возвратами).
О каждой из них расскажу подробно. Для начала импортируем все нужные функции из модуля:
from itertools import *
Прямое произведение
Прямое, или декартово произведение двух множеств — множество, элементами которого являются все возможные упорядоченные пары элементов исходных множеств. Проще говоря мы берем из первого множества один элемент, а потом из второго выбираем элемент и составляем их в кортеж. Так вот все способы выбрать так элементы – составят декартово произведение. Пример:
>>> A = [1, 2, 3] >>> B = "123" >>> print(*product(A, B)) (1, 'a') (1, 'b') (1, 'c') (2, 'a') (2, 'b') (2, 'c') (3, 'a') (3, 'b') (3, 'c')
Примечания. Во-первых, заметьте, что элементы следуют в строгом лексографическом порядке: сначала берется нулевой элемент из первой последовательности и сочетается с каждым по очереди из второй последовательности. Во-вторых, аргументами функции могут быть любые итерируемые объекты конечной длины. Я взял для примера список и строку, причем строка автоматически разбивается на символы.
В коде произведение множеств эквивалентно вложенным циклам:
>>> print(*[(a, b) for a in A for b in B]) (1, '1') (1, '2') (1, '3') (2, '1') (2, '2') (2, '3') (3, '1') (3, '2') (3, '3')
Результат такой же, но рекомендую использовать именно библиотечную функцию, так как ее реализация, наверняка, будет лучше.
Вы можете передать в функцию больше последовательностей:
>>> print(*product([1, 2, 3])) (1,) (2,) (3,) >>> print(*product([1, 2, 3], [10, 20, 30])) (1, 10) (1, 20) (1, 30) (2, 10) (2, 20) (2, 30) (3, 10) (3, 20) (3, 30) >>> print(*product([1, 2, 3], [10, 20, 30], [100, 200, 300])) (1, 10, 100) (1, 10, 200) (1, 10, 300) (1, 20, 100) (1, 20, 200) (1, 20, 300) (1, 30, 100) (1, 30, 200) (1, 30, 300) (2, 10, 100) (2, 10, 200) (2, 10, 300) (2, 20, 100) (2, 20, 200) (2, 20, 300) (2, 30, 100) (2, 30, 200) (2, 30, 300) (3, 10, 100) (3, 10, 200) (3, 10, 300) (3, 20, 100) (3, 20, 200) (3, 20, 300) (3, 30, 100) (3, 30, 200) (3, 30, 300)
Каждый выходной элемент будет кортежем (даже в случае, если в нем только один элемент!). Также обратите внимание на то, что функция product (как и все остальные из сегодняшнего набора) возвращает не список, а особый ленивый объект. Чтобы получить все элементы, нужно преобразовать его в список функцией list:
>>> product([1, 2, 3], 'abc') <itertools.product object at 0x101aef8c0> >>> list(product([1, 2, 3], 'abc')) [(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]
Количество элементов на выходе будет произведением длин всех последовательностей на входе:
В функцию product можно передать именованный параметр repeat, который указывает сколько раз повторять цепочку вложенных циклов (по умолчанию один раз). Если repeat >= 2, то это называют декартовой степенью. То есть множество умножается на себя несколько раз. Так при repeat=2 эквивалентным кодом будет:
>>> [(a, b, a1, b1) for a in A for b in B for a1 in A for b1 in B] == list(product(A, B, repeat=2)) True
В таком случае количество элементов в результате будет вычисляться по схожей формуле с учетом того, что каждый множитель будет в степени repeat:
Перестановки
Функция permutations возвращает последовательные перестановки элементов входного множества. Первый элемент – будет исходным множеством. Второй – результат перестановки какой-то пары элементов и так далее, пока не будут перебраны все уникальные комбинации. Уникальность здесь рассматривается по позициям элементов в исходной последовательности, а не по и их значению, то есть элементы между собой алгоритмом не сравниваются. Важны только их индексы.
Число объектов остается неизменными, меняется только их порядок.
>>> print(*permutations("ABC"))
('A', 'B', 'C') ('A', 'C', 'B') ('B', 'A', 'C') ('B', 'C', 'A') ('C', 'A', 'B') ('C', 'B', 'A')
Второй параметр r отвечает за количество элементов в перестановках. По умолчанию будут выданы полные перестановки (длиной, равной длине n исходной последовательности), никакие элементы исходного множества не будут выброшены, а просто переставлены местами. Если задать 0 <= r <= n, в каждой выборке будет содержаться по r элементов. Иными словами из n входных элементов будем выбирать r объектов и переставлять всеми возможными способами между собой (то есть меняется и состав выбранных объектов, и их порядок). Получившиеся комбинации называются размещениями из n объектов по r.
Например размещения для двух элементов из коллекции из трех элементов:
>>> print(*permutations("ABC", 2))
('A', 'B') ('A', 'C') ('B', 'A') ('B', 'C') ('C', 'A') ('C', 'B')
# 2 из 4
>>> print(*permutations([1, 2, 3, 4], 2))
(1, 2) (1, 3) (1, 4) (2, 1) (2, 3) (2, 4) (3, 1) (3, 2) (3, 4) (4, 1) (4, 2) (4, 3)
Количество вариантов получится по формуле (n – длина исходной последовательности):
При r > n будет пустое множество, потому что невозможно из более короткой последовательности выбрать более длинную. Максимальное число вариантов – для полной перестановки равняется n! (факториал).
Размещения выглядят так. Сначала выбрали по 2 элемента из 3, а потом переставили их внутри групп всеми способами. Итого 6 вариантов:

Сочетания
combinations – функция, коротая выбирает все сочетания из входной последовательности. Пусть в ней имеется n различных объектов. Будем выбирать из них r объектов всевозможными способами (то есть меняется состав выбранных объектов, но порядок не важен). Получившиеся комбинации называются сочетаниями из n объектов по r, а их число равно:
Разница сочетаний и перестановок в том, что для сочетаний нам не важен порядок, а для перестановок он важен. Пример:
>>> print(*permutations([1, 2, 3], 2)) (1, 2) (1, 3) (2, 1) (2, 3) (3, 1) (3, 2) >>> print(*combinations([1, 2, 3], 2)) (1, 2) (1, 3) (2, 3)
(1, 2) и (2, 1) – разные перестановки, но с точки зрения сочетаний – это одно и тоже, поэтому в combinations входит только один вариант из двух.
Второй параметр r – обязателен для этой функции. 0 <= r <= n. При r > n будет пустое множество.
Вот графический пример сочетаний из 3 по 2. Как видно, их вдвое меньше, чем размещений из 3 по 2, так как варианты с перестановками внутри групп не учтены по определению:
Сочетания с повторами
Функция combinations_with_replacement описывает, сколькими способами можно составить комбинацию по r элементов из элементов n типов (элементы в комбинации могут повторяться, но порядок их не важен). Обратите внимание на слово «тип«, в простых сочетаниях элементы не повторялись внутри одной выборки, они были как бы конкретными экземплярами.
На языке мешка с шарами, сочетания с повторами значит, что мы достаем шары из мешка, а потом кладем их обратно, записывая их цвета (цвет это и есть в данном случае аналог типа). Вполне может быть так, что мы достали красный шар два раза подряд, ведь после первого раза мы сунули его обратно в мешок. Пример:
>>> print(*combinations_with_replacement(['red', 'white', 'black'], 2))
('red', 'red') ('red', 'white') ('red', 'black') ('white', 'white') ('white', 'black') ('black', 'black')
Поэтому, имея возможность брать один и тот же элемент несколько раз, можно выбрать из последовательности в три элемента 4, и 5, и сколь угодно много (больше, чем было исходных типов). Например, по 4 из 2:
>>> print(*combinations_with_replacement(['red', 'black'], 4))
('red', 'red', 'red', 'red') ('red', 'red', 'red', 'black') ('red', 'red', 'black', 'black') ('red', 'black', 'black', 'black') ('black', 'black', 'black', 'black')
Вот графически сочетания с повторами по 2 из 3:
Формула числа элементов на выходе такова:
Бонус – брутфорс пароля
Как бонус предлагаю вам применение функции product() для брутфорса паролей. Сперва мы задаем набор символов, которые могут встречаться в пароле, наш алфавит, например такой:
import string # все буквы и цифры alphabet = string.digits + string.ascii_letters # 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
А потом перебираем все возможные сочетания с длинами от минимальной до максимальной. Не забываем их склеить в строку:
def brute_force(alphabet, min_len, max_len):
# функция - склеиватель последователностей символов в строку
joiner = ''.join
for cur_len in range(min_len, max_len + 1):
yield from map(joiner, product(alphabet, repeat=cur_len))
Пример применения:
# сокращенный алфавит для иллюстрации работы alphabet = '123AB' print(*brute_force(alphabet, 1, 3), sep=', ') # вывод: 1, 2, 3, A, B, 11, 12, 13, 1A, 1B, 21, 22, 23, 2A, 2B, 31, 32, 33, 3A, 3B, A1, A2, A3, AA, AB, B1, B2, B3, BA, BB, 111, 112, 113, 11A, 11B, 121, 122, 123, 12A, 12B, 131, 132, 133, 13A, 13B, 1A1, 1A2, 1A3, 1AA, 1AB, 1B1, 1B2, 1B3, 1BA, 1BB, 211, 212, 213, 21A, 21B, 221, 222, 223, 22A, 22B, 231, 232, 233, 23A, 23B, 2A1, 2A2, 2A3, 2AA, 2AB, 2B1, 2B2, 2B3, 2BA, 2BB, 311, 312, 313, 31A, 31B, 321, 322, 323, 32A, 32B, 331, 332, 333, 33A, 33B, 3A1, 3A2, 3A3, 3AA, 3AB, 3B1, 3B2, 3B3, 3BA, 3BB, A11, A12, A13, A1A, A1B, A21, A22, A23, A2A, A2B, A31, A32, A33, A3A, A3B, AA1, AA2, AA3, AAA, AAB, AB1, AB2, AB3, ABA, ABB, B11, B12, B13, B1A, B1B, B21, B22, B23, B2A, B2B, B31, B32, B33, B3A, B3B, BA1, BA2, BA3, BAA, BAB, BB1, BB2, BB3, BBA, BBB
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈
9 105



















