Лабораторная работа № 11. Решение комбинаторных задач с помощью Python

Теоретические сведения

Алгоритм выбора комбинационной формулы

Алгоритм

Алгоритм

Вычисление факториала

Для вычисления факториала используем функцию factorial() модуля math:

# импорт функции из модуля math
from math import factorial

# вызов функции
p = factorial(3)

Генерация списка перестановок, размещений и сочетаний

Для получения списка требуемых комбинаций средствами Python, нужно импортировать подходящую функцию из модуля itertools:

  • permutations(<последовательность>) - генерация перестановок.
  • permutations(<последовательность>, m) - генерация размещений без повторений по \(m\) элементов в каждом.
  • combinations(<последовательность>, m) - генерация сочетаний без повторений по \(m\) элементов в каждом.

Импорт функций:

from itertools import permutations, combinations

Результат работы функции-генератора комбинаций можно преобразовать в список для получения отдельной комбинации по индексу, последовательности комбинаций по срезу:

# в переменной сохранится список перестановок
lst = list(permuations(<последовательность>))

lst[0]      # первый элемент списка
lst[5:11]   # срез списка с пятого по десятый элементы

Каждая сгенерированная комбинация относится к типу данных кортеж. Элементы кортежа можно индексировать так же, как элементы других последовательностей.

comb = lst[0] # первая комбинация
comb[0]     # первый элемент в сгенерированной комбинации
comb[-1]    # последний элемент в сгенерированной комбинации

Чтобы выбрать один случайны элемент из списка, можно использовать функцию choice() из модуля random. Перед использованием функцию нужно импортировать в программу:

from random import choice

choice(lst) # случайный элемент из списка lst

Задания для самостоятельной работы

💻 Задание 1 (sam01.py)

Пользователь вводит количество участников n соревнований по шахматам и их фамилии. Программа должна вычислить, сколькими способами могут быть распределены три призовых места, и вывести все возможные варианты такого распределения.

По условию необходимо сгенерировать все x размещения без повторений. Например, если количество участников равно 6, и количество призовых мест равно 3, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество участников:4
Введите имя: Ольга
Введите имя: Василий
Введите имя: Алиса
Введите имя: Борис
Количество комбинаций: 24
('Ольга', 'Василий', 'Алиса')
('Ольга', 'Василий', 'Борис')
('Ольга', 'Алиса', 'Василий')
...

Пользователь вводит количество цветов n и список их названий. Программа должна вычислить, сколько различных флагов можно составить, используя заданное количество m полос из доступных цветов без их повторения, и вывести все возможные комбинации цветов для флага.

По условию необходимо сгенерировать все x размещения без повторений. Например, если количество цветов равно 5, и количество цветов в флаге равно 3, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество цветов:4
Цветов в флаге:2
Введите цвет: зелёный
Введите цвет: красный
Введите цвет: синий
Введите цвет: фиолетовый
Количество комбинаций: 12
('зелёный', 'красный')
('зелёный', 'синий')
('зелёный', 'фиолетовый')
...

Пользователь вводит список различных названий учебных предметов. Программа должна вычислить, сколькими способами можно расположить предметы в расписании без повторений, и вывести все возможные варианты расписания.

По условию необходимо сгенерировать все x перестановки без повторений. Например, если количество учебных предметов равно 4, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество предметов:3
Введите предмет: Информатика
Введите предмет: Физика
Введите предмет: Математика
Количество комбинаций: 6
('Информатика', 'Физика', 'Математика')
('Информатика', 'Математика', 'Физика')

Пользователь вводит список имен учащихся. Программа должна вычислить, сколькими способами можно выбрать заданное количество человек m для участия в конференции, и вывести все возможные составы участников. Каждый человек может быть выбран только один раз.

По условию необходимо сгенерировать все x сочетания без повторений. Например, если количество учащихся равно 7, а количество участников конференции равно 4, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество студентов:4
Количество участников конф.:2
Имя студента: Антон
Имя студента: Борис
Имя студента: Виталий
Имя студента: Галина
Количество комбинаций: 6
('Антон', 'Борис')
('Антон', 'Виталий')
...

Пользователь вводит список имен учащихся. Программа должна вычислить, сколькими способами можно выбрать председателя, секретаря и обычного члена жюри для конкурса проектов, и вывести все возможные тройки для этих должностей. Один человек не может занимать две должности одновременно.

По условию необходимо сгенерировать все x размещения без повторений. Например, если количество учащихся равно 5, а количество должностей равно 3, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество студентов:4
Введите имя: Алина
Введите имя: Борис
Введите имя: Вита
Введите имя: Гена
Количество комб.: 24
('Алина', 'Борис', 'Вита')
('Алина', 'Борис', 'Гена')
...

Пользователь вводит список различных цифр. Программа должна вычислить, сколько различных чисел можно составить, используя все заданные цифры ровно по одному разу, и вывести все возможные такие числа.

По условию необходимо сгенерировать все x перестановки без повторений. Например, если количество цифр равно 6, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество цифр:3
Введите цифру: 4
Введите цифру: 5
Введите цифру: 1
Количество комбинаций: 6
('4', '5', '1')
('4', '1', '5')
...

Пользователь вводит список названий различных книг. Программа должна вычислить, сколькими способами можно расставить все книги на полке, и вывести все возможные варианты расстановки.

По условию необходимо сгенерировать все x перестановки без повторений. Например, если количество книг равно 4, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество книг:3
Введите название: Страна багровых туч
Введите название: Человек, который смеется
Введите название: Братья Карамазовы
Количество комбинаций: 6
('Страна багровых туч', 'Человек, который смеется', 'Братья Карамазовы')
('Страна багровых туч', 'Братья Карамазовы', 'Человек, который смеется')
...

Пользователь вводит количество участников n соревнований по шахматам и их фамилии. Программа должна вычислить, сколькими способами могут быть распределены три призовых места, и вывести все возможные варианты такого распределения.

По условию необходимо сгенерировать все x размещения без повторений. Например, если количество участников равно 6, и количество призовых мест равно 3, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество участников:4
Введите имя: Ольга
Введите имя: Василий
Введите имя: Алиса
Введите имя: Борис
Количество комбинаций: 24
('Ольга', 'Василий', 'Алиса')
('Ольга', 'Василий', 'Борис')
('Ольга', 'Алиса', 'Василий')
...

Пользователь вводит количество цветов n и список их названий. Программа должна вычислить, сколько различных флагов можно составить, используя заданное количество m полос из доступных цветов без их повторения, и вывести все возможные комбинации цветов для флага.

По условию необходимо сгенерировать все x размещения без повторений. Например, если количество цветов равно 5, и количество цветов в флаге равно 3, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество цветов:4
Цветов в флаге:2
Введите цвет: зелёный
Введите цвет: красный
Введите цвет: синий
Введите цвет: фиолетовый
Количество комбинаций: 12
('зелёный', 'красный')
('зелёный', 'синий')
('зелёный', 'фиолетовый')
...

Пользователь вводит список различных названий учебных предметов. Программа должна вычислить, сколькими способами можно расположить предметы в расписании без повторений, и вывести все возможные варианты расписания.

По условию необходимо сгенерировать все x перестановки без повторений. Например, если количество учебных предметов равно 4, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество предметов:3
Введите предмет: Информатика
Введите предмет: Физика
Введите предмет: Математика
Количество комбинаций: 6
('Информатика', 'Физика', 'Математика')
('Информатика', 'Математика', 'Физика')

Пользователь вводит список имен учащихся. Программа должна вычислить, сколькими способами можно выбрать заданное количество человек m для участия в конференции, и вывести все возможные составы участников. Каждый человек может быть выбран только один раз.

По условию необходимо сгенерировать все x сочетания без повторений. Например, если количество учащихся равно 7, а количество участников конференции равно 4, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество студентов:4
Количество участников конф.:2
Имя студента: Антон
Имя студента: Борис
Имя студента: Виталий
Имя студента: Галина
Количество комбинаций: 6
('Антон', 'Борис')
('Антон', 'Виталий')
...

Пользователь вводит список имен учащихся. Программа должна вычислить, сколькими способами можно выбрать председателя, секретаря и обычного члена жюри для конкурса проектов, и вывести все возможные тройки для этих должностей. Один человек не может занимать две должности одновременно.

По условию необходимо сгенерировать все x размещения без повторений. Например, если количество учащихся равно 5, а количество должностей равно 3, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество студентов:4
Введите имя: Алина
Введите имя: Борис
Введите имя: Вита
Введите имя: Гена
Количество комб.: 24
('Алина', 'Борис', 'Вита')
('Алина', 'Борис', 'Гена')
...

Пользователь вводит список различных цифр. Программа должна вычислить, сколько различных чисел можно составить, используя все заданные цифры ровно по одному разу, и вывести все возможные такие числа.

По условию необходимо сгенерировать все x перестановки без повторений. Например, если количество цифр равно 6, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество цифр:3
Введите цифру: 4
Введите цифру: 5
Введите цифру: 1
Количество комбинаций: 6
('4', '5', '1')
('4', '1', '5')
...

Пользователь вводит список названий различных книг. Программа должна вычислить, сколькими способами можно расставить все книги на полке, и вывести все возможные варианты расстановки.

По условию необходимо сгенерировать все x перестановки без повторений. Например, если количество книг равно 4, то количество комбинаций равно x .


Составьте код решения задачи из предложенных блоков.

Использовано попыток: 0
В коде есть ошибка.

Пример работы программы (фрагмент):

Количество книг:3
Введите название: Страна багровых туч
Введите название: Человек, который смеется
Введите название: Братья Карамазовы
Количество комбинаций: 6
('Страна багровых туч', 'Человек, который смеется', 'Братья Карамазовы')
('Страна багровых туч', 'Братья Карамазовы', 'Человек, который смеется')
...

💻 Задание 2 (sam02.py)

В прокате кинотеатра находится \(N > 4\) фильмов из которых в день можно показать только 4 фильма. Составьте программу, которая посчитает количество возможных расписаний показа фильмов. Выведите на экран первые 5 комбинаций. Пример формата вывода одной комбинации:

1. Фильм 1
2. Фильм 2
3. Фильм 3
4. Фильм 4

Пользователь вводит список различных длин отрезков. Программа должна определить, сколько существует троек отрезков, из которых можно составить разносторонний треугольник (выполняется неравенство треугольника). Вывести общее количество троек, а затем 5 случайных комбинаций. Формат вывода каждой комбинации:

a = число1, b = число2, с = число3

Пользователь вводит количество и список фамилий участников конференции. Программа должна рассчитать, сколькими способами можно выбрать председателя и секретаря конференции. Вывести общее количество способов, а затем последние 7 комбинаций. Каждую пару вывести в формате:

Председатель: Фамилия, Секретарь: Фамилия

Пользователь вводит количество и список сотрудников. Программа должна рассчитать, сколькими способами можно выбрать двух человек для командировки. Вывести общее количество способов, а затем первые 3 комбинации. Каждую комбинацию выводите в следующем формате:

Командировка для [фамилия 1] и [Фамилия 2]

Пользователь вводит количество и список дел на день. Программа должна рассчитать, сколькими способами можно выстроить 3 задачи в последовательность. Вывести общее количество комбинаций, а затем 5 случайных комбинаций. Каждую комбинацию выводите в следующем формате:

Дело1 -> Дело2 -> Дело3

Пользователь вводит количество и список футбольных команд. Программа должна рассчитать, сколько можно провести матчей между различными парами команд. Вывести общее количество и 5 последних комбинаций матчей. Каждую комбинацию выведите в следующем формате:

Команда1 VS Команда2

Пользователь вводит количество и список студентов. 3 студента должны подготовить доклад для следующего занятия. Программа должна рассчитать, сколько можно создать различных групп выступающих. Вывести общее количество групп, а затем первые 4 комбинации. В каждой комбинации вывести студентов в ненумерованном списке. Пример выходного формата для одной комбинации:

- Студент1
- Студент2
- Студент3

В прокате кинотеатра находится \(N > 4\) фильмов из которых в день можно показать только 4 фильма. Составьте программу, которая посчитает количество возможных расписаний показа фильмов. Выведите на экран первые 5 комбинаций. Пример формата вывода одной комбинации:

1. Фильм 1
2. Фильм 2
3. Фильм 3
4. Фильм 4

Пользователь вводит список различных длин отрезков. Программа должна определить, сколько существует троек отрезков, из которых можно составить разносторонний треугольник (выполняется неравенство треугольника). Вывести общее количество троек, а затем 5 случайных комбинаций. Формат вывода каждой комбинации:

a = число1, b = число2, с = число3

Пользователь вводит количество и список фамилий участников конференции. Программа должна рассчитать, сколькими способами можно выбрать председателя и секретаря конференции. Вывести общее количество способов, а затем последние 7 комбинаций. Каждую пару вывести в формате:

Председатель: Фамилия, Секретарь: Фамилия

Пользователь вводит количество и список сотрудников. Программа должна рассчитать, сколькими способами можно выбрать двух человек для командировки. Вывести общее количество способов, а затем первые 3 комбинации. Каждую комбинацию выводите в следующем формате:

Командировка для [фамилия 1] и [Фамилия 2]

Пользователь вводит количество и список дел на день. Программа должна рассчитать, сколькими способами можно выстроить 3 задачи в последовательность. Вывести общее количество комбинаций, а затем 5 случайных комбинаций. Каждую комбинацию выводите в следующем формате:

Дело1 -> Дело2 -> Дело3

Пользователь вводит количество и список футбольных команд. Программа должна рассчитать, сколько можно провести матчей между различными парами команд. Вывести общее количество и 5 последних комбинаций матчей. Каждую комбинацию выведите в следующем формате:

Команда1 VS Команда2

Пользователь вводит количество и список студентов. 3 студента должны подготовить доклад для следующего занятия. Программа должна рассчитать, сколько можно создать различных групп выступающих. Вывести общее количество групп, а затем первые 4 комбинации. В каждой комбинации вывести студентов в ненумерованном списке. Пример выходного формата для одной комбинации:

- Студент1
- Студент2
- Студент3

💻 Задание 3

Ваша задача - написать программы для подбора ключа, открывающего следующий уровень. Каждый пароль состоит из 6 символов. Пароль может состоять из комбинации следующих символов: !@#$%01234ABCDE. Символы в паролях не повторяются. Ответом для каждого уровня служит первый найденный пароль подходящий под условие.

Задания каждого уровня засчитываются только при наличии программы для его нахождения.

Уровень 1 (level01.py)

Найдите первую комбинацию символов, для которой выполняется следующее условие: первый символ - 3, последний символ - A или E.

Найденный пароль: x


Уровень 2 (level02.py)

Найдите первую комбинацию символов, для которой выполняется следующее условие: встречается комбинация символов EA и пароль заканчивается символами 42.

Найденный пароль: x


Уровень 3 (level03.py)

Найдите первую комбинацию символов, для которой выполняется следующее условие: 4 символа посередине содержат только цифры и первый символ - C.

Найденный пароль: x


Уровень 4 (level04.py)

Найдите первую комбинацию символов, для которой выполняется следующее условие: количество цифр в два раза больше количества букв.

Найденный пароль: x


Уровень 5 (level05.py)

Найдите первую комбинацию символов, для которой выполняется следующее условие: первый символ - E и сумма Unicode-кодов символов пароля равна 336.

Найденный пароль: x


Все уровни пройдены!

Уровень 1 (level01.py)

Найдите первую комбинацию символов, для которой выполняется следующее условие: первый символ - 4 или B, последний символ - D.

Найденный пароль: x


Уровень 2 (level02.py)

Найдите первую комбинацию символов, для которой выполняется следующее условие: встречается комбинация символов 1% и пароль начинается с символов 3D.

Найденный пароль: x


Уровень 3 (level03.py)

Найдите первую комбинацию символов, для которой выполняется следующее условие: 2 символа посередине содержат только буквы и последний символ - 4.

Найденный пароль: x


Уровень 4 (level04.py)

Найдите первую комбинацию символов, для которой выполняется следующее условие: произведение количества букв и цифр больше 2.

Найденный пароль: x


Уровень 5 (level05.py)

Найдите первую комбинацию символов, для которой выполняется следующее условие: последний символ - # и сумма Unicode-кодов символов пароля равна 356.

Найденный пароль: x


Все уровни пройдены!

💻 Задание 4 (sam04.py)

Пользователь вводит список чисел, представляющих рейтинг участников, и целевое значение N. Программа должна найти и вывести все тройки различных участников (комбинации без повторений), сумма рейтингов которых равна N. Каждую подходящую тройку вывести в виде (X, Y, Z), а также вывести общее количество найденных троек.

Пользователь вводит список целых чисел. Программа должна найти все возможные пары различных чисел из этого списка, сумма которых является чётной. Вывести каждую пару в формате [a, b], а также общее количество таких пар.

Пользователь вводит список фамилий студентов и фамилию самого успевающего студента. Программа должна найти все возможные комбинации по 3 человека для группового задания, в которые входит указанный отличник. Вывести каждый состав группы в виде строки: "Группа: [Фамилия1], [Фамилия2], [Фамилия3]".

Пользователь вводит список целых чисел. Программа должна найти все возможные пары различных чисел из этого списка, сумма которых является чётной. Вывести каждую пару в формате [a, b], а также общее количество таких пар.

Пользователь вводит список названий книг, среди которых есть два конкретных названия. Программа должна найти все перестановки всех книг на полке, при которых эти две указанные книги не стоят рядом. Вывести общее количество подходящих расстановок и первые 5 из них.

Пользователь вводит два списка: список юношей и список девушек. Программа должна найти все способы выбрать делегацию из 3 человек, в которую входит хотя бы одна девушка и хотя бы один юноша. Вывести каждую делегацию в формате "Делегация: [Имя1], [Имя2], [Имя3]" и их общее количество.

Пользователь вводит список различных натуральных чисел - длин отрезков. Программа должна найти все тройки различных чисел, которые могут быть длинами сторон прямоугольного треугольника (проверьте по теореме Пифагора: \(a^2+b^2=c^2\). Вывести каждую тройку в порядке возрастания: (катет1, катет2, гипотенуза).

Пользователь вводит список чисел, представляющих рейтинг участников, и целевое значение N. Программа должна найти и вывести все тройки различных участников (комбинации без повторений), сумма рейтингов которых равна N. Каждую подходящую тройку вывести в виде (X, Y, Z), а также вывести общее количество найденных троек.

Пользователь вводит список целых чисел. Программа должна найти все возможные пары различных чисел из этого списка, сумма которых является чётной. Вывести каждую пару в формате [a, b], а также общее количество таких пар.

Пользователь вводит список фамилий студентов и фамилию самого успевающего студента. Программа должна найти все возможные комбинации по 3 человека для группового задания, в которые входит указанный отличник. Вывести каждый состав группы в виде строки: "Группа: [Фамилия1], [Фамилия2], [Фамилия3]".

Пользователь вводит список целых чисел. Программа должна найти все возможные пары различных чисел из этого списка, сумма которых является чётной. Вывести каждую пару в формате [a, b], а также общее количество таких пар.

Пользователь вводит список названий книг, среди которых есть два конкретных названия. Программа должна найти все перестановки всех книг на полке, при которых эти две указанные книги не стоят рядом. Вывести общее количество подходящих расстановок и первые 5 из них.

Пользователь вводит два списка: список юношей и список девушек. Программа должна найти все способы выбрать делегацию из 3 человек, в которую входит хотя бы одна девушка и хотя бы один юноша. Вывести каждую делегацию в формате "Делегация: [Имя1], [Имя2], [Имя3]" и их общее количество.

Пользователь вводит список различных натуральных чисел - длин отрезков. Программа должна найти все тройки различных чисел, которые могут быть длинами сторон прямоугольного треугольника (проверьте по теореме Пифагора: \(a^2+b^2=c^2\). Вывести каждую тройку в порядке возрастания: (катет1, катет2, гипотенуза).