Решите задачи, приведённые ниже. Код каждой задачи разместите в отдельном файле, название которого соответствует указанному в условии задачи. В качестве ответа на это задание загрузите архив (ZIP) с решениями. Архив должен содержать только файлы с решениями, файл test.py и вспомогательные файлы, необходимые для отдельных задач (не должно быть папок).

К заданию прилагается файл test.py (в архиве hhww1.zip) c заготовкой для написания тестов с использованием фреймворка pytest. Дополните его тестами для всех задач. Для каждой задачи достаточно рассмотреть принципиально различные ситуации (входные данные). Всего должно быть написано не менее 60 тестов (в прикреплённом файле приведено 8 тестов).

Для запуска тестов необходимо выполнить следующие шаги.

1. Создайте виртуальное окружение:

```
python -m venv ve
```

2. Активируйте виртуальное окружение**:

- Команда для Windows: `ve\Scripts\activate`
- Команда для Linux: `source ve/bin/activate`

3. Установите pytest:

```
pip install pytest
```

4. Запустите тесты

```
pytest test.py
```

Если вы работаете в PowerShell и столкнулись с ошибкой "...Scripts\Activate.ps1 cannot be loaded because running scripts is disabled on this system." необходимо запустить PowerShell с правами администратора и выполнить команду Set-ExecutionPolicy RemoteSigned. Затем перезагрузить PowerShell и ошибка уйдет.

При необходимости замените значение переменной INTERPRETER на команду запуска интерпретатора, которая используется в вашей системе (например, python или py).

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

---

## 1) Скажи "Hello, World!" с помощью Python

Выведите "Hello, World!" на стандартный поток вывода.

**Название файла:** hello.py

---

## 2) Python If-Else

Получив целое число (n), выполните следующие условные действия:

- Если n нечетное значение, выведите "Weird";
- Если n четно и находится в диапазоне от 2 до 5 включительно, выведите "Not Weird";
- Если n четно и находится в диапазоне от 6 до 20 включительно, выведите "Weird";
- Если n четно и больше 20, выведите "Not Weird".

**Формат ввода:** Строка, содержащая положительное целое число (n).

**Ограничения:** 1 ⩽ n ⩽ 100

**Название файла:** python_if_else.py

---

## 3) Арифметические операторы

Считайте два целых числа из стандартного потока ввода (a и b), и напишите код для вывода трех строк, где:

1. Первая строка содержит сумму двух чисел.
2. Вторая строка содержит разницу двух чисел (первое - второе).
3. Третья строка содержит произведение двух чисел.

Например, для a = 3 и b = 5 программа должны вывести:

```
8
-2
15
```

**Формат ввода:** Первая строка содержит первое целое число (a), вторая строка -- второе целое число (b).

**Ограничения:** 1 ⩽ a ⩽ 10¹⁰ 1 ⩽ b ⩽ 10¹⁰

**Название файла:** arithmetic_operators.py

---

## 4) Деление

Считайте два целых числа a и b из стандартного потока ввода.

Реализуйте логику для печати двух строк. Первая строка должна содержать результат целочисленного деления, (a // b). Вторая строка должна содержать результат деления с плавающей точкой (a/b).

Округление или форматирование не требуется. Ваша программа должна корректно отбрабатывать деление на ноль.

Например, при а = 3 и b = 5:

- Результат целочисленного деления 3 // 5 = 0.
- Результатом деления с плавающей точкой является 3 / 5 = 0.6

**Формат ввода:** Первая строка содержит первое целое число (a), вторая строка -- второе целое число (b).

**Название файла:** division.py

---

## 5) Циклы

Считайте целое число n. Для всех неотрицательных целых чисел i < n выведите i².

Например, для n = 3 список неотрицательных целых чисел, которые меньше n, является [0,1,2]. Выведите квадрат каждого числа в отдельной строке:

```
0
1
4
```

**Формат ввода:** Строка, содержащая целое число (n).

**Ограничения:** 1 ⩽ n ⩽ 20

**Название файла:** loops.py

---

## 6) Функция вывода

Считайте целое число n из стандартного потока ввода.

Без использования каких-либо строковых методов попробуйте вывести следующее: 123…n, где «…» означает последовательность числел между 3 и n.

Например, при n = 5 нужно выыести строку "12345".

**Формат ввода:** Строка, содержащая целое число (n).

**Ограничения:** 1 ⩽ n ⩽ 20

**Название файла:** print_function.py

---

## 7) Узнай, кто занял второе место!

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

**Формат ввода:** Первая строка содержит n. Вторая строка содержит массив A[] из n целых чисел, разделённых пробелом.

**Формат вывода:** Выведите результат, занявший второе место.

**Пример ввода:**

```
5
2 3 6 6 5
```

**Пример вывода:** 5

**Объяснение** Дан список [2,3,6,6,5]. Максимальный балл равен 6, второй максимальный - 5. Следовательно, мы выводим 5 как результат, занявший второе место.

**Название файла:** second_score.py

---

## 8) Вложенные списки

Учитывая имена и оценки каждого учащегося в классе, сохраните их во вложенном списке и выведите имя (имена) любого учащегося, имеющего вторую по величине оценку.

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

Например:

```python
records = [['chi', 20.0], ['beta', 50.0], ['alpha', 50.0]]
```

Упорядоченный список оценок - [20.0,50.0], поэтому второй по величине балл - 50.0. Есть два студента с таким баллом: ['beta','alpha']. Имена в алфавитном порядке напечатаны как:

```
alpha
beta
```

**Формат ввода:** Первая строка содержит целое число (N) -- количество учащихся. В 2N последующих строках каждый учащийся описывается в 2 строках:

- В первой строке указано имя учащегося.
- Во второй строке указана его оценка.

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

**Пример ввода:**

```
5
Гарри
37.21
Берри
37.21
Тина
37.2
Акрити
41
Харш
39
```

**Пример вывода:**

```
Берри
Гарри
```

**Объяснение** В этом классе есть 5 учеников, чьи имена и оценки собраны для составления следующего списка:

```python
students = [['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41], ['Harsh', 39]]
```

Самая низкая оценка 37.2 принадлежит Тине. Вторая по величине оценка (37.21) принадлежит как Гарри, так и Берри, поэтому мы упорядочиваем их имена в алфавитном порядке и выводим каждое имя с новой строки.

**Ограничения:** 2 ⩽ N ⩽ 5

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

**Название файла:** nested_list.py

---

## 9) Cписки

Рассмотрим список (arr = []). Вы можете выполнить следующие команды:

1. insert i e: вставить целое число e в позицию i.
2. print: вывести список.
3. remove e: удалить первое вхождение целого числа e.
4. append e: вставить целое число e в конце списка.
5. sort: сортировать список.
6. pop: удалить последний элемент из списка.
7. reverse: перевернуть список.

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

Например:

```
n = 4
append 1
append 2
insert 1 3
print
```

- append 1: Добавить 1 в список, arr=[1].
- append 2: Добавить 2 в список, arr=[1,2].
- insert 1 3: Вставить 3 по индексу 1, arr=[1,3,2].
- print: Вывести массив.

**Вывод:**

```
[1, 3, 2]
```

**Формат ввода:** Первая строка содержит целое число n, обозначающее количество команд. Каждая строка i из n последующих строк содержит одну из команд, описанных выше.

**Ограничения:**

- Элементы, добавляемые в список, должны быть целыми числами.

**Формат вывода:** Для каждой команды типа print выведите список с новой строки.

**Пример ввода**

```
12
insert 0 5
insert 1 10
insert 0 6
print
remove 6
append 9
append 1
sort
print
pop
reverse
print
```

**Пример вывода**

```
[6, 5, 10]
[1, 5, 9, 10]
[9, 5, 1]
```

**Название файла:** lists.py

---

## 10) Пример обмена

Вам дается строка, и ваша задача - поменять регистры местами. Другими словами, преобразуйте все строчные буквы в прописные и наоборот.

Например:

```
Www.MosPolytech.ru → wWW.mOSpOLYTECH.ru
Pythonist 2 → pYTHONIST 2
```

**Формат ввода:** Строка (s), содержащая некоторую последовательность символов.

**Ограничения:** 0 < len(s) ⩽ 1000

**Название файла:** swap_case.py

---

## 11) Разделение и объединение строк

Вам через стандартный поток ввода будет предоставлена строка. Разделите строку по пробелу и соедините получившиеся фрагменты с помощью дефиса.

**Пример ввода:**

```
this is a string
```

**Пример вывода:**

```
this-is-a-string
```

**Название файла:** split_and_join.py

---

## 12) Поиск слова максимальной длины

Напишите программу, которая считывает содержимое файла example.txt (приложен к заданию) и выводит на стандартный поток вывода слово максимальной длины, встречающееся в этом файле. Если таких слов несколько, программа должна вывести все. При подсчёте длины слова не должны учитываться знаки препинания, кавычки и прочие спецсимволы.

**Формат вывода:** Строка, содержащая слово максимальной длины (если таких слов несколько -- каждое на отдельной строке в порядке их встречаемости в тексте).

**Название файла:** max_word.py

---

## 13) Агрегирование данных

В файле products.csv (приложен к заданию) приведены данные ежемесячных трат на продукты для различных категорий потребителей. Напишите программу, которая считывает данные из файла и вычисляет суммарные затраты для каждой категории потребителей (взрослый, пенсионер, ребёнок). Полученные значения выведите на стандартный поток вывода.

**Формат вывода:** Три числа разделённых пробелами -- суммарные затраты для каждой категории потребителей. Каждое число должно быть округлено до двух знаков после десятичного разделителя.

**Название файла:** price_sum.py

---

## 14) Анаграммы

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

**Формат ввода:** Программа получает на вход две строки, содержащие только ASCII-символы, не содержащие пробелы.

**Формат вывода:** Программа должна вывести слово YES, если одна строка может быть получена из другой перестановкой букв или NO.

**Название файла:** anagram.py

---

## 15) Пассажиры в метро

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

**Формат ввода:** Программа получает на вход число пассажиров N. Далее в N строках записано время входа (Aᵢ) и время выхода (Bᵢ) каждого пассажира (Aᵢ < Bᵢ). Время задаётся в виде целого числа -- количества минут от начала работы метрополитена. Значения времени входа и времени выхода разделены пробелом. В следующей строке дано время T.

**Формат вывода:** Выведите одно число: количество пассажиров в момент времени T. Если какой-то пассажир в момент T входит или выходит, то его тоже необходимо посчитать.

**Название файла:** metro.py

---

## 16) Игра миньонов

Кевин и Стюарт хотят сыграть в «Игру миньонов».

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

**Подсчет очков** Игрок получает +1 очко за каждое вхождение подстроки в строку.

Например: Строка = БАНАНА Начальное гласное слово Кевина = АНА. Здесь АНА встречается дважды в БАНАНА. Следовательно, Кевин получит 2 очка.

Для лучшего понимания посмотрите изображение ниже:

Ваша задача — определить победителя игры и его счёт.

**Формат ввода:** Одна строка ввода, содержащая строку S.

**Примечание.** Строка будет содержать только буквы верхнего регистра: [A-Z].

**Формат вывода:** Одна строка, содержащая имя победителя (Кевин или Стюарт) и набранное им количество очков (значения должны быть разделены пробелом).

**Ограничения:** 0 < len(S) ⩽ 10⁶

**Пример ввода:**

```
BANANA
```

**Пример вывода:**

```
Стюарт 12
```

**Название файла:** minion_game.py

---

## 17) Високосный год

Почти каждые четыре года в календарь добавляется дополнительный день — 29 февраля, и этот день называется високосным. Он вносит в календарь поправку на тот факт, что наша планета совершает оборот вокруг Солнца примерно за 365,25 дней.

В григорианском календаре год является високосным, если он соответствует следующим правилам:

- Годы, делящиеся на 100 без остатка, не являются високосными, за исключением годов, которые делятся на 400 без остатка. Например, 1900 год не является високосным, а 2000 год — является.
- Годы делящиеся на 4 без остатка (например, 2016, 2024), являются високосными.

Это означает, что в григорианском календаре 2000 и 2400 годы являются високосными, а 1800, 1900, 2100, 2200, 2300 и 2500 НЕ являются високосными.(https://www.timeanddate.com/date/leapyear.html)

**Задача** Напишите функцию, позволяющую определить, является ли год високосным. Если это високосный год, верните логическое значение True, в противном случае верните False.

Ваша программа должна считывать год для проверки из стандартного потока ввода.

**Формат ввода:** Строка, содержащая год для проверки (year).

**Ограничения:** 1900 ⩽ year ⩽ 10⁵

**Выходной формат:** Результат вызова функции (True/False).

**Название файла:** is_leap.py

---

## 18) Предпочтения

Вам дан массив из n целых чисел. Существуют также 2 непересекающиеся множества A и B, каждое из которых содержит m целых чисел. Вам нравятся все числа в наборе A и не нравятся все числа в наборе B. Ваше первоначальное настроение равно 0. Для каждого целого числа i в массиве, если i ∈ A, ваше настроение повышается на 1. Если i ∈ B, ваше настроение уменьшается на 1. В противном случае ваше настроение не изменится. В конце выведите своё окончательное настроение.

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

**Ограничения:** 1 ⩽ n ⩽ 10⁵ 1 ⩽ m ⩽ 10⁵ 1 ⩽ i ⩽ 10⁹

**Формат ввода:** Первая строка содержит целые числа n и m, разделённые пробелом. Вторая строка содержит n целых чисел — элементы массива. Третья и четвёртая строки содержат по m целых чисел, входящих в множества A и B соответственно.

**Формат вывода:** Выведите одно целое число — ваше общее настроение.

**Пример ввода:**

```
3 2
1 5 3
3 1
5 7
```

**Пример вывода:**

```
1
```

**Название файла:** happiness.py

---

## 19) Пиратский корабль

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

**Формат ввода:** Первая строка содержит целые числа n и m, разделённые пробелом (n -- грузоподъёмность судна, m -- количество наименований грузов). Далее идёт m срок, в каждой из которых содержится по три значения: название груза, вес (целое число), стоимость (целое число).

**Формат вывода:** Выведите в порядке убывания стоимости список грузов, которые нужно погрузить на корабль. Каждый груз выведите в отдельной строке в формате "название вес стоимость" (вес и стоимость должны быть указаны с учётом ограничения грузоподъёмности судна, в случае дробных значений округлите до второго знака после десятичного разделителя).

**Название файла:** pirate_ship.py

---

## 20) Произведение матриц

Напишите функцию, которая вычисляет произведение двух квадратных матриц (A и B). При реализации нельзя использовать сторонние библиотеки (NumPy и т. д.).

**Формат ввода:** Первая строка содержит целое число n -- размерность матрицы. Далее идут 2n строк, содержащие по n целых чисел, разделённых пробелами, -- содержимое матриц (первые n строк относятся к матрице A, остальные -- к матрице B).

**Формат вывода:** Произведение матриц A и B (n строк по n целых чисел, разделённых пробелами).

**Ограничения:** 2 ⩽ n ⩽ 10

**Название файла:** matrix_mult.py