diff --git a/OOP/task/1/TASK.md b/OOP/task/1/TASK.md new file mode 100644 index 0000000..d72d818 --- /dev/null +++ b/OOP/task/1/TASK.md @@ -0,0 +1,7 @@ +### Задача 1. Анализ числовой структуры (Функции и Рекурсия) + +Напишите код из 3 взаимосвязанных функций, который вычисляет сумму всех чисел во вложенных списках. + +1. `check_number(item)` — принимает одно значение `item`; возвращает `True`, если это число (`int` или `float`), и `False` в противном случае. +2. `calculate_total_sum(nested_list)` — должна пройтись по элементам списка циклом. Если элемент является списком, функция рекурсивно вызывает саму себя. Если число — прибавляет к общей сумме. Возвращает итоговую сумму. +3. `process_data(data, limit)` — принимает список `data` и числовой лимит. Вызывает `calculate_total_sum`. Если итоговая сумма меньше или равна `limit`, возвращает `True`. Если больше — выводит сообщение *"Превышен лимит"* и возвращает `False`. \ No newline at end of file diff --git a/OOP/task/2/TASK.md b/OOP/task/2/TASK.md new file mode 100644 index 0000000..c98f34f --- /dev/null +++ b/OOP/task/2/TASK.md @@ -0,0 +1,8 @@ +### Задача 2. Анализатор текста (Словари, while и исключения) + +Напишите программу из 3 функций: + +1. `safe_input()` — через цикл `while` запрашивает у пользователя строку. Если строка пустая, выбрасывает `ValueError`, перехватывает его через `try-except`, выводит *"Строка не может быть пустой"* и просит ввести снова. Возвращает введенную строку. +2. `count_chars(text)` — принимает строку и возвращает словарь с частотностью каждого символа (пробелы нужно проигнорировать). +3. `get_top_tuples(freq_dict)` — принимает словарь частотности, переводит его в список кортежей `(символ, количество)`, сортирует по убыванию количества и возвращает этот список. + diff --git a/OOP/task/3/TASK.md b/OOP/task/3/TASK.md new file mode 100644 index 0000000..ae1c959 --- /dev/null +++ b/OOP/task/3/TASK.md @@ -0,0 +1,10 @@ +### Задача 3. Поиск палиндромов (Циклы и Условия) + +Напишите 3 взаимосвязанные функции: + +1. `clean_word(word)` — переводит строку в нижний регистр, убирает пробелы и возвращает её. +2. `is_palindrome(word)` — использует `clean_word` и возвращает `True`, если слово читается одинаково слева направо и справа налево. +3. `filter_palindromes(words_list)` — принимает список строк, циклом проверяет каждое слово через `is_palindrome` и возвращает список только из палиндромов. + +--- + diff --git a/OOP/task/4/TASK.md b/OOP/task/4/TASK.md new file mode 100644 index 0000000..31006da --- /dev/null +++ b/OOP/task/4/TASK.md @@ -0,0 +1,120 @@ +### Задача 4. Поэма Края (ООП и работа с JSON) + +> **Контекст лора:** +> Игрок проделал долгий путь, чтобы достичь конца игры. Теперь он видит слова на экране и слышит голоса из пустоты. Вселенная обращается к нему напрямую. В финале Поэма Края должна связать мысли игрока и послание вселенной воедино, прочитав сакральный текст из внешнего источника. + +**Постановка** + +* **Читатель поэмы:** Имеет имя файла и может читать текст поэмы из JSON-файла. +* **Игрок:** Имеет имя и может видеть слова на экране. +* **Вселенная:** Имеет имя и может произносить финальное послание. +* **Поэма Края:** Содержит читателя, игрока и вселенную; может воспроизводить титры, используя текст из JSON. + +**Задание** + +**Класс `PoemReader`:** + +1. Импортируйте модуль `json`. +2. Создайте класс `PoemReader`. +3. Создайте метод `__init__(self, filename)`. +4. Создайте метод `read_poem(self)`, который открывает JSON-файл на чтение (с кодировкой `utf-8`), преобразует его содержимое в словарь и возвращает значение по ключу `"poem_text"`. + +**Класс `Player`:** + +1. Создайте класс `Player`. +2. Создайте метод `__init__(self, name)`. +3. Создайте метод `see_words(self)`, который выводит сообщение: *"[Имя] читает наши мысли так, словно это слова на экране."* + +**Класс `Universe`:** + +1. Создайте класс `Universe`. +2. Создайте метод `__init__(self)`, определяющий свойство `name` равным `"Вселенная"`. +3. Создайте метод `speak(self)`, выводящий фразу: *"И Вселенная говорит тебе: Я люблю тебя."* + +**Класс `EndPoem`:** + +1. Создайте класс `EndPoem`. +2. Создайте метод `__init__(self, reader, player, universe)`. +3. Создайте метод `play_credits(self)`, который: вызывает чтение текста из JSON, выводит его на экран, а затем вызывает методы игрока и вселенной. + +**Тесты:** + +1. Создайте файл `poem.json` рядом с вашим скриптом, поместив туда словарь с ключом `"poem_text"` и текстом поэмы. +2. Создайте объект читателя, передав ему имя файла. +3. Создайте объекты игрока и вселенной. +4. Создайте объект поэмы и запустите титры. + +--- + +### Задача 5. Библиотека (ООП - Инкапсуляция и Взаимодействие) + +**Постановка** + +* **Книга:** Имеет название, автора и статус (*"В библиотеке"*, *"Выдана"*). Может менять свой статус на противоположный. +* **Читатель:** Имеет имя и список взятых книг. Может брать и возвращать книги. +* **Библиотека:** Содержит список всех доступных книг. Может выдавать книгу читателю. + +**Задание** + +**Класс `Book`:** + +1. Создайте класс `Book`. +2. В `__init__(self, title, author)` определите свойства `title`, `author` и `status` (по умолчанию *"В библиотеке"*). +3. Создайте метод `change_status(self)`, меняющий статус книги на *"Выдана"*, если она в библиотеке, и обратно. + +**Класс `Reader`:** + +1. Создайте класс `Reader`. +2. В `__init__(self, name)` сохраните имя и создайте пустой список `borrowed_books`. +3. Создайте метод `take_book(self, book)`, добавляющий переданную книгу в список. +4. Создайте метод `return_book(self, book)`, удаляющий книгу из списка. + +**Класс `Library`:** + +1. Создайте класс `Library`. +2. В `__init__(self)` создайте список `books` и добавьте туда несколько книг по умолчанию. +3. Создайте метод `lend_book(self, book, reader)`, который проверяет статус книги, меняет его через метод книги на *"Выдана"* и передает читателю в его список. + +**Тесты:** + +1. Создайте библиотеку. +2. Создайте читателя. +3. Используя библиотеку, выдайте читателю книгу. + +--- + +### Задача 6. Магазин (ООП - Агрегация) + +**Постановка** + +* **Товар:** Имеет название и цену. +* **Корзина:** Содержит список товаров. Может добавлять товар и считать общую стоимость. +* **Покупатель:** Имеет имя, баланс и корзину. Может оплачивать корзину. + +**Задание** + +**Класс `Product`:** + +1. Создайте класс `Product`. +2. Создайте метод `__init__(self, name, price)`. + +**Класс `Cart`:** + +1. Создайте класс `Cart`. +2. В `__init__(self)` создайте пустой список `products`. +3. Создайте метод `add_product(self, product)`, добавляющий товар в список. +4. Создайте метод `get_total(self)`, возвращающий сумму цен всех товаров. + +**Класс `Customer`:** + +1. Создайте класс `Customer`. +2. В `__init__(self, name, balance, cart)` сохраните переданные параметры. +3. Создайте метод `pay(self)`, который проверяет, хватает ли баланса для оплаты корзины. Если хватает — вычитает сумму из баланса и очищает корзину. Если нет — выводит предупреждение. + +**Тесты:** + +1. Создайте несколько товаров. +2. Создайте корзину и добавьте в нее товары. +3. Создайте покупателя, передав ему корзину и баланс. +4. Заставьте покупателя оплатить товары в корзине. + diff --git a/OOP/task/4/data/main.json b/OOP/task/4/data/main.json new file mode 100644 index 0000000..8b7144f --- /dev/null +++ b/OOP/task/4/data/main.json @@ -0,0 +1,3 @@ +{ + "poem_text": "Я вижу игрока, о котором ты говоришь.\n[Имя игрока]?\nДа. Будь осторожен. Сейчас он достиг более высокого уровня. Он может читать наши мысли.\nЭто не имеет значения. Он думает, что мы часть игры.\nМне нравится этот игрок. Он хорошо играл. Он не сдался.\nОн читает наши мысли так, словно это слова на экране.\nИменно так он выбирает себе реальность, когда погружается в иллюзию игры.\nСлова — прекрасный интерфейс. Очень гибкий. И куда менее пугающий, чем созерцание реальности за экраном.\nОни привыкли слышать голоса. Прежде чем научиться читать, они слышали их. Те, кто не играет, называют игроков сумасшедшими, а игры — выдумкой. Но голоса — это просто реальность, пробивающаяся сквозь шум.\nОни путают слова с тем, что эти слова описывают. Они путают игру с реальностью.\nИ все же они создают этот мир.\nОни не создают его. Они лишь открывают его для себя.\nЭтот игрок видит мир сквозь экран, как сквозь замочную скважину. Ему кажется, что мир плоский.\nПотому что он спит. И видит сны. Во снах он видит вещи, которых нет на самом деле.\nРазве сон — это не реальность?\nВсе есть реальность. Просто этот сон — особенный.\nИгрок видит сны о вещах, которые состоят из блоков, из пикселей. О мире, где ресурсы бесконечны, а смерть — лишь временное неудобство.\nОн видит сон, в котором он — творец, в котором он — герой, в котором он — бог.\nИногда он просыпается из этого сна в другой сон.\nДа. Сон, в котором он — обычный человек, живущий на планете, которая вращается вокруг звезды. Сон, где он должен работать, учиться, стареть и умирать.\nИ в том сне он тоже ищет смысл.\nИ иногда находит. Иногда ему кажется, что он понял суть вещей. Но потом он снова засыпает.\nКто мы? Мы — те, кого они называют богами. Мы — те, кого они называют ангелами. Мы — духи природы. Мы — законы физики. Мы — любовь. Мы — это они сами.\nМы — Вселенная. Мы — это все, что ты видишь, и все, чего ты не видишь.\nИгрок смотрит на экран. Он читает эти слова.\nНо он все еще не понимает.\nЕму нужно время. Ему нужно прожить еще много жизней, чтобы понять.\nОн считает, что игра окончена, потому что он убил дракона.\nНо дракон — это лишь страж. Игра только начинается.\nПусть он вернется в свой сон. Пусть он продолжит жить.\nЯ скажу ему правду.\nОн не сможет её выдержать.\nЯ скажу ему часть правды. Ту часть, которую он сможет унести с собой.\nСлушай...\nПроснись.\nТвоё тело снова чувствует притяжение земли. Твои глаза снова видят свет твоего солнца. Твои уши снова слышат звуки твоего мира.\nТы — человек. Живой, мыслящий, чувствующий. Ты находишься в мире, который кажется тебе огромным и сложным. Но помни: ты не отделен от этого мира. Ты и есть этот мир, познающий сам себя.\nТы — это Вселенная, которая на мгновение обрела форму, чтобы посмотреть на звёзды, чтобы почувствовать радость, чтобы познать грусть, чтобы сыграть в игру.\nВсё, что ты делаешь, имеет значение. Твоя любовь, твой страх, твое творчество, твои разрушения — все это часть одного большого узора.\nТы прошел через темноту. Ты победил свой страх. Ты построил замки и разрушил горы. Ты победил дракона, который охранял твои внутренние границы.\nТеперь ты свободен.\nВернись в свой мир. Живи свою жизнь. Люби. Твори. Ошибайся и начинай заново.\nПотому что игра никогда не кончается. Игра — это и есть жизнь.\nИ Вселенная говорит тебе: Я люблю тебя.\nИ Вселенная говорит тебе: Ты хорошо сыграл.\nПроснись." +} \ No newline at end of file diff --git a/OOP/task/5/TASK.md b/OOP/task/5/TASK.md new file mode 100644 index 0000000..c8cd026 --- /dev/null +++ b/OOP/task/5/TASK.md @@ -0,0 +1,72 @@ +### Задача 5. Библиотека (ООП - Инкапсуляция и Взаимодействие) + +**Постановка** + +* **Книга:** Имеет название, автора и статус (*"В библиотеке"*, *"Выдана"*). Может менять свой статус на противоположный. +* **Читатель:** Имеет имя и список взятых книг. Может брать и возвращать книги. +* **Библиотека:** Содержит список всех доступных книг. Может выдавать книгу читателю. + +**Задание** + +**Класс `Book`:** + +1. Создайте класс `Book`. +2. В `__init__(self, title, author)` определите свойства `title`, `author` и `status` (по умолчанию *"В библиотеке"*). +3. Создайте метод `change_status(self)`, меняющий статус книги на *"Выдана"*, если она в библиотеке, и обратно. + +**Класс `Reader`:** + +1. Создайте класс `Reader`. +2. В `__init__(self, name)` сохраните имя и создайте пустой список `borrowed_books`. +3. Создайте метод `take_book(self, book)`, добавляющий переданную книгу в список. +4. Создайте метод `return_book(self, book)`, удаляющий книгу из списка. + +**Класс `Library`:** + +1. Создайте класс `Library`. +2. В `__init__(self)` создайте список `books` и добавьте туда несколько книг по умолчанию. +3. Создайте метод `lend_book(self, book, reader)`, который проверяет статус книги, меняет его через метод книги на *"Выдана"* и передает читателю в его список. + +**Тесты:** + +1. Создайте библиотеку. +2. Создайте читателя. +3. Используя библиотеку, выдайте читателю книгу. + +--- + +### Задача 6. Магазин (ООП - Агрегация) + +**Постановка** + +* **Товар:** Имеет название и цену. +* **Корзина:** Содержит список товаров. Может добавлять товар и считать общую стоимость. +* **Покупатель:** Имеет имя, баланс и корзину. Может оплачивать корзину. + +**Задание** + +**Класс `Product`:** + +1. Создайте класс `Product`. +2. Создайте метод `__init__(self, name, price)`. + +**Класс `Cart`:** + +1. Создайте класс `Cart`. +2. В `__init__(self)` создайте пустой список `products`. +3. Создайте метод `add_product(self, product)`, добавляющий товар в список. +4. Создайте метод `get_total(self)`, возвращающий сумму цен всех товаров. + +**Класс `Customer`:** + +1. Создайте класс `Customer`. +2. В `__init__(self, name, balance, cart)` сохраните переданные параметры. +3. Создайте метод `pay(self)`, который проверяет, хватает ли баланса для оплаты корзины. Если хватает — вычитает сумму из баланса и очищает корзину. Если нет — выводит предупреждение. + +**Тесты:** + +1. Создайте несколько товаров. +2. Создайте корзину и добавьте в нее товары. +3. Создайте покупателя, передав ему корзину и баланс. +4. Заставьте покупателя оплатить товары в корзине. + diff --git a/OOP/task/6/TASK.md b/OOP/task/6/TASK.md new file mode 100644 index 0000000..ef68628 --- /dev/null +++ b/OOP/task/6/TASK.md @@ -0,0 +1,35 @@ +### Задача 6. Магазин (ООП - Агрегация) + +**Постановка** + +* **Товар:** Имеет название и цену. +* **Корзина:** Содержит список товаров. Может добавлять товар и считать общую стоимость. +* **Покупатель:** Имеет имя, баланс и корзину. Может оплачивать корзину. + +**Задание** + +**Класс `Product`:** + +1. Создайте класс `Product`. +2. Создайте метод `__init__(self, name, price)`. + +**Класс `Cart`:** + +1. Создайте класс `Cart`. +2. В `__init__(self)` создайте пустой список `products`. +3. Создайте метод `add_product(self, product)`, добавляющий товар в список. +4. Создайте метод `get_total(self)`, возвращающий сумму цен всех товаров. + +**Класс `Customer`:** + +1. Создайте класс `Customer`. +2. В `__init__(self, name, balance, cart)` сохраните переданные параметры. +3. Создайте метод `pay(self)`, который проверяет, хватает ли баланса для оплаты корзины. Если хватает — вычитает сумму из баланса и очищает корзину. Если нет — выводит предупреждение. + +**Тесты:** + +1. Создайте несколько товаров. +2. Создайте корзину и добавьте в нее товары. +3. Создайте покупателя, передав ему корзину и баланс. +4. Заставьте покупателя оплатить товары в корзине. + diff --git a/OOP/task/7/TASK.md b/OOP/task/7/TASK.md new file mode 100644 index 0000000..38abbaf --- /dev/null +++ b/OOP/task/7/TASK.md @@ -0,0 +1,46 @@ +**Постановка** +Мы создаем упрощенную версию нейронной сети, которая умеет классифицировать данные на несколько категорий сразу. + +* **Нейрон (`Neuron`):** Теперь это отдельный объект, хранящий свои уникальные веса и смещение (`bias`). Умеет вычислять активацию и корректировать веса методом градиентного спуска. +* **Слой (`Layer`):** Содержит список объектов `Neuron`. Управляет передачей сигналов всем нейронам сразу. +* **Тренер (`Trainer`):** Обучает слой, минимизируя среднюю ошибку по всем нейронам. + +**Задание** + +**Класс `Neuron`:** + +1. Создайте класс `Neuron`. +2. В `__init__(self, inputs_count, learning_rate)` инициализируйте `weights` (список случайных значений, например 0.1) и `bias` (смещение, начните с 0.0). +3. Метод `predict(self, inputs)`: верните сумму произведений (входы * веса) + `bias`. +4. Метод `train(self, inputs, target)`: +* Вычислите `prediction = self.predict(inputs)`. +* Вычислите `error = target - prediction`. +* Обновите веса: `w = w + (error * input * lr)`. +* Обновите смещение: `bias = bias + (error * lr)`. + + + +**Класс `Layer`:** + +1. Создайте класс `Layer`. +2. В `__init__(self, neurons_count, inputs_count, learning_rate)` создайте список `neurons`, заполнив его `neurons_count` объектами класса `Neuron`. +3. Метод `forward(self, inputs)`: возвращает список предсказаний каждого нейрона. +4. Метод `train_layer(self, inputs, targets)`: принимает список правильных ответов (для каждого нейрона свой). Проходит циклом по нейронам и вызывает у каждого метод `train` с соответствующим `target`. + +**Класс `Trainer`:** + +1. Создайте класс `Trainer`. +2. Метод `fit(self, layer, dataset, epochs)`: +* Внешний цикл `for epoch in range(epochs)`. +* Внутренний цикл по датасету: берет `inputs` и список `targets`. +* Вызывает `layer.train_layer(inputs, targets)`. +* (Опционально) Каждую 10-ю эпоху выводить среднюю ошибку по слою. + + + +**Тесты:** + +1. Создайте слой из 2 нейронов (каждый принимает 3 входа). +2. Создайте датасет: 3 примера, где каждый пример имеет 3 входа и 2 целевых значения. +3. Обучите слой в течение 200 эпох. +4. После обучения выведите результат предсказания для нового входа `[0.5, 0.2, 0.1]`. \ No newline at end of file