├── Веб-технологии
└── web
│ ├── ask
│ ├── ask
│ │ ├── __init__.py
│ │ ├── wsgi.py
│ │ ├── urls.py
│ │ └── settings.py
│ ├── qa
│ │ ├── __init__.py
│ │ ├── tests.py
│ │ ├── admin.py
│ │ ├── models.py
│ │ ├── forms.py
│ │ └── views.py
│ ├── templates
│ │ ├── login.html
│ │ ├── ask.html
│ │ ├── signup.html
│ │ ├── question.html
│ │ ├── index.html
│ │ └── popular.html
│ └── manage.py
│ ├── nginx.conf
│ └── init.sh
├── Python - основы и применение
├── README.md
├── 1.1 Введение 10.md
├── 3.3 Регулярные выражения в Python 10.md
├── 3.3 Регулярные выражения в Python 15.md
├── 1.3 Функции и стек вызовов 9.md
├── 3.3 Регулярные выражения в Python 9.md
├── 3.3 Регулярные выражения в Python 12.md
├── 2.4 Работа с файловой системой и файлами 4.md
├── 3.3 Регулярные выражения в Python 11.md
├── 3.3 Регулярные выражения в Python 14.md
├── 3.3 Регулярные выражения в Python 13.md
├── 3.5 Распространённые форматы текстовых файлов CSV, JSON 2.md
├── 2.5 Работа с функциями - functool и лямбда функции 6.md
├── 3.5 Распространённые форматы текстовых файлов CSV, JSON 2 (2).md
├── 3.3 Регулярные выражения в Python 8.md
├── 3.3 Регулярные выражения в Python 7.md
├── 2.1 Ошибки и исключения 6.md
├── 2.1 Ошибки и исключения 9.md
├── 2.4 Работа с файловой системой и файлами 6.md
├── 3.2 Стандартные методы и функции для строк 7.md
├── 1.6 Наследование классов 9.md
├── 2.3 Итераторы и генераторы 5.md
├── 1.2 Модель данных - объекты 9.md
├── 2.2 Работа с кодом - модули и импорт 5.md
├── 1.5 Введение в классы 8.md
├── 3.6 API 3.md
├── 2.2 Работа с кодом - модули и импорт 9.md
├── 3.2 Стандартные методы и функции для строк 6.md
├── 1.3 Функции и стек вызовов 15.md
├── 3.4 Обзорно об интернете http-запросы, html-страницы и requests 7.md
├── 3.5 Распространённые форматы текстовых файлов CSV, JSON 4.md
├── 1.6 Наследование классов 8.md
├── 3.7 XML, библиотека ElementTree, библиотека lxml 4.md
├── 3.4 Обзорно об интернете http-запросы, html-страницы и requests 6.md
├── 1.5 Введение в классы 9.md
├── 1.6 Наследование классов 7.md
├── 3.6 API 4.md
├── 2.1 Ошибки и исключения 7.md
├── 2.3 Итераторы и генераторы 4.md
└── 1.4 Пространства имён и область видимости 9.md
├── Интерактивный тренажер по SQL
├── 2 Связи между таблицами
│ ├── 1.2 Выборка данных
│ │ ├── 2 Выборка отдельных столбцов.md
│ │ ├── 7 Выборка данных по условию.md
│ │ ├── 3 Выборка новых столбцов и присвоение им новых имен.md
│ │ ├── 9 Выборка данных, операторы BETWEEN, IN.md
│ │ ├── 1 Выборка всех данных.md
│ │ ├── 8 Выборка данных, логические операции.md
│ │ ├── 10 Выборка данных с сортировкой.md
│ │ ├── 4 Выборка данных с созданием вычисляемого столбца.md
│ │ ├── 5 Выборка данных, вычисляемые столбцы, математические функции.md
│ │ ├── 11 Выборка данных, оператор LIKE.md
│ │ └── 6 Выборка данных, вычисляемые столбцы, логические функции.md
│ ├── 1.3 Запросы, групповые операции
│ │ ├── 1 Выбор уникальных элементов столбца.md
│ │ ├── 5 Вычисления по таблице целиком.md
│ │ ├── 2 Выборка данных, групповые функции SUM и COUNT.md
│ │ ├── 3 Выборка данных, групповые функции MIN, MAX и AVG.md
│ │ ├── 6 Выборка данных по условию, групповые функции.md
│ │ ├── 7 Выборка данных по условию, групповые функции, WHERE и HAVING.md
│ │ └── 4 Выборка данных c вычислением, групповые функции.md
│ ├── 1.5 Запросы корректировки данных
│ │ ├── 5 Запросы на обновление.md
│ │ ├── 1 Создание пустой таблицы.md
│ │ ├── 3 Добавление записей из другой таблицы.md
│ │ ├── 2 Добавление записей в таблицу.md
│ │ ├── 6 Запросы на обновление нескольких столбцов.md
│ │ ├── 8 Запросы на удаление.md
│ │ ├── 4 Добавление записей, вложенные запросы.md
│ │ ├── 7 Запросы на обновление нескольких таблиц.md
│ │ └── 9 Запросы на создание таблицы.md
│ ├── 2.1 Связи между таблицами
│ │ ├── 2.md
│ │ ├── 1.md
│ │ ├── 5.md
│ │ ├── 4 Действия при удалении записи главной таблицы.md
│ │ └── 3 Создание таблицы с внешними ключами.md
│ ├── 2.2 Запросы на выборку, соединение таблиц
│ │ ├── 2 Внешнее соединение LEFT и RIGHT OUTER JOIN.md
│ │ ├── 1 Соединение INNER JOIN.md
│ │ ├── 4 Запросы на выборку из нескольких таблиц.md
│ │ ├── 5 Запросы для нескольких таблиц с группировкой.md
│ │ ├── 3 Перекрестное соединение CROSS JOIN.md
│ │ ├── 6 Запросы для нескольких таблиц со вложенными запросами.md
│ │ ├── 8 Операция соединение, использование USING().md
│ │ └── 7 Вложенные запросы в операторах соединения.md
│ ├── 2.3 Запросы корректировки, соединение таблиц
│ │ ├── 4 Запрос на обновление, вложенные запросы.md
│ │ ├── 5 Каскадное удаление записей связанных таблиц.md
│ │ ├── 6 Удаление записей главной таблицы с сохранением записей в зависимой.md
│ │ ├── 3 Запрос на добавление, связанные таблицы.md
│ │ ├── 2 Запросы на добавление, связанные таблицы.md
│ │ ├── 7 Удаление записей, использование связанных таблиц.md
│ │ └── 1 Запросы на обновление, связанные таблицы.md
│ ├── 1.4 Вложенные запросы
│ │ ├── 4 Вложенный запрос, операторы ANY и ALL.md
│ │ ├── 3 Вложенный запрос, оператор IN.md
│ │ ├── 2 Использование вложенного запроса в выражении.md
│ │ ├── 1 Вложенный запрос, возвращающий одно значение.md
│ │ └── 5 Вложенный запрос после SELECT.md
│ └── 1.1 Отношение (таблица)
│ │ ├── 1 Создание таблицы.md
│ │ ├── 2 Вставка записи в таблицу.md
│ │ └── 3 Вставка записи в таблицу.md
├── 1 Основы реляционной модели
│ ├── 1.2 Выборка данных
│ │ ├── 2 Выборка отдельных столбцов.md
│ │ ├── 7 Выборка данных по условию.md
│ │ ├── 3 Выборка новых столбцов и присвоение им новых имен.md
│ │ ├── 9 Выборка данных, операторы BETWEEN, IN.md
│ │ ├── 1 Выборка всех данных.md
│ │ ├── 8 Выборка данных, логические операции.md
│ │ ├── 10 Выборка данных с сортировкой.md
│ │ ├── 4 Выборка данных с созданием вычисляемого столбца.md
│ │ ├── 5 Выборка данных, вычисляемые столбцы, математические функции.md
│ │ ├── 11 Выборка данных, оператор LIKE.md
│ │ └── 6 Выборка данных, вычисляемые столбцы, логические функции.md
│ ├── 1.3 Запросы, групповые операции
│ │ ├── 1 Выбор уникальных элементов столбца.md
│ │ ├── 5 Вычисления по таблице целиком.md
│ │ ├── 2 Выборка данных, групповые функции SUM и COUNT.md
│ │ ├── 3 Выборка данных, групповые функции MIN, MAX и AVG.md
│ │ ├── 6 Выборка данных по условию, групповые функции.md
│ │ ├── 7 Выборка данных по условию, групповые функции, WHERE и HAVING.md
│ │ └── 4 Выборка данных c вычислением, групповые функции.md
│ ├── 1.5 Запросы корректировки данных
│ │ ├── 5 Запросы на обновление.md
│ │ ├── 1 Создание пустой таблицы.md
│ │ ├── 3 Добавление записей из другой таблицы.md
│ │ ├── 2 Добавление записей в таблицу.md
│ │ ├── 6 Запросы на обновление нескольких столбцов.md
│ │ ├── 8 Запросы на удаление.md
│ │ ├── 4 Добавление записей, вложенные запросы.md
│ │ ├── 7 Запросы на обновление нескольких таблиц.md
│ │ └── 9 Запросы на создание таблицы.md
│ ├── 1.4 Вложенные запросы
│ │ ├── 4 Вложенный запрос, операторы ANY и ALL.md
│ │ ├── 3 Вложенный запрос, оператор IN.md
│ │ ├── 2 Использование вложенного запроса в выражении.md
│ │ ├── 1 Вложенный запрос, возвращающий одно значение.md
│ │ └── 5 Вложенный запрос после SELECT.md
│ └── 1.1 Отношение (таблица)
│ │ ├── 1 Создание таблицы.md
│ │ ├── 2 Вставка записи в таблицу.md
│ │ └── 3 Вставка записи в таблицу.md
└── 3 Базы данных и SQL-запросы
│ ├── 2.1 Связи между таблицами
│ ├── 2.md
│ ├── 1.md
│ ├── 5.md
│ ├── 4 Действия при удалении записи главной таблицы.md
│ └── 3 Создание таблицы с внешними ключами.md
│ ├── 2.2 Запросы на выборку, соединение таблиц
│ ├── 2 Внешнее соединение LEFT и RIGHT OUTER JOIN.md
│ ├── 1 Соединение INNER JOIN.md
│ ├── 4 Запросы на выборку из нескольких таблиц.md
│ ├── 5 Запросы для нескольких таблиц с группировкой.md
│ ├── 3 Перекрестное соединение CROSS JOIN.md
│ ├── 6 Запросы для нескольких таблиц со вложенными запросами.md
│ ├── 8 Операция соединение, использование USING().md
│ └── 7 Вложенные запросы в операторах соединения.md
│ └── 2.3 Запросы корректировки, соединение таблиц
│ ├── 4 Запрос на обновление, вложенные запросы.md
│ ├── 5 Каскадное удаление записей связанных таблиц.md
│ ├── 6 Удаление записей главной таблицы с сохранением записей в зависимой.md
│ ├── 3 Запрос на добавление, связанные таблицы.md
│ ├── 2 Запросы на добавление, связанные таблицы.md
│ ├── 7 Удаление записей, использование связанных таблиц.md
│ └── 1 Запросы на обновление, связанные таблицы.md
├── Python Course tasks
├── week 10
│ ├── primes.md
│ └── kvadrat.md
├── week 6
│ └── first.md
├── week 7
│ ├── friends.md
│ ├── fix_duplicates.md
│ └── average_attempts.md.py
├── week 11
│ ├── student_ids.md
│ ├── coords_min_max.md
│ └── irises.md
└── week 3
│ └── life.py
├── Алгоритмы методы
├── 2.2 Числа Фибоначчи.md
├── 2.3 Наибольший общий делитель.md
├── 2.3 Числа Фибоначчи.md
├── 4.1.11 Различные слагаемые.md
├── 6.1.4 Двоичный поиск.md
├── 4.3.8 Очередь с приоритетами.md
├── 4.1.10 Непрерывный рюкзак.md
├── 4.1.9 Покрыть отрезки точками.md
├── 4.2.5 Кодирование Хаффмана.md
└── 4.2.6 Декодирование Хаффмана.md
└── Адаптивный тренажёр Python
├── 5.19 Find a substring.md
├── 5.15 Simple continued fraction.md
├── 5.10 Length translator.md
├── 9.1 Durak.md
├── 7.1 Minesweeper field.md
├── 5.20 Game of life.md
└── 9.2 Poker hand.md
/Веб-технологии/web/ask/ask/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/qa/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/qa/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/templates/login.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/templates/ask.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/templates/signup.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Python - основы и применение/README.md:
--------------------------------------------------------------------------------
1 | Решения из текущего репозитория представлены исключительно в демонстрационных целях. Пожалуйста, используйте собственные решения чтобы получить сертификат Stepic. Plagiarism is bad, mkay?
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/2 Выборка отдельных столбцов.md:
--------------------------------------------------------------------------------
1 | # Выборка отдельных столбцов
2 |
3 | ## Задание
4 |
5 | Выбрать авторов, название книг и их цену из таблицы **book**.
6 |
7 | ## Решение
8 |
9 | ```
10 | select author, title, price from book
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/2 Выборка отдельных столбцов.md:
--------------------------------------------------------------------------------
1 | # Выборка отдельных столбцов
2 |
3 | ## Задание
4 |
5 | Выбрать авторов, название книг и их цену из таблицы **book**.
6 |
7 | ## Решение
8 |
9 | ```
10 | select author, title, price from book
11 | ```
12 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | import os
3 | import sys
4 |
5 | if __name__ == "__main__":
6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ask.settings")
7 |
8 | from django.core.management import execute_from_command_line
9 |
10 | execute_from_command_line(sys.argv)
11 |
--------------------------------------------------------------------------------
/Python Course tasks/week 10/primes.md:
--------------------------------------------------------------------------------
1 | Выведите на печать все простые числа до 1000 через пробел.
2 |
3 | Ограничьтесь одной строкой и 200 символами.
4 |
5 | **Решение**
6 |
7 | ```python
8 | print(' '.join([str(2)] + [str(n) for n in range(3, 1001, 2) if all([False if n % x == 0 else True for x in range(2, int(n ** 0.5 + 1))])]))
9 | ```
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/7 Выборка данных по условию.md:
--------------------------------------------------------------------------------
1 | # Выборка данных по условию
2 |
3 | ## Задание
4 |
5 | Вывести автора, название и цены тех книг, количество которых меньше 10.
6 |
7 | ## Решение
8 |
9 | ```
10 | select author, title, price from book where amount < 10;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/7 Выборка данных по условию.md:
--------------------------------------------------------------------------------
1 | # Выборка данных по условию
2 |
3 | ## Задание
4 |
5 | Вывести автора, название и цены тех книг, количество которых меньше 10.
6 |
7 | ## Решение
8 |
9 | ```
10 | select author, title, price from book where amount < 10;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.3 Запросы, групповые операции/1 Выбор уникальных элементов столбца.md:
--------------------------------------------------------------------------------
1 | # Выбор уникальных элементов столбца
2 |
3 | ## Задание
4 |
5 | Отобрать различные (уникальные) элементы столбца amount таблицы book.
6 |
7 | ## Решение
8 |
9 | ```
10 | select distinct amount from book;
11 | ```
12 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/qa/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | from .models import Question, Answer
4 |
5 |
6 | class QuestionAdmin(admin.ModelAdmin):
7 | pass
8 |
9 |
10 | class AnswerAdmin(admin.ModelAdmin):
11 | pass
12 |
13 | admin.site.register(Question, QuestionAdmin)
14 | admin.site.register(Answer, AnswerAdmin)
15 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.3 Запросы, групповые операции/1 Выбор уникальных элементов столбца.md:
--------------------------------------------------------------------------------
1 | # Выбор уникальных элементов столбца
2 |
3 | ## Задание
4 |
5 | Отобрать различные (уникальные) элементы столбца amount таблицы book.
6 |
7 | ## Решение
8 |
9 | ```
10 | select distinct amount from book;
11 | ```
12 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/templates/question.html:
--------------------------------------------------------------------------------
1 | {{ question.title }}
2 | {{ question.text }}
3 |
4 |
11 |
12 | {% for answer in answers %}
13 | {{ answer.text }}
14 | {% endfor %}
--------------------------------------------------------------------------------
/Python Course tasks/week 10/kvadrat.md:
--------------------------------------------------------------------------------
1 |
2 | Выведите одной строчкой кода на печать квадрат из цифр как в примере.
3 |
4 | Уложитесь в 100 символов.
5 |
6 | Вам поможет оператор '%'
7 |
8 | Не используйте символ переноса строки "\n".
9 |
10 | Используйте list comprehension.
11 |
12 | **Решение**
13 |
14 | ```python
15 | [print(''.join([str((y + x) % 10) for y in range(10)])) for x in range(10)]
16 | ```
17 |
18 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.5 Запросы корректировки данных/5 Запросы на обновление.md:
--------------------------------------------------------------------------------
1 | # Запросы на обновление
2 |
3 | ## Задание
4 |
5 | Уменьшить на 10% цену тех книг в таблице `book`, количество которых принадлежит интервалу от 5 до 10, включая границы.
6 |
7 | ## Решение
8 |
9 | ```
10 | update
11 | book
12 | set
13 | price = price * 0.9
14 | where amount between 5 and 10
15 | ```
16 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.5 Запросы корректировки данных/5 Запросы на обновление.md:
--------------------------------------------------------------------------------
1 | # Запросы на обновление
2 |
3 | ## Задание
4 |
5 | Уменьшить на 10% цену тех книг в таблице `book`, количество которых принадлежит интервалу от 5 до 10, включая границы.
6 |
7 | ## Решение
8 |
9 | ```
10 | update
11 | book
12 | set
13 | price = price * 0.9
14 | where amount between 5 and 10
15 | ```
16 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/3 Выборка новых столбцов и присвоение им новых имен.md:
--------------------------------------------------------------------------------
1 | # Выборка новых столбцов и присвоение им новых имен
2 |
3 | ## Задание
4 |
5 | Выбрать названия книг и авторов из таблицы **book**, для поля **title** задать имя (псевдоним) **Название**, для поля `author` – **Автор**.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title Название, author Автор from book;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.1 Связи между таблицами/2.md:
--------------------------------------------------------------------------------
1 | ## Задание
2 |
3 | Заполнить таблицу `author`. В нее включить следующих авторов:
4 |
5 | - Булгаков М.А.
6 | - Достоевский Ф.М.
7 | - Есенин С.А.
8 | - Пастернак Б.Л.
9 |
10 | ## Решение
11 |
12 | ```
13 | insert into author (name_author) values
14 | ('Булгаков М.А.'),
15 | ('Достоевский Ф.М.'),
16 | ('Есенин С.А.'),
17 | ('Пастернак Б.Л.')
18 | ```
19 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.1 Связи между таблицами/2.md:
--------------------------------------------------------------------------------
1 | ## Задание
2 |
3 | Заполнить таблицу `author`. В нее включить следующих авторов:
4 |
5 | - Булгаков М.А.
6 | - Достоевский Ф.М.
7 | - Есенин С.А.
8 | - Пастернак Б.Л.
9 |
10 | ## Решение
11 |
12 | ```
13 | insert into author (name_author) values
14 | ('Булгаков М.А.'),
15 | ('Достоевский Ф.М.'),
16 | ('Есенин С.А.'),
17 | ('Пастернак Б.Л.')
18 | ```
19 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/3 Выборка новых столбцов и присвоение им новых имен.md:
--------------------------------------------------------------------------------
1 | # Выборка новых столбцов и присвоение им новых имен
2 |
3 | ## Задание
4 |
5 | Выбрать названия книг и авторов из таблицы **book**, для поля **title** задать имя (псевдоним) **Название**, для поля `author` – **Автор**.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title Название, author Автор from book;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.1 Связи между таблицами/1.md:
--------------------------------------------------------------------------------
1 | ## Задание
2 |
3 | Создать таблицу `author` следующей структуры::
4 |
5 | | Поле | Тип, описание |
6 | |---|---|
7 | | author_id | `INT PRIMARY KEY AUTO_INCREMENT` |
8 | | name_author |`VARCHAR(50)` |
9 |
10 | ## Решение
11 |
12 | ```
13 | create table author (
14 | author_id INT PRIMARY KEY AUTO_INCREMENT,
15 | name_author varchar(50)
16 | )
17 | ```
18 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.1 Связи между таблицами/1.md:
--------------------------------------------------------------------------------
1 | ## Задание
2 |
3 | Создать таблицу `author` следующей структуры::
4 |
5 | | Поле | Тип, описание |
6 | |---|---|
7 | | author_id | `INT PRIMARY KEY AUTO_INCREMENT` |
8 | | name_author |`VARCHAR(50)` |
9 |
10 | ## Решение
11 |
12 | ```
13 | create table author (
14 | author_id INT PRIMARY KEY AUTO_INCREMENT,
15 | name_author varchar(50)
16 | )
17 | ```
18 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/ask/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for ask project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ask.settings")
12 |
13 | from django.core.wsgi import get_wsgi_application
14 | application = get_wsgi_application()
15 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/9 Выборка данных, операторы BETWEEN, IN.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, операторы BETWEEN, IN
2 |
3 | ## Задание
4 |
5 | Вывести название и авторов тех книг, цены которых принадлежат интервалу от 540.50 до 800 (включая границы), а количество или 2, или 3, или 5, или 7.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title, author from book where price between 540.5 and 800 and amount in (2, 3, 5, 7);
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/9 Выборка данных, операторы BETWEEN, IN.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, операторы BETWEEN, IN
2 |
3 | ## Задание
4 |
5 | Вывести название и авторов тех книг, цены которых принадлежат интервалу от 540.50 до 800 (включая границы), а количество или 2, или 3, или 5, или 7.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title, author from book where price between 540.5 and 800 and amount in (2, 3, 5, 7);
11 | ```
12 |
--------------------------------------------------------------------------------
/Python Course tasks/week 6/first.md:
--------------------------------------------------------------------------------
1 | Напишите функцию `first`, которая будет принимать вообще все что угодно и возвращать свой первый аргумент. Если все её аргументы именованные, то пускай она возвращает тот у которого самое маленькое имя. Если ей не передано ничего, то пускай она возвращает `None`.
2 |
3 | `first(0.0123) == 0.0123`
4 |
5 | ```python
6 | def first(*args, **kwargs):
7 | if args:
8 | return args[0]
9 | elif kwargs:
10 | return kwargs[min(kwargs.items)[0]]
11 | ```
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/1 Выборка всех данных.md:
--------------------------------------------------------------------------------
1 | # Выборка всех данных из таблицы
2 |
3 | ## Задание
4 |
5 | Вывести информацию о всех книгах, хранящихся на складе.
6 |
7 | Для этого:
8 |
9 | * Напишите SQL запрос в окне кода;
10 | * Отправьте на проверку (кнопка Отправить);
11 | * Если запрос работает неверно, исправьте его и снова отправьте на проверку.
12 |
13 | ## Решение
14 |
15 | ```
16 | select * from book
17 | ```
18 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/1 Выборка всех данных.md:
--------------------------------------------------------------------------------
1 | # Выборка всех данных из таблицы
2 |
3 | ## Задание
4 |
5 | Вывести информацию о всех книгах, хранящихся на складе.
6 |
7 | Для этого:
8 |
9 | * Напишите SQL запрос в окне кода;
10 | * Отправьте на проверку (кнопка Отправить);
11 | * Если запрос работает неверно, исправьте его и снова отправьте на проверку.
12 |
13 | ## Решение
14 |
15 | ```
16 | select * from book
17 | ```
18 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.2 Запросы на выборку, соединение таблиц/2 Внешнее соединение LEFT и RIGHT OUTER JOIN.md:
--------------------------------------------------------------------------------
1 | # Внешнее соединение LEFT и RIGHT OUTER JOIN
2 |
3 | ## Задание
4 |
5 | Вывести все жанры, которые не представлены в книгах на складе.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | name_genre
12 | from
13 | genre g
14 | left join
15 | book b
16 | on b.genre_id = g.genre_id
17 | where
18 | b.book_id is null
19 | ```
20 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.5 Запросы корректировки данных/1 Создание пустой таблицы.md:
--------------------------------------------------------------------------------
1 | # Создание пустой таблицы
2 |
3 | ## Задание
4 |
5 | Создать таблицу поставка (supply), которая имеет ту же структуру, что и таблиц **book**.
6 |
7 | ## Решение
8 |
9 | ```
10 | create table supply (
11 | supply_id int primary key auto_increment,
12 | title varchar(50),
13 | author varchar(30),
14 | price decimal(8,2),
15 | amount int
16 | );
17 | ```
18 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.2 Запросы на выборку, соединение таблиц/2 Внешнее соединение LEFT и RIGHT OUTER JOIN.md:
--------------------------------------------------------------------------------
1 | # Внешнее соединение LEFT и RIGHT OUTER JOIN
2 |
3 | ## Задание
4 |
5 | Вывести все жанры, которые не представлены в книгах на складе.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | name_genre
12 | from
13 | genre g
14 | left join
15 | book b
16 | on b.genre_id = g.genre_id
17 | where
18 | b.book_id is null
19 | ```
20 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.5 Запросы корректировки данных/1 Создание пустой таблицы.md:
--------------------------------------------------------------------------------
1 | # Создание пустой таблицы
2 |
3 | ## Задание
4 |
5 | Создать таблицу поставка (supply), которая имеет ту же структуру, что и таблиц **book**.
6 |
7 | ## Решение
8 |
9 | ```
10 | create table supply (
11 | supply_id int primary key auto_increment,
12 | title varchar(50),
13 | author varchar(30),
14 | price decimal(8,2),
15 | amount int
16 | );
17 | ```
18 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/8 Выборка данных, логические операции.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, логические операции
2 |
3 | ## Задание
4 |
5 | Вывести название, автора, цену и количество всех книг, цена которых меньше 500 или больше 600, а стоимость всех экземпляров этих книг больше или равна 5000.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title, author, price, amount from book where (price < 500 or price > 600) and (price * amount >= 5000);
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/8 Выборка данных, логические операции.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, логические операции
2 |
3 | ## Задание
4 |
5 | Вывести название, автора, цену и количество всех книг, цена которых меньше 500 или больше 600, а стоимость всех экземпляров этих книг больше или равна 5000.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title, author, price, amount from book where (price < 500 or price > 600) and (price * amount >= 5000);
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/10 Выборка данных с сортировкой.md:
--------------------------------------------------------------------------------
1 | # Выборка данных с сортировкой
2 |
3 | ## Задание
4 |
5 | Вывести автора и название книг, количество которых принадлежит интервалу от 2 до 14 (включая границы). Информацию отсортировать сначала по авторам (в обратном алфавитном порядке), а затем по названиям книг (по алфавиту).
6 |
7 | ## Решение
8 |
9 | ```
10 | select author, title from book where amount between 2 and 14 order by author desc, title;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/10 Выборка данных с сортировкой.md:
--------------------------------------------------------------------------------
1 | # Выборка данных с сортировкой
2 |
3 | ## Задание
4 |
5 | Вывести автора и название книг, количество которых принадлежит интервалу от 2 до 14 (включая границы). Информацию отсортировать сначала по авторам (в обратном алфавитном порядке), а затем по названиям книг (по алфавиту).
6 |
7 | ## Решение
8 |
9 | ```
10 | select author, title from book where amount between 2 and 14 order by author desc, title;
11 | ```
12 |
--------------------------------------------------------------------------------
/Python - основы и применение/1.1 Введение 10.md:
--------------------------------------------------------------------------------
1 |
2 | Реализуйте программу, которая принимает последовательность чисел и выводит их сумму.
3 |
4 | Вашей программе на вход подается последовательность строк.
5 | Первая строка содержит число n (1 ≤ n ≤ 100).
6 | В следующих n строках содержится по одному целому числу.
7 |
8 | Выведите одно число – сумму данных n чисел.
9 |
10 | # Решение
11 |
12 | ```
13 | from functools import reduce
14 | n = int(input()) + 1
15 | print(int(reduce(lambda a, num: a + int(input()), range(n))))
16 | ```
17 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.2 Запросы на выборку, соединение таблиц/1 Соединение INNER JOIN.md:
--------------------------------------------------------------------------------
1 | # Соединение INNER JOIN
2 |
3 | ## Задание
4 |
5 | Вывести название, жанр и цену тех книг, количество которых больше 8, в отсортированном по убыванию цены виде.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | b.title, g.name_genre, b.price
12 | from
13 | book b
14 | join
15 | genre g
16 | on g.genre_id = b.genre_id
17 | where
18 | b.amount > 8
19 | order by
20 | b.price desc
21 | ```
22 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.5 Запросы корректировки данных/3 Добавление записей из другой таблицы.md:
--------------------------------------------------------------------------------
1 | # Добавление записей из другой таблицы
2 |
3 | ## Задание
4 |
5 | Добавить из таблицы `supply` в таблицу `book`, все книги, кроме книг, написанных Булгаковым М.А. и Достоевским Ф.М.
6 |
7 | ## Решение
8 |
9 | ```
10 | insert into book(title, author, price, amount)
11 | select
12 | title, author, price, amount
13 | from
14 | supply
15 | where author not in ('Булгаков М.А.', 'Достоевский Ф.М.')
16 | ```
17 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.2 Запросы на выборку, соединение таблиц/1 Соединение INNER JOIN.md:
--------------------------------------------------------------------------------
1 | # Соединение INNER JOIN
2 |
3 | ## Задание
4 |
5 | Вывести название, жанр и цену тех книг, количество которых больше 8, в отсортированном по убыванию цены виде.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | b.title, g.name_genre, b.price
12 | from
13 | book b
14 | join
15 | genre g
16 | on g.genre_id = b.genre_id
17 | where
18 | b.amount > 8
19 | order by
20 | b.price desc
21 | ```
22 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.5 Запросы корректировки данных/3 Добавление записей из другой таблицы.md:
--------------------------------------------------------------------------------
1 | # Добавление записей из другой таблицы
2 |
3 | ## Задание
4 |
5 | Добавить из таблицы `supply` в таблицу `book`, все книги, кроме книг, написанных Булгаковым М.А. и Достоевским Ф.М.
6 |
7 | ## Решение
8 |
9 | ```
10 | insert into book(title, author, price, amount)
11 | select
12 | title, author, price, amount
13 | from
14 | supply
15 | where author not in ('Булгаков М.А.', 'Достоевский Ф.М.')
16 | ```
17 |
--------------------------------------------------------------------------------
/Алгоритмы методы/2.2 Числа Фибоначчи.md:
--------------------------------------------------------------------------------
1 | Дано целое число 1 ≤ n ≤ 40, необходимо вычислить n-е число Фибоначчи (напомним, что F0=0, F1=1, и Fn = Fn−1 + Fn−2 при n ≥ 2)
2 |
3 | **Sample Input**:
4 |
5 | 3
6 |
7 | **Sample Output**:
8 |
9 | 2
10 |
11 | # Решение / Solution
12 |
13 | ```
14 | def fib(n):
15 | assert n >= 0
16 | f0, f1 = 0, 1
17 | for i in range(n - 1):
18 | f0, f1 = f1, f0 + f1
19 | return f1
20 |
21 |
22 | def main():
23 | n = int(input())
24 | print(fib(n))
25 |
26 |
27 | if __name__ == "__main__":
28 | main()
29 | ```
--------------------------------------------------------------------------------
/Python - основы и применение/3.3 Регулярные выражения в Python 10.md:
--------------------------------------------------------------------------------
1 | Вам дана последовательность строк.
2 |
3 | Выведите строки, содержащие обратный слеш "**\\**".
4 |
5 | ---
6 |
7 | **Sample Input**:
8 |
9 | ```
10 | \w denotes word character
11 | No slashes here
12 | ```
13 |
14 | **Sample Output**:
15 |
16 | `\w denotes word character`
17 |
18 | # Solution / Решение
19 |
20 | ```
21 | import re
22 | import sys
23 | pattern = r'.*\\.*'
24 | for line in sys.stdin:
25 | line = line.rstrip()
26 | if re.search(pattern, line):
27 | print(line)
28 | ```
29 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.3 Запросы, групповые операции/5 Вычисления по таблице целиком.md:
--------------------------------------------------------------------------------
1 | # Вычисления по таблице целиком
2 |
3 | ## Задание
4 |
5 | Вывести цену самой дешевой книги, цену самой дорогой и среднюю цену книг на складе. Названия столбцов **Минимальная_цена**, **Максимальная_цена**, **Средняя_цена** соответственно. Среднюю цену округлить до двух знаков после запятой.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | min(price) Минимальная_цена, max(price) Максимальная_цена, round(avg(price), 2) Средняя_цена
12 | from
13 | book
14 | ```
15 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.3 Запросы корректировки, соединение таблиц/4 Запрос на обновление, вложенные запросы.md:
--------------------------------------------------------------------------------
1 | # Запрос на обновление, вложенные запросы
2 |
3 | ## Задание
4 |
5 | Занести для книги «Стихотворения и поэмы» Лермонтова жанр «Поэзия», а для книги «Остров сокровищ» Стивенсона - «Приключения». (Использовать два запроса).
6 |
7 | ## Решение
8 |
9 | ```
10 | update
11 | book
12 | set
13 | genre_id = 2
14 | where
15 | book_id = 10;
16 | update
17 | book
18 | set
19 | genre_id = 3
20 | where
21 | book_id = 11;
22 | ```
23 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.3 Регулярные выражения в Python 15.md:
--------------------------------------------------------------------------------
1 | Вам дана последовательность строк.
2 |
3 | В каждой строке замените все вхождения нескольких одинаковых букв на одну букву.
4 |
5 | Буквой считается символ из группы **\w**.
6 |
7 | ---
8 |
9 | **Sample Input**:
10 |
11 | ```
12 | attraction
13 | buzzzz
14 |
15 | **Sample Output**:
16 |
17 | atraction
18 | buz
19 | ```
20 |
21 | # Solution / Решение
22 |
23 | ```
24 | import re
25 | import sys
26 |
27 | pattern = r'(\w)\1+'
28 |
29 | for line in sys.stdin:
30 | print(re.sub(pattern, r'\1', line.rstrip()))
31 | ```
32 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.3 Запросы, групповые операции/5 Вычисления по таблице целиком.md:
--------------------------------------------------------------------------------
1 | # Вычисления по таблице целиком
2 |
3 | ## Задание
4 |
5 | Вывести цену самой дешевой книги, цену самой дорогой и среднюю цену книг на складе. Названия столбцов **Минимальная_цена**, **Максимальная_цена**, **Средняя_цена** соответственно. Среднюю цену округлить до двух знаков после запятой.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | min(price) Минимальная_цена, max(price) Максимальная_цена, round(avg(price), 2) Средняя_цена
12 | from
13 | book
14 | ```
15 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.3 Запросы, групповые операции/2 Выборка данных, групповые функции SUM и COUNT.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, групповые функции SUM и COUNT
2 |
3 | ## Задание
4 |
5 | Посчитать, количество различных книг и количество экземпляров книг каждого автора, хранящихся на складе. Столбцы назвать `Автор`, `Различных_книг` и `Количество_экземпляров` соответственно.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author Автор, count(title) Различных_книг, sum(amount) Количество_экземпляров
12 | from
13 | book
14 | group by
15 | author;
16 | ```
17 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.3 Запросы корректировки, соединение таблиц/5 Каскадное удаление записей связанных таблиц.md:
--------------------------------------------------------------------------------
1 | # Каскадное удаление записей связанных таблиц
2 |
3 | ## Задание
4 |
5 | Удалить всех авторов и все их книги, общее количество книг которых меньше 20.
6 |
7 | ## Решение
8 |
9 | ```
10 | delete from author
11 | where
12 | author_id in (
13 | select
14 | author_id
15 | from
16 | book
17 | group by
18 | author_id
19 | having
20 | sum(amount) < 20
21 | )
22 | ```
23 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.3 Запросы корректировки, соединение таблиц/4 Запрос на обновление, вложенные запросы.md:
--------------------------------------------------------------------------------
1 | # Запрос на обновление, вложенные запросы
2 |
3 | ## Задание
4 |
5 | Занести для книги «Стихотворения и поэмы» Лермонтова жанр «Поэзия», а для книги «Остров сокровищ» Стивенсона - «Приключения». (Использовать два запроса).
6 |
7 | ## Решение
8 |
9 | ```
10 | update
11 | book
12 | set
13 | genre_id = 2
14 | where
15 | book_id = 10;
16 | update
17 | book
18 | set
19 | genre_id = 3
20 | where
21 | book_id = 11;
22 | ```
23 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.3 Запросы, групповые операции/2 Выборка данных, групповые функции SUM и COUNT.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, групповые функции SUM и COUNT
2 |
3 | ## Задание
4 |
5 | Посчитать, количество различных книг и количество экземпляров книг каждого автора, хранящихся на складе. Столбцы назвать `Автор`, `Различных_книг` и `Количество_экземпляров` соответственно.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author Автор, count(title) Различных_книг, sum(amount) Количество_экземпляров
12 | from
13 | book
14 | group by
15 | author;
16 | ```
17 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.3 Запросы корректировки, соединение таблиц/5 Каскадное удаление записей связанных таблиц.md:
--------------------------------------------------------------------------------
1 | # Каскадное удаление записей связанных таблиц
2 |
3 | ## Задание
4 |
5 | Удалить всех авторов и все их книги, общее количество книг которых меньше 20.
6 |
7 | ## Решение
8 |
9 | ```
10 | delete from author
11 | where
12 | author_id in (
13 | select
14 | author_id
15 | from
16 | book
17 | group by
18 | author_id
19 | having
20 | sum(amount) < 20
21 | )
22 | ```
23 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/4 Выборка данных с созданием вычисляемого столбца.md:
--------------------------------------------------------------------------------
1 | # Выборка данных с созданием вычисляемого столбца
2 |
3 | ## Задание
4 |
5 | Для упаковки каждой книги требуется один лист бумаги, цена которого 1 рубль 65 копеек. Посчитать стоимость упаковки для каждой книги (сколько денег потребуется, чтобы упаковать все экземпляры книги). В запросе вывести название книги, ее количество и стоимость упаковки, последний столбец назвать **pack**.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title, amount, amount * 1.65 as pack from book;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.5 Запросы корректировки данных/2 Добавление записей в таблицу.md:
--------------------------------------------------------------------------------
1 | # Добавление записей в таблицу
2 |
3 | ## Задание
4 |
5 | Занесите в таблицу `supply` четыре записи, чтобы получилась следующая таблица:
6 |
7 | ## Решение
8 |
9 | ```
10 | insert into supply values (1, 'Лирика', 'Пастернак Б.Л.', 518.99, 2);
11 | insert into supply values (2, 'Черный человек', 'Есенин С.А.', 570.20, 6);
12 | insert into supply values (3, 'Белая гвардия', 'Булгаков М.А.', 540.50, 7);
13 | insert into supply values (4, 'Идиот', 'Достоевский Ф.М.', 360.80, 3);
14 | ```
15 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/4 Выборка данных с созданием вычисляемого столбца.md:
--------------------------------------------------------------------------------
1 | # Выборка данных с созданием вычисляемого столбца
2 |
3 | ## Задание
4 |
5 | Для упаковки каждой книги требуется один лист бумаги, цена которого 1 рубль 65 копеек. Посчитать стоимость упаковки для каждой книги (сколько денег потребуется, чтобы упаковать все экземпляры книги). В запросе вывести название книги, ее количество и стоимость упаковки, последний столбец назвать **pack**.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title, amount, amount * 1.65 as pack from book;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.5 Запросы корректировки данных/2 Добавление записей в таблицу.md:
--------------------------------------------------------------------------------
1 | # Добавление записей в таблицу
2 |
3 | ## Задание
4 |
5 | Занесите в таблицу `supply` четыре записи, чтобы получилась следующая таблица:
6 |
7 | ## Решение
8 |
9 | ```
10 | insert into supply values (1, 'Лирика', 'Пастернак Б.Л.', 518.99, 2);
11 | insert into supply values (2, 'Черный человек', 'Есенин С.А.', 570.20, 6);
12 | insert into supply values (3, 'Белая гвардия', 'Булгаков М.А.', 540.50, 7);
13 | insert into supply values (4, 'Идиот', 'Достоевский Ф.М.', 360.80, 3);
14 | ```
15 |
--------------------------------------------------------------------------------
/Python - основы и применение/1.3 Функции и стек вызовов 9.md:
--------------------------------------------------------------------------------
1 | Напишите реализацию функции **closest_mod_5**, принимающую в качестве единственного аргумента целое число **x** и возвращающую самое маленькое целое число **y**, такое что:
2 |
3 | - **y** больше или равно **x**
4 | - **y** делится нацело на **5**
5 |
6 | Формат того, что ожидается от вас в качестве ответа:
7 |
8 | ```
9 | def closest_mod_5(x):
10 | if x % 5 == 0:
11 | return x
12 | return "I don't know :("
13 | ```
14 |
15 | # Решение
16 |
17 | ```
18 | def closest_mod_5(x):
19 | return x if x % 5 == 0 else closest_mod_5(x + 1)
20 | ```
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.3 Запросы, групповые операции/3 Выборка данных, групповые функции MIN, MAX и AVG.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, групповые функции MIN, MAX и AVG
2 |
3 | ## Задание
4 |
5 | Вывести фамилию автора, минимальную, максимальную и среднюю цену книг каждого автора . Вычисляемые столбцы назвать **Минимальная_цена**, **Максимальная_цена** и **Средняя_цена** соответственно.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, min(price) Минимальная_цена, max(price) Максимальная_цена, avg(price) Средняя_цена
12 | from
13 | book
14 | group by
15 | author
16 | ```
17 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.3 Запросы, групповые операции/3 Выборка данных, групповые функции MIN, MAX и AVG.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, групповые функции MIN, MAX и AVG
2 |
3 | ## Задание
4 |
5 | Вывести фамилию автора, минимальную, максимальную и среднюю цену книг каждого автора . Вычисляемые столбцы назвать **Минимальная_цена**, **Максимальная_цена** и **Средняя_цена** соответственно.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, min(price) Минимальная_цена, max(price) Максимальная_цена, avg(price) Средняя_цена
12 | from
13 | book
14 | group by
15 | author
16 | ```
17 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/5 Выборка данных, вычисляемые столбцы, математические функции.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, вычисляемые столбцы, математические функции
2 |
3 | ## Задание
4 |
5 | В конце года цену всех книг на складе пересчитывают – снижают ее на 30%. Написать SQL запрос, который из таблицы book выбирает названия, авторов, количества и вычисляет новые цены книг. Столбец с новой ценой назвать `new_price`, цену округлить до 2-х знаков после запятой.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title, author, amount, round(price - price * 0.3, 2) new_price from book;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.4 Вложенные запросы/4 Вложенный запрос, операторы ANY и ALL.md:
--------------------------------------------------------------------------------
1 | # Вложенный запрос, операторы ANY и ALL
2 |
3 | ## Задание
4 |
5 | Вывести информацию о книгах(автор, название, цена), цена которых меньше самой большой из минимальных цен, вычисленных для каждого автора.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, title, price
12 | from
13 | book b
14 | where
15 | price < all(
16 | select
17 | max(price)
18 | from
19 | book b1
20 | where
21 | b1.author = b.author
22 | )
23 | ```
24 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/5 Выборка данных, вычисляемые столбцы, математические функции.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, вычисляемые столбцы, математические функции
2 |
3 | ## Задание
4 |
5 | В конце года цену всех книг на складе пересчитывают – снижают ее на 30%. Написать SQL запрос, который из таблицы book выбирает названия, авторов, количества и вычисляет новые цены книг. Столбец с новой ценой назвать `new_price`, цену округлить до 2-х знаков после запятой.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title, author, amount, round(price - price * 0.3, 2) new_price from book;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.4 Вложенные запросы/4 Вложенный запрос, операторы ANY и ALL.md:
--------------------------------------------------------------------------------
1 | # Вложенный запрос, операторы ANY и ALL
2 |
3 | ## Задание
4 |
5 | Вывести информацию о книгах(автор, название, цена), цена которых меньше самой большой из минимальных цен, вычисленных для каждого автора.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, title, price
12 | from
13 | book b
14 | where
15 | price < all(
16 | select
17 | max(price)
18 | from
19 | book b1
20 | where
21 | b1.author = b.author
22 | )
23 | ```
24 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.5 Запросы корректировки данных/6 Запросы на обновление нескольких столбцов.md:
--------------------------------------------------------------------------------
1 | # Запросы на обновление нескольких столбцов
2 |
3 | ## Задание
4 |
5 | В таблице **book** необходимо скорректировать значение для покупателя в столбце **buy** таким образом, чтобы оно не превышало количество экземпляров книг, указанных в столбце **amount**. А цену тех книг, которые покупатель не заказывал, снизить на 10%.
6 |
7 | ## Решение
8 |
9 | ```
10 | update
11 | book
12 | set
13 | buy = if(buy > amount, amount, buy),
14 | price = if(buy = 0, price * 0.9, price);
15 | ```
16 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.5 Запросы корректировки данных/6 Запросы на обновление нескольких столбцов.md:
--------------------------------------------------------------------------------
1 | # Запросы на обновление нескольких столбцов
2 |
3 | ## Задание
4 |
5 | В таблице **book** необходимо скорректировать значение для покупателя в столбце **buy** таким образом, чтобы оно не превышало количество экземпляров книг, указанных в столбце **amount**. А цену тех книг, которые покупатель не заказывал, снизить на 10%.
6 |
7 | ## Решение
8 |
9 | ```
10 | update
11 | book
12 | set
13 | buy = if(buy > amount, amount, buy),
14 | price = if(buy = 0, price * 0.9, price);
15 | ```
16 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.3 Регулярные выражения в Python 9.md:
--------------------------------------------------------------------------------
1 | Вам дана последовательность строк.
2 |
3 | Выведите строки, содержащие две буквы "**z**", между которыми ровно три символа.
4 |
5 | ---
6 |
7 | **Sample Input**:
8 |
9 | ```
10 | zabcz
11 | zzz
12 | zzxzz
13 | zz
14 | zxz
15 | zzxzxxz
16 | ```
17 |
18 | **Sample Output**:
19 |
20 | ```
21 | zabcz
22 | zzxzz
23 | ```
24 |
25 | ---
26 |
27 | # Solution / Решение
28 |
29 | ```
30 | import re
31 | import sys
32 | pattern = r'(z.{3}z)'
33 | for line in sys.stdin:
34 | line = line.rstrip()
35 | if re.search(pattern, line):
36 | print(line)
37 | ```
38 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.4 Вложенные запросы/3 Вложенный запрос, оператор IN.md:
--------------------------------------------------------------------------------
1 | # Вложенный запрос, оператор IN
2 |
3 | ## Задание
4 |
5 | Вывести информацию (автора, книгу и количество) о тех книгах, количество экземпляров которых в таблице **book** не дублируется.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, title, amount
12 | from
13 | book
14 | where
15 | amount not in (
16 | select
17 | amount
18 | from
19 | book
20 | group by
21 | amount
22 | having
23 | count(amount) > 1
24 | )
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.4 Вложенные запросы/3 Вложенный запрос, оператор IN.md:
--------------------------------------------------------------------------------
1 | # Вложенный запрос, оператор IN
2 |
3 | ## Задание
4 |
5 | Вывести информацию (автора, книгу и количество) о тех книгах, количество экземпляров которых в таблице **book** не дублируется.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, title, amount
12 | from
13 | book
14 | where
15 | amount not in (
16 | select
17 | amount
18 | from
19 | book
20 | group by
21 | amount
22 | having
23 | count(amount) > 1
24 | )
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.3 Запросы, групповые операции/6 Выборка данных по условию, групповые функции.md:
--------------------------------------------------------------------------------
1 | # Выборка данных по условию, групповые функции
2 |
3 | ## Задание
4 |
5 | Вычислить среднюю цену и суммарную стоимость тех книг, количество экземпляров которых принадлежит интервалу от 5 до 14, включительно. Столбцы назвать **Средняя_цена** и **Стоимость**, значения округлить до 2-х знаков после запятой.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | round(avg(price), 2) Средняя_цена,
12 | sum(price * amount) Стоимость
13 | from
14 | book
15 | where
16 | amount between 5 and 14
17 | ```
18 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.3 Запросы, групповые операции/6 Выборка данных по условию, групповые функции.md:
--------------------------------------------------------------------------------
1 | # Выборка данных по условию, групповые функции
2 |
3 | ## Задание
4 |
5 | Вычислить среднюю цену и суммарную стоимость тех книг, количество экземпляров которых принадлежит интервалу от 5 до 14, включительно. Столбцы назвать **Средняя_цена** и **Стоимость**, значения округлить до 2-х знаков после запятой.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | round(avg(price), 2) Средняя_цена,
12 | sum(price * amount) Стоимость
13 | from
14 | book
15 | where
16 | amount between 5 and 14
17 | ```
18 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/templates/index.html:
--------------------------------------------------------------------------------
1 | {% for question in questions %}
2 | {{ question }}
3 | {% endfor %}
4 |
5 | {% if paginator.has_previous %}
6 | ←
7 | {% endif %}
8 |
9 | {% for num in paginator.page_range %}
10 | {% if num == questions.number %}
11 | {{ num }}
12 | {% else %}
13 | {{ num }}
14 | {% endif %}
15 | {% endfor %}
16 |
17 | {% if paginator.has_next %}
18 | →
19 | {% endif %}
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/templates/popular.html:
--------------------------------------------------------------------------------
1 | {% for question in questions %}
2 | {{ question }}
3 | {% endfor %}
4 |
5 | {% if paginator.has_previous %}
6 | ←
7 | {% endif %}
8 |
9 | {% for num in paginator.page_range %}
10 | {% if num == questions.number %}
11 | {{ num }}
12 | {% else %}
13 | {{ num }}
14 | {% endif %}
15 | {% endfor %}
16 |
17 | {% if paginator.has_next %}
18 | →
19 | {% endif %}
--------------------------------------------------------------------------------
/Python Course tasks/week 7/friends.md:
--------------------------------------------------------------------------------
1 | Напишите функцию `friends`, которая из списка пар друзей сделает словарь, в котором для каждого человека будут перечислены все его друзья.
2 |
3 | **Пример**
4 |
5 | ```python
6 | >>> print(friends([("Ivan", "Maria"), ("Ella", "Ivan"), ("Ivan", "Oleg")])
7 |
8 | {"Ivan":["Maria", "Ella", "Oleg"], "Ella":["Ivan"], "Maria": ["Ivan"], "Oleg": ["Ivan"]}
9 | ```
10 |
11 | **Решение**
12 |
13 | ```python
14 | def friends(pairs):
15 | result = dict()
16 | [result.update({first: result.get(first, []) + [second], second: result.get(second, []) + [first]}) for first, second in pairs]
17 | return result
18 | ```
19 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.4 Вложенные запросы/2 Использование вложенного запроса в выражении.md:
--------------------------------------------------------------------------------
1 | # Использование вложенного запроса в выражении
2 |
3 | ## Задание
4 |
5 | Вывести информацию (автора, название и цену) о тех книгах, цены которых превышают минимальную цену книги на складе не более чем на 150 рублей в отсортированном по возрастанию цены виде.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, title, price
12 | from
13 | book
14 | where
15 | price <= (
16 | select
17 | min(price)
18 | from
19 | book
20 | ) + 150
21 | order by
22 | price
23 | ```
24 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.4 Вложенные запросы/2 Использование вложенного запроса в выражении.md:
--------------------------------------------------------------------------------
1 | # Использование вложенного запроса в выражении
2 |
3 | ## Задание
4 |
5 | Вывести информацию (автора, название и цену) о тех книгах, цены которых превышают минимальную цену книги на складе не более чем на 150 рублей в отсортированном по возрастанию цены виде.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, title, price
12 | from
13 | book
14 | where
15 | price <= (
16 | select
17 | min(price)
18 | from
19 | book
20 | ) + 150
21 | order by
22 | price
23 | ```
24 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.3 Регулярные выражения в Python 12.md:
--------------------------------------------------------------------------------
1 | Вам дана последовательность строк.
2 |
3 | В каждой строке замените все вхождения подстроки "**human**" на подстроку "**computer**" и выведите полученные строки.
4 |
5 | ---
6 |
7 | **Sample Input**:
8 |
9 | ```
10 | I need to understand the human mind
11 | humanity
12 | ```
13 |
14 | **Sample Output**:
15 |
16 | ```
17 | I need to understand the computer mind
18 | computerity
19 | ```
20 |
21 | # Solution / Решение
22 |
23 | ```
24 | import re
25 | import sys
26 |
27 | pattern = r'human'
28 |
29 | for line in sys.stdin:
30 | print(re.sub(pattern, 'computer', line.rstrip()))
31 | ```
32 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.1 Отношение (таблица)/1 Создание таблицы.md:
--------------------------------------------------------------------------------
1 | # Создание таблицы
2 |
3 | ## Задание
4 |
5 | Сформулируйте SQL запрос для создания таблицы **book**. Структура таблицы **book**:
6 |
7 | | Поле | Тип, описание |
8 | |---|---|
9 | | book_id | INT PRIMARY KEY AUTO_INCREMENT |
10 | | title | VARCHAR(50) |
11 | | author | VARCHAR(30) |
12 | | price | DECIMAL(8, 2) |
13 | | amount | INT |
14 |
15 | ## Решение
16 |
17 | ```
18 | CREATE TABLE book(
19 | book_id INT PRIMARY KEY AUTO_INCREMENT,
20 | title VARCHAR(50),
21 | author VARCHAR(30),
22 | price DECIMAL(8, 2),
23 | amount INT
24 | );
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.1 Отношение (таблица)/1 Создание таблицы.md:
--------------------------------------------------------------------------------
1 | # Создание таблицы
2 |
3 | ## Задание
4 |
5 | Сформулируйте SQL запрос для создания таблицы **book**. Структура таблицы **book**:
6 |
7 | | Поле | Тип, описание |
8 | |---|---|
9 | | book_id | INT PRIMARY KEY AUTO_INCREMENT |
10 | | title | VARCHAR(50) |
11 | | author | VARCHAR(30) |
12 | | price | DECIMAL(8, 2) |
13 | | amount | INT |
14 |
15 | ## Решение
16 |
17 | ```
18 | CREATE TABLE book(
19 | book_id INT PRIMARY KEY AUTO_INCREMENT,
20 | title VARCHAR(50),
21 | author VARCHAR(30),
22 | price DECIMAL(8, 2),
23 | amount INT
24 | );
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.2 Запросы на выборку, соединение таблиц/4 Запросы на выборку из нескольких таблиц.md:
--------------------------------------------------------------------------------
1 | # Запросы на выборку из нескольких таблиц
2 |
3 | ## Задание
4 |
5 | Вывести информацию о книгах (жанр, книга, автор), относящихся к жанру, включающему слово «роман» в отсортированном по названиям книг виде.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | name_genre, title, name_author
12 | from
13 | genre g
14 | join
15 | book b
16 | on b.genre_id = g.genre_id
17 | join
18 | author a
19 | on a.author_id = b.author_id
20 | where
21 | name_genre like '%роман%'
22 | order by
23 | title
24 | ```
25 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.3 Запросы корректировки, соединение таблиц/6 Удаление записей главной таблицы с сохранением записей в зависимой.md:
--------------------------------------------------------------------------------
1 | # Удаление записей главной таблицы с сохранением записей в зависимой
2 |
3 | ## Задание
4 |
5 | Удалить все жанры, к которым относится меньше 4-х книг. В таблице book для этих жанров установить значение `Null`.
6 |
7 | ## Решение
8 |
9 | ```
10 | delete from genre
11 | where
12 | genre_id in (
13 | select
14 | genre_id
15 | from
16 | book
17 | group by
18 | genre_id
19 | having
20 | count(*) < 4
21 | )
22 | ```
23 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.2 Запросы на выборку, соединение таблиц/4 Запросы на выборку из нескольких таблиц.md:
--------------------------------------------------------------------------------
1 | # Запросы на выборку из нескольких таблиц
2 |
3 | ## Задание
4 |
5 | Вывести информацию о книгах (жанр, книга, автор), относящихся к жанру, включающему слово «роман» в отсортированном по названиям книг виде.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | name_genre, title, name_author
12 | from
13 | genre g
14 | join
15 | book b
16 | on b.genre_id = g.genre_id
17 | join
18 | author a
19 | on a.author_id = b.author_id
20 | where
21 | name_genre like '%роман%'
22 | order by
23 | title
24 | ```
25 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.3 Запросы корректировки, соединение таблиц/6 Удаление записей главной таблицы с сохранением записей в зависимой.md:
--------------------------------------------------------------------------------
1 | # Удаление записей главной таблицы с сохранением записей в зависимой
2 |
3 | ## Задание
4 |
5 | Удалить все жанры, к которым относится меньше 4-х книг. В таблице book для этих жанров установить значение `Null`.
6 |
7 | ## Решение
8 |
9 | ```
10 | delete from genre
11 | where
12 | genre_id in (
13 | select
14 | genre_id
15 | from
16 | book
17 | group by
18 | genre_id
19 | having
20 | count(*) < 4
21 | )
22 | ```
23 |
--------------------------------------------------------------------------------
/Python - основы и применение/2.4 Работа с файловой системой и файлами 4.md:
--------------------------------------------------------------------------------
1 | Вам дается текстовый файл, содержащий некоторое количество непустых строк.
2 |
3 | На основе него сгенерируйте новый текстовый файл, содержащий те же строки в обратном порядке.
4 |
5 | **Пример входного файла**:
6 |
7 | ```
8 | ab
9 | c
10 | dde
11 | ff
12 | ```
13 |
14 | **Пример выходного файла**:
15 |
16 | ```
17 | ff
18 | dde
19 | c
20 | ab
21 | ```
22 |
23 | # Решение
24 |
25 | ```
26 | with open('dataset_24465_4.txt') as f1:
27 | f1_lines = f1.read().splitlines()
28 |
29 | with open('result.txt', 'w') as f2:
30 | for line in f1_lines[::-1]:
31 | f2.write('%s\n' % line)
32 | ```
33 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.3 Регулярные выражения в Python 11.md:
--------------------------------------------------------------------------------
1 | Вам дана последовательность строк.
2 |
3 | Выведите строки, содержащие слово, состоящее из двух одинаковых частей (тандемный повтор).
4 |
5 | ---
6 |
7 | **Sample Input**:
8 |
9 | ```
10 | blabla is a tandem repetition
11 | 123123 is good too
12 | go go
13 | aaa
14 | ```
15 |
16 | **Sample Output**:
17 |
18 | ```
19 | blabla is a tandem repetition
20 | 123123 is good too
21 | ```
22 |
23 | # Solution / Решение
24 |
25 | ```
26 | import re
27 | import sys
28 | pattern = r'\b(.+)\1\b'
29 | for line in sys.stdin:
30 | line = line.rstrip()
31 | if re.search(pattern, line):
32 | print(line)
33 | ```
34 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.3 Регулярные выражения в Python 14.md:
--------------------------------------------------------------------------------
1 | Вам дана последовательность строк.
2 |
3 | В каждой строке поменяйте местами две первых буквы в каждом слове, состоящем хотя бы из двух букв.
4 |
5 | Буквой считается символ из группы **\w**.
6 |
7 | ---
8 |
9 | **Sample Input**:
10 |
11 | ```
12 | this is a text
13 | "this' !is. ?n1ce,
14 | ```
15 |
16 | **Sample Output**:
17 |
18 | ```
19 | htis si a etxt
20 | "htis' !si. ?1nce,
21 | ```
22 |
23 | # Solution / Решение
24 |
25 | ```
26 | import re
27 | import sys
28 |
29 | pattern = r'\b(\w)(\w)(\w*)\b'
30 |
31 | for line in sys.stdin:
32 | print(re.sub(pattern, r'\2\1\3', line.rstrip()))
33 | ```
34 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.4 Вложенные запросы/1 Вложенный запрос, возвращающий одно значение.md:
--------------------------------------------------------------------------------
1 | # Вложенный запрос, возвращающий одно значение
2 |
3 | ## Задание
4 |
5 | Вывести информацию (автора, название и цену) о книгах, цены которых меньше или равны средней цене книг на складе. Информацию вывести в отсортированном по убыванию цены виде. Среднее вычислить как среднее по цене книги.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, title, price
12 | from
13 | book
14 | where
15 | price <= (
16 | select
17 | avg(price)
18 | from
19 | book
20 | )
21 | order by
22 | price desc
23 | ```
24 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.4 Вложенные запросы/1 Вложенный запрос, возвращающий одно значение.md:
--------------------------------------------------------------------------------
1 | # Вложенный запрос, возвращающий одно значение
2 |
3 | ## Задание
4 |
5 | Вывести информацию (автора, название и цену) о книгах, цены которых меньше или равны средней цене книг на складе. Информацию вывести в отсортированном по убыванию цены виде. Среднее вычислить как среднее по цене книги.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, title, price
12 | from
13 | book
14 | where
15 | price <= (
16 | select
17 | avg(price)
18 | from
19 | book
20 | )
21 | order by
22 | price desc
23 | ```
24 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.5 Запросы корректировки данных/8 Запросы на удаление.md:
--------------------------------------------------------------------------------
1 | # Запросы на удаление
2 |
3 | ## Задание
4 |
5 | Удалить из таблицы `supply` книги тех авторов, общее количество экземпляров книг которых в таблице `book` превышает 10.
6 |
7 | ## Решение
8 |
9 | ```
10 | delete from supply
11 | where author in (
12 | select
13 | author
14 | from
15 | (
16 | select
17 | author,
18 | sum(amount)
19 | from
20 | book
21 | group by
22 | author
23 | having
24 | sum(amount) > 10
25 | ) a2
26 | )
27 | ```
28 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.5 Запросы корректировки данных/8 Запросы на удаление.md:
--------------------------------------------------------------------------------
1 | # Запросы на удаление
2 |
3 | ## Задание
4 |
5 | Удалить из таблицы `supply` книги тех авторов, общее количество экземпляров книг которых в таблице `book` превышает 10.
6 |
7 | ## Решение
8 |
9 | ```
10 | delete from supply
11 | where author in (
12 | select
13 | author
14 | from
15 | (
16 | select
17 | author,
18 | sum(amount)
19 | from
20 | book
21 | group by
22 | author
23 | having
24 | sum(amount) > 10
25 | ) a2
26 | )
27 | ```
28 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.3 Запросы корректировки, соединение таблиц/3 Запрос на добавление, связанные таблицы.md:
--------------------------------------------------------------------------------
1 | # Запрос на добавление, связанные таблицы
2 |
3 | ## Задание
4 |
5 | Добавить новые книги из таблицы `supply` в таблицу `book` на основе сформированного выше запроса. Затем вывести для просмотра таблицу `book`.
6 |
7 | ## Решение
8 |
9 | ```
10 | insert into
11 | book (title, author_id, genre_id, price, amount)
12 | select
13 | title, author_id, null genre_id, price, amount
14 | from
15 | author
16 | join
17 | supply on author.name_author = supply.author
18 | where
19 | amount != 0;
20 | select
21 | *
22 | from
23 | book
24 | ```
25 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.5 Запросы корректировки данных/4 Добавление записей, вложенные запросы.md:
--------------------------------------------------------------------------------
1 | # Добавление записей, вложенные запросы
2 |
3 | ## Задание
4 |
5 | Занести из таблицы `supply` в таблицу `book` только те книги, авторов которых нет в `book`.
6 |
7 | ## Решение
8 |
9 | ```
10 | insert into book (title, author, price, amount)
11 | select
12 | title, author, price, amount
13 | from
14 | supply
15 | where
16 | title not in (
17 | select
18 | title
19 | from
20 | book
21 | ) and
22 | author not in (
23 | select
24 | author
25 | from
26 | book
27 | );
28 | ```
29 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.3 Запросы корректировки, соединение таблиц/3 Запрос на добавление, связанные таблицы.md:
--------------------------------------------------------------------------------
1 | # Запрос на добавление, связанные таблицы
2 |
3 | ## Задание
4 |
5 | Добавить новые книги из таблицы `supply` в таблицу `book` на основе сформированного выше запроса. Затем вывести для просмотра таблицу `book`.
6 |
7 | ## Решение
8 |
9 | ```
10 | insert into
11 | book (title, author_id, genre_id, price, amount)
12 | select
13 | title, author_id, null genre_id, price, amount
14 | from
15 | author
16 | join
17 | supply on author.name_author = supply.author
18 | where
19 | amount != 0;
20 | select
21 | *
22 | from
23 | book
24 | ```
25 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.5 Запросы корректировки данных/4 Добавление записей, вложенные запросы.md:
--------------------------------------------------------------------------------
1 | # Добавление записей, вложенные запросы
2 |
3 | ## Задание
4 |
5 | Занести из таблицы `supply` в таблицу `book` только те книги, авторов которых нет в `book`.
6 |
7 | ## Решение
8 |
9 | ```
10 | insert into book (title, author, price, amount)
11 | select
12 | title, author, price, amount
13 | from
14 | supply
15 | where
16 | title not in (
17 | select
18 | title
19 | from
20 | book
21 | ) and
22 | author not in (
23 | select
24 | author
25 | from
26 | book
27 | );
28 | ```
29 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.1 Отношение (таблица)/2 Вставка записи в таблицу.md:
--------------------------------------------------------------------------------
1 | # Вставка записи в таблицу
2 |
3 | ## Задание
4 |
5 | Занесите новую строку в таблицу **book** (текстовые значения (тип `VARCHAR`) заключать либо в двойные, либо в одинарные кавычки):
6 |
7 | | **book_id** | **title** | **author** | **price** | **amount** |
8 | |---|---|---|---|---|
9 | | INT PRIMARY KEY AUTO_INCREMENT | VARCHAR(50) | VARCHAR(30) | DECIMAL(8,2) | INT |
10 | | 1 | Мастер и Маргарита | Булгаков М.А. | 670.99 | 3 |
11 |
12 | ## Решение
13 |
14 | ```
15 | INSERT INTO book
16 | (book_id, title, author, price, amount)
17 | VALUES(1, 'Мастер и Маргарита', 'Булгаков М.А.', 670.99, 3);
18 | ```
19 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.1 Отношение (таблица)/2 Вставка записи в таблицу.md:
--------------------------------------------------------------------------------
1 | # Вставка записи в таблицу
2 |
3 | ## Задание
4 |
5 | Занесите новую строку в таблицу **book** (текстовые значения (тип `VARCHAR`) заключать либо в двойные, либо в одинарные кавычки):
6 |
7 | | **book_id** | **title** | **author** | **price** | **amount** |
8 | |---|---|---|---|---|
9 | | INT PRIMARY KEY AUTO_INCREMENT | VARCHAR(50) | VARCHAR(30) | DECIMAL(8,2) | INT |
10 | | 1 | Мастер и Маргарита | Булгаков М.А. | 670.99 | 3 |
11 |
12 | ## Решение
13 |
14 | ```
15 | INSERT INTO book
16 | (book_id, title, author, price, amount)
17 | VALUES(1, 'Мастер и Маргарита', 'Булгаков М.А.', 670.99, 3);
18 | ```
19 |
--------------------------------------------------------------------------------
/Алгоритмы методы/2.3 Наибольший общий делитель.md:
--------------------------------------------------------------------------------
1 | По данным двум числам 1 ≤ a, b ≤ 2*10^9, найдите их наибольший общий делитель.
2 |
3 | **Sample Input 1**:
4 |
5 | 18 35
6 |
7 | **Sample Output 1**:
8 |
9 | 1
10 |
11 | **Sample Input 2**:
12 |
13 | 14159572 63967072
14 |
15 | **Sample Output 2**:
16 |
17 | 4
18 |
19 | # Решение / Solution
20 |
21 | ```
22 | def gcd(a, b):
23 | if a % b == 0 or b % a == 0:
24 | return min(a, b)
25 | else:
26 | if a >= b:
27 | return gcd(a % b, b)
28 | else:
29 | return gcd(a, b % a)
30 |
31 |
32 | def main():
33 | a, b = map(int, input().split())
34 | print(gcd(a, b))
35 |
36 |
37 | if __name__ == "__main__":
38 | main()
39 | ```
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.3 Запросы корректировки, соединение таблиц/2 Запросы на добавление, связанные таблицы.md:
--------------------------------------------------------------------------------
1 | # Запросы на добавление, связанные таблицы
2 |
3 | ## Задание
4 |
5 | Включить новых авторов в таблицу `author` с помощью запроса на добавление, а затем вывести все данные из таблицы `author`. Новыми считаются авторы, которые есть в таблице `supply`, но нет в таблице `author`.
6 |
7 | ## Решение
8 |
9 | ```
10 | insert into
11 | author (name_author)
12 | select
13 | s.author name_author
14 | from
15 | supply s
16 | left join
17 | author a
18 | on s.author = a.name_author
19 | where
20 | a.name_author is null;
21 | select
22 | *
23 | from
24 | author
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.3 Запросы корректировки, соединение таблиц/2 Запросы на добавление, связанные таблицы.md:
--------------------------------------------------------------------------------
1 | # Запросы на добавление, связанные таблицы
2 |
3 | ## Задание
4 |
5 | Включить новых авторов в таблицу `author` с помощью запроса на добавление, а затем вывести все данные из таблицы `author`. Новыми считаются авторы, которые есть в таблице `supply`, но нет в таблице `author`.
6 |
7 | ## Решение
8 |
9 | ```
10 | insert into
11 | author (name_author)
12 | select
13 | s.author name_author
14 | from
15 | supply s
16 | left join
17 | author a
18 | on s.author = a.name_author
19 | where
20 | a.name_author is null;
21 | select
22 | *
23 | from
24 | author
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.5 Запросы корректировки данных/7 Запросы на обновление нескольких таблиц.md:
--------------------------------------------------------------------------------
1 | # Запросы на обновление нескольких таблиц
2 |
3 | ## Задание
4 |
5 | Для тех книг в таблице `book` , которые есть в таблице supply, не только увеличить их количество в таблице `book` ( увеличить их количество на значение столбца `amount` таблицы `supply`), но и пересчитать их цену (для каждой книги найти сумму цен из таблиц `book` и `supply` и разделить на 2).
6 |
7 | ## Решение
8 |
9 | ```
10 | update book, supply
11 | set
12 | book.amount = book.amount + supply.amount,
13 | book.price = (book.price + supply.price) / 2
14 | where
15 | book.title = supply.title and
16 | book.author = supply.author
17 | ```
18 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.5 Запросы корректировки данных/7 Запросы на обновление нескольких таблиц.md:
--------------------------------------------------------------------------------
1 | # Запросы на обновление нескольких таблиц
2 |
3 | ## Задание
4 |
5 | Для тех книг в таблице `book` , которые есть в таблице supply, не только увеличить их количество в таблице `book` ( увеличить их количество на значение столбца `amount` таблицы `supply`), но и пересчитать их цену (для каждой книги найти сумму цен из таблиц `book` и `supply` и разделить на 2).
6 |
7 | ## Решение
8 |
9 | ```
10 | update book, supply
11 | set
12 | book.amount = book.amount + supply.amount,
13 | book.price = (book.price + supply.price) / 2
14 | where
15 | book.title = supply.title and
16 | book.author = supply.author
17 | ```
18 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/11 Выборка данных, оператор LIKE.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, оператор LIKE
2 |
3 | ## Задание
4 |
5 | Вывести название и автора тех книг, название которых состоит из двух и более слов, а инициалы автора содержат букву «С». Считать, что в названии слова отделяются друг от друга пробелами и не содержат знаков препинания, между фамилией автора и инициалами обязателен пробел, инициалы записываются без пробела в формате: буква, точка, буква, точка. Информацию отсортировать по названию книги в алфавитном порядке.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title, author from book where title like '% %' and title not like ' ' and (author like '% С._.' or author like '% _.С.') order by title;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/11 Выборка данных, оператор LIKE.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, оператор LIKE
2 |
3 | ## Задание
4 |
5 | Вывести название и автора тех книг, название которых состоит из двух и более слов, а инициалы автора содержат букву «С». Считать, что в названии слова отделяются друг от друга пробелами и не содержат знаков препинания, между фамилией автора и инициалами обязателен пробел, инициалы записываются без пробела в формате: буква, точка, буква, точка. Информацию отсортировать по названию книги в алфавитном порядке.
6 |
7 | ## Решение
8 |
9 | ```
10 | select title, author from book where title like '% %' and title not like ' ' and (author like '% С._.' or author like '% _.С.') order by title;
11 | ```
12 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.3 Запросы корректировки, соединение таблиц/7 Удаление записей, использование связанных таблиц.md:
--------------------------------------------------------------------------------
1 | # Удаление записей, использование связанных таблиц
2 |
3 | ## Задание
4 |
5 | Удалить всех авторов, которые пишут в жанре "Поэзия". Из таблицы `book` удалить все книги этих авторов. В запросе для отбора авторов использовать полное название жанра, а не его `id`.
6 |
7 | ## Решение
8 |
9 | ```
10 | delete from author
11 | using
12 | author
13 | join
14 | book
15 | on book.author_id = author.author_id
16 | where
17 | book.genre_id in (
18 | select
19 | genre_id
20 | from
21 | genre
22 | where
23 | name_genre = 'Поэзия'
24 | )
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.3 Запросы корректировки, соединение таблиц/7 Удаление записей, использование связанных таблиц.md:
--------------------------------------------------------------------------------
1 | # Удаление записей, использование связанных таблиц
2 |
3 | ## Задание
4 |
5 | Удалить всех авторов, которые пишут в жанре "Поэзия". Из таблицы `book` удалить все книги этих авторов. В запросе для отбора авторов использовать полное название жанра, а не его `id`.
6 |
7 | ## Решение
8 |
9 | ```
10 | delete from author
11 | using
12 | author
13 | join
14 | book
15 | on book.author_id = author.author_id
16 | where
17 | book.genre_id in (
18 | select
19 | genre_id
20 | from
21 | genre
22 | where
23 | name_genre = 'Поэзия'
24 | )
25 | ```
26 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.3 Регулярные выражения в Python 13.md:
--------------------------------------------------------------------------------
1 | Вам дана последовательность строк.
2 |
3 | В каждой строке замените **первое** вхождение слова, состоящего только из латинских букв "**a**" (регистр не важен), на слово "**argh**".
4 |
5 | **Примечание**:
6 |
7 | Обратите внимание на параметр **count** у функции **sub**.
8 |
9 | ---
10 |
11 | **Sample Input**:
12 |
13 | ```
14 | There’ll be no more "Aaaaaaaaaaaaaaa"
15 | AaAaAaA AaAaAaA
16 | ```
17 |
18 | **Sample Output**:
19 |
20 | ```
21 | There’ll be no more "argh"
22 | argh AaAaAaA
23 | ```
24 |
25 | ---
26 |
27 | # Solution / Решение
28 |
29 | ```
30 | import re
31 | import sys
32 |
33 | pattern = r'\b[Aa]+\b'
34 |
35 | for line in sys.stdin:
36 | print(re.sub(pattern, 'argh', line.rstrip(), 1))
37 | ```
38 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.2 Запросы на выборку, соединение таблиц/5 Запросы для нескольких таблиц с группировкой.md:
--------------------------------------------------------------------------------
1 | # Запросы для нескольких таблиц с группировкой
2 |
3 | ## Задание
4 |
5 | Посчитать количество экземпляров книг каждого автора из таблицы `author`. Вывести тех авторов, количество книг которых меньше 10, в отсортированном по возрастанию количества виде. Последний столбец назвать `Количество`.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | a.name_author, coalesce(sum(b.amount), null) Количество
12 | from
13 | author a
14 | left join
15 | book b
16 | on b.author_id = a.author_id
17 | group by
18 | a.name_author
19 | having
20 | sum(b.amount) < 10 or count(b.title) = 0
21 | order by
22 | coalesce(sum(b.amount), 0)
23 | ```
24 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.2 Запросы на выборку, соединение таблиц/5 Запросы для нескольких таблиц с группировкой.md:
--------------------------------------------------------------------------------
1 | # Запросы для нескольких таблиц с группировкой
2 |
3 | ## Задание
4 |
5 | Посчитать количество экземпляров книг каждого автора из таблицы `author`. Вывести тех авторов, количество книг которых меньше 10, в отсортированном по возрастанию количества виде. Последний столбец назвать `Количество`.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | a.name_author, coalesce(sum(b.amount), null) Количество
12 | from
13 | author a
14 | left join
15 | book b
16 | on b.author_id = a.author_id
17 | group by
18 | a.name_author
19 | having
20 | sum(b.amount) < 10 or count(b.title) = 0
21 | order by
22 | coalesce(sum(b.amount), 0)
23 | ```
24 |
--------------------------------------------------------------------------------
/Python Course tasks/week 11/student_ids.md:
--------------------------------------------------------------------------------
1 | Есть файл в котором в каждой строчке два числа разделенных запятой: ID студента и ID решенной задачи. Пример:
2 |
3 | ```
4 | 1,2
5 | 1,4
6 | 1,3
7 | 1,3
8 | 2,1
9 | 2,2
10 | 2,3
11 | 2,4
12 | ```
13 |
14 | Напишите функцию, которая принимает имя файла и возвращает словарь, в котором для каждого студента будет указано количество решенных им задач. Записи о решенных задачах могут повторятся.
15 |
16 | **Решение**
17 |
18 | ```
19 | def solved_tasks(filename):
20 | with open(filename) as f:
21 | data = f.readlines()
22 | lines = {tuple(int(y) for y in x.split(',')) for x in data}
23 | result = {}
24 | for line in lines:
25 | student, _ = line
26 | result[student] = result.get(student, 0) + 1
27 | return result
28 | ```
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.3 Запросы, групповые операции/7 Выборка данных по условию, групповые функции, WHERE и HAVING.md:
--------------------------------------------------------------------------------
1 | # Выборка данных по условию, групповые функции, WHERE и HAVING
2 |
3 | ## Задание
4 |
5 | Посчитать стоимость всех экземпляров каждого автора без учета книг «Идиот» и «Белая гвардия». В результат включить только тех авторов, у которых суммарная стоимость книг более 5000 руб. Вычисляемый столбец назвать Стоимость. Результат отсортировать по убыванию стоимости.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, sum(price * amount) Стоимость
12 | from
13 | book
14 | where
15 | title <> 'Идиот' and title <> 'Белая гвардия'
16 | group by
17 | author
18 | having
19 | Стоимость > 5000
20 | order by
21 | Стоимость desc;
22 | ```
23 |
--------------------------------------------------------------------------------
/Python Course tasks/week 7/fix_duplicates.md:
--------------------------------------------------------------------------------
1 | Напишите функцию `fix_duplicates`, которая будет принимать на вход список строк-идентификаторов и исправлять их так, чтобы в результирующем списке не было дубликатов. Для этого она будет прибавлять к повторяющимся идентификаторам постфикс `_n`, где `n` - количество раз, сколько такой идентификатор уже встречался.
2 |
3 | **Пример**
4 |
5 | ```python
6 | ids = ["a", "b", "c", "a", "a", "d", "c"]
7 | fix_duplicates(ids) == ['a', 'b', 'c', 'a_1', 'a_2', 'd', 'c_1']
8 | ```
9 |
10 | **Решение**
11 |
12 | ```python
13 | def fix_duplicates(ids):
14 | result = []
15 | for i, e in enumerate(ids):
16 | count = ids[:i].count(e)
17 | appendix = f'_{count}' if count else ''
18 | result.append(f'{e}{appendix}')
19 | return result
20 | ```
21 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.3 Запросы, групповые операции/7 Выборка данных по условию, групповые функции, WHERE и HAVING.md:
--------------------------------------------------------------------------------
1 | # Выборка данных по условию, групповые функции, WHERE и HAVING
2 |
3 | ## Задание
4 |
5 | Посчитать стоимость всех экземпляров каждого автора без учета книг «Идиот» и «Белая гвардия». В результат включить только тех авторов, у которых суммарная стоимость книг более 5000 руб. Вычисляемый столбец назвать Стоимость. Результат отсортировать по убыванию стоимости.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author, sum(price * amount) Стоимость
12 | from
13 | book
14 | where
15 | title <> 'Идиот' and title <> 'Белая гвардия'
16 | group by
17 | author
18 | having
19 | Стоимость > 5000
20 | order by
21 | Стоимость desc;
22 | ```
23 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.5 Распространённые форматы текстовых файлов CSV, JSON 2.md:
--------------------------------------------------------------------------------
1 | Вам дана частичная выборка из датасета зафиксированных преступлений, совершенных в городе Чикаго с 2001 года по настоящее время.
2 |
3 | Одним из атрибутов преступления является его тип – **Primary Type**.
4 |
5 | Вам необходимо узнать тип преступления, которое было зафиксировано максимальное число раз в 2015 году.
6 |
7 | Файл с данными: **Crimes.csv**
8 |
9 | # Solution / Решение
10 |
11 | ```
12 | import csv
13 | from collections import Counter
14 |
15 | with open('Crimes.csv') as file:
16 | reader = csv.reader(file)
17 | data = list(reader)[1:]
18 | crimes = list(zip(*data))[5]
19 | crime_counts = Counter(crimes)
20 | print(crime_counts.most_common(1))
21 | ```
--------------------------------------------------------------------------------
/Python - основы и применение/2.5 Работа с функциями - functool и лямбда функции 6.md:
--------------------------------------------------------------------------------
1 | Лямбда функции предоставляют нам удобный способ создать функцию «прямо на месте». Но иногда, когда нужно создавать много однотипных лямбда функций, еще удобнее будет создать функцию, которая будет их генерировать.
2 |
3 | Реализуйте функцию **mod_checker(x, mod=0)**, которая будет генерировать лямбда функцию от одного аргумента **y**, которая будет возвращать **True**, если остаток от деления **y** на **x** равен **mod**, и **False** иначе.
4 |
5 | **Пример использования**:
6 |
7 | ```
8 | mod_3 = mod_checker(3)
9 | print(mod_3(3)) # True
10 | print(mod_3(4)) # False
11 |
12 | mod_3_1 = mod_checker(3, 1)
13 | print(mod_3_1(4)) # True
14 | ```
15 |
16 | # Solution / Решение
17 |
18 | ```
19 | def mod_checker(x, mod=0):
20 | return lambda y: y % x == mod
21 | ```
22 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.5 Распространённые форматы текстовых файлов CSV, JSON 2 (2).md:
--------------------------------------------------------------------------------
1 | Вам дана частичная выборка из датасета зафиксированных преступлений, совершенных в городе Чикаго с 2001 года по настоящее время.
2 |
3 | Одним из атрибутов преступления является его тип – **Primary Type**.
4 |
5 | Вам необходимо узнать тип преступления, которое было зафиксировано максимальное число раз в 2015 году.
6 |
7 | Файл с данными: **Crimes.csv**
8 |
9 | # Solution / Решение
10 |
11 | ```
12 | import csv
13 | from collections import Counter
14 |
15 | with open('Crimes.csv') as file:
16 | reader = csv.reader(file)
17 | data = list(reader)[1:]
18 | crimes = list(zip(*data))[5]
19 | crime_counts = Counter(crimes)
20 | print(crime_counts.most_common(1))
21 | ```
22 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.3 Регулярные выражения в Python 8.md:
--------------------------------------------------------------------------------
1 | Вам дана последовательность строк.
2 |
3 | Выведите строки, содержащие "**cat**" в качестве слова.
4 |
5 | **Примечание**:
6 |
7 | Для работы со словами используйте группы символов **\b** и **\B**. Описание этих групп вы можете найти в документации.
8 |
9 | ---
10 |
11 | **Sample Input**:
12 |
13 | ```
14 | cat
15 | catapult and cat
16 | catcat
17 | concat
18 | Cat
19 | "cat"
20 | !cat?
21 | ```
22 |
23 | **Sample Output**:
24 |
25 | ```
26 | cat
27 | catapult and cat
28 | "cat"
29 | !cat?
30 | ```
31 |
32 | ---
33 |
34 | # Solution / Решение
35 |
36 | ```
37 | import re
38 | import sys
39 | pattern = r'\bcat\b'
40 | for line in sys.stdin:
41 | line = line.rstrip()
42 | if re.search(pattern, line):
43 | print(line)
44 | ```
45 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.5 Запросы корректировки данных/9 Запросы на создание таблицы.md:
--------------------------------------------------------------------------------
1 | # Запросы на создание таблицы
2 |
3 | ## Задание
4 |
5 | Создать таблицу заказ (`ordering`), куда включить авторов и названия тех книг, количество экземпляров которых в таблице book меньше среднего количества экземпляров книг в таблице `book`. В таблицу включить столбец `amount`, в котором для всех книг указать одинаковое значение - среднее количество экземпляров книг в таблице `book`.
6 |
7 | ## Решение
8 |
9 | ```
10 | create table ordering
11 | select
12 | author, title, (
13 | select
14 | avg(amount)
15 | from
16 | book
17 | ) amount
18 | from
19 | book
20 | where
21 | amount < (
22 | select
23 | avg(amount)
24 | from
25 | book
26 | )
27 | ```
28 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.5 Запросы корректировки данных/9 Запросы на создание таблицы.md:
--------------------------------------------------------------------------------
1 | # Запросы на создание таблицы
2 |
3 | ## Задание
4 |
5 | Создать таблицу заказ (`ordering`), куда включить авторов и названия тех книг, количество экземпляров которых в таблице book меньше среднего количества экземпляров книг в таблице `book`. В таблицу включить столбец `amount`, в котором для всех книг указать одинаковое значение - среднее количество экземпляров книг в таблице `book`.
6 |
7 | ## Решение
8 |
9 | ```
10 | create table ordering
11 | select
12 | author, title, (
13 | select
14 | avg(amount)
15 | from
16 | book
17 | ) amount
18 | from
19 | book
20 | where
21 | amount < (
22 | select
23 | avg(amount)
24 | from
25 | book
26 | )
27 | ```
28 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.3 Регулярные выражения в Python 7.md:
--------------------------------------------------------------------------------
1 | Вам дана последовательность строк.
2 |
3 | Выведите строки, содержащие "**cat**" в качестве подстроки хотя бы два раза.
4 |
5 | **Примечание**:
6 |
7 | Считать все строки по одной из стандартного потока ввода вы можете, например, так
8 |
9 | ```
10 | import sys
11 |
12 | for line in sys.stdin:
13 | line = line.rstrip()
14 | # process line
15 | ```
16 |
17 | ---
18 |
19 | **Sample Input**:
20 |
21 | ```
22 | catcat
23 | cat and cat
24 | catac
25 | cat
26 | ccaatt
27 | ```
28 |
29 | **Sample Output**:
30 |
31 | ```
32 | catcat
33 | cat and cat
34 | ```
35 |
36 | ---
37 |
38 | # Solution / Решение
39 |
40 | ```
41 | import re
42 | import sys
43 | pattern = r'((cat).*){2,}'
44 | for line in sys.stdin:
45 | line = line.rstrip()
46 | if re.search(pattern, line):
47 | print(line)
48 | ```
49 |
--------------------------------------------------------------------------------
/Python - основы и применение/2.1 Ошибки и исключения 6.md:
--------------------------------------------------------------------------------
1 | Вашей программе будет доступна функция **foo**, которая может бросать исключения.
2 |
3 | Вам необходимо написать код, который запускает эту функцию, затем ловит исключения **ArithmeticError**, **AssertionError**, **ZeroDivisionError** и выводит имя пойманного исключения.
4 |
5 | Пример решения, которое вы должны отправить на проверку.
6 |
7 | ```
8 | try:
9 | foo()
10 | except Exception:
11 | print("Exception")
12 | except BaseException:
13 | print("BaseException")
14 | ```
15 |
16 | Подсказка: https://docs.python.org/3/library/exceptions.html#exception-hierarchy
17 |
18 | # Решение
19 |
20 | ```
21 | try:
22 | foo()
23 | except ZeroDivisionError:
24 | print('ZeroDivisionError')
25 | except ArithmeticError:
26 | print('ArithmeticError')
27 | except AssertionError:
28 | print('AssertionError')
29 | ```
30 |
--------------------------------------------------------------------------------
/Алгоритмы методы/2.3 Числа Фибоначчи.md:
--------------------------------------------------------------------------------
1 | Дано число 1 ≤ n ≤ 10^7, необходимо найти последнюю цифру n-го числа Фибоначчи.
2 |
3 | Как мы помним, числа Фибоначчи растут очень быстро, поэтому при их вычислении нужно быть аккуратным с переполнением. В данной задаче, впрочем, этой проблемы можно избежать, поскольку нас интересует только последняя цифра числа Фибоначчи: если 0 ≤ a, b ≤ 9 — последние цифры чисел Fi и Fi+1 соответственно, то (a+b) mod 10 — последняя цифра числа Fi+2.
4 |
5 | **Sample Input**:
6 |
7 | 132941
8 |
9 | **Sample Output**:
10 |
11 | 1
12 |
13 | # Решение / Solution
14 |
15 | ```
16 | def fib_digit(n):
17 | lst = [0, 1] + [x for x in range(1, n + 1)]
18 | for i in lst[3:]:
19 | lst[i] = (lst[i-1] + lst[i-2]) % 10
20 | return lst[n]
21 |
22 |
23 | def main():
24 | n = int(input())
25 | print(fib_digit(n))
26 |
27 |
28 | if __name__ == "__main__":
29 | main()
30 | ```
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.4 Вложенные запросы/5 Вложенный запрос после SELECT.md:
--------------------------------------------------------------------------------
1 | # Вложенный запрос после SELECT
2 |
3 | ## Задание
4 |
5 | Посчитать сколько и каких экземпляров книг нужно заказать поставщикам, чтобы на складе стало одинаковое количество экземпляров каждой книги, равное значению самого большего количества экземпляров одной книги на складе. Вывести название книги, ее автора, текущее количество экземпляров на складе и количество заказываемых экземпляров книг. Последнему столбцу присвоить имя **Заказ**.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | title,
12 | author,
13 | amount,
14 | (
15 | select
16 | max(amount)
17 | from
18 | book
19 | ) - amount Заказ
20 | from
21 | book
22 | where
23 | amount <> (
24 | select
25 | max(amount)
26 | from
27 | book
28 | )
29 | ```
30 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.1 Связи между таблицами/5.md:
--------------------------------------------------------------------------------
1 | ## Задание
2 |
3 | Добавьте три последние записи (с ключевыми значениями 6, 7, 8) в таблицу `book`, первые 5 записей уже добавлены:
4 |
5 | | book_id | title | author_id | genre_id | price | amount |
6 | |---|---|---|---|---|---|
7 | | 1 | Мастер и Маргарита |1 | 1 | 670.99 | 3 |
8 | | 2 | Белая гвардия |1 | 1 | 540.50 | 5 |
9 | | 3 | Идиот | 1 | 1 | 540.50 | 10 |
10 | | 4 | Братья Карамазовы | 2 | 1 | 799.01 | 3 |
11 | | 5 | Игрок |2 | 1 | 580.50 | 10 |
12 | | 6 | Стихотворения и поэмы | 3 | 3 | 570.20 | 15 |
13 | | 7 | Черный человек |3 | 2 | 570.20 | 6 |
14 | | 8 | Лирика |4 | 2 | 518.99 | 2 |
15 |
16 | ## Решение
17 |
18 | ```
19 | insert into book (title, author_id, genre_id, price, amount)
20 | values
21 | ('Стихотворения и поэмы', 3, 2, 650.00, 15),
22 | ('Черный человек', 3, 2, 570.20, 6),
23 | ('Лирика', 4, 2, 518.99, 2)
24 | ```
25 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.1 Связи между таблицами/5.md:
--------------------------------------------------------------------------------
1 | ## Задание
2 |
3 | Добавьте три последние записи (с ключевыми значениями 6, 7, 8) в таблицу `book`, первые 5 записей уже добавлены:
4 |
5 | | book_id | title | author_id | genre_id | price | amount |
6 | |---|---|---|---|---|---|
7 | | 1 | Мастер и Маргарита |1 | 1 | 670.99 | 3 |
8 | | 2 | Белая гвардия |1 | 1 | 540.50 | 5 |
9 | | 3 | Идиот | 1 | 1 | 540.50 | 10 |
10 | | 4 | Братья Карамазовы | 2 | 1 | 799.01 | 3 |
11 | | 5 | Игрок |2 | 1 | 580.50 | 10 |
12 | | 6 | Стихотворения и поэмы | 3 | 3 | 570.20 | 15 |
13 | | 7 | Черный человек |3 | 2 | 570.20 | 6 |
14 | | 8 | Лирика |4 | 2 | 518.99 | 2 |
15 |
16 | ## Решение
17 |
18 | ```
19 | insert into book (title, author_id, genre_id, price, amount)
20 | values
21 | ('Стихотворения и поэмы', 3, 2, 650.00, 15),
22 | ('Черный человек', 3, 2, 570.20, 6),
23 | ('Лирика', 4, 2, 518.99, 2)
24 | ```
25 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.4 Вложенные запросы/5 Вложенный запрос после SELECT.md:
--------------------------------------------------------------------------------
1 | # Вложенный запрос после SELECT
2 |
3 | ## Задание
4 |
5 | Посчитать сколько и каких экземпляров книг нужно заказать поставщикам, чтобы на складе стало одинаковое количество экземпляров каждой книги, равное значению самого большего количества экземпляров одной книги на складе. Вывести название книги, ее автора, текущее количество экземпляров на складе и количество заказываемых экземпляров книг. Последнему столбцу присвоить имя **Заказ**.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | title,
12 | author,
13 | amount,
14 | (
15 | select
16 | max(amount)
17 | from
18 | book
19 | ) - amount Заказ
20 | from
21 | book
22 | where
23 | amount <> (
24 | select
25 | max(amount)
26 | from
27 | book
28 | )
29 | ```
30 |
--------------------------------------------------------------------------------
/Python Course tasks/week 7/average_attempts.md.py:
--------------------------------------------------------------------------------
1 | Даны два списка. В первом записи вида: id на Степике, id задачи, количество попыток. Во втором: id на Степике и имя. Напишите функцию, которая посчитает для каждого человека среднее число попыток и сделает словарь с результатами.
2 |
3 | **Пример**
4 |
5 | ```python
6 | attempts = [(1232323323415, 1, 43),
7 | (1232323323415, 2, 3),
8 | (114349, 1, 0)
9 | ]
10 | names = [(114349, "Arkady"),
11 | (1232323323415, "Random")]
12 |
13 | average_attempts(attempts, names) == {'Random': 23.0, 'Arkady': 0.0}
14 | ```
15 |
16 | **Решение**
17 |
18 | ```python
19 | def average_attempts(attempts, names):
20 | d = {}
21 | for name in names:
22 | grades = [attempt[-1] for attempt in attempts if name[0] == attempt[0]]
23 | if grades:
24 | avg = sum(grades) / len(grades)
25 | d[name[1]] = avg
26 | return d
27 | ```
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.1 Отношение (таблица)/3 Вставка записи в таблицу.md:
--------------------------------------------------------------------------------
1 | # Вставка записи в таблицу
2 |
3 | ## Задание
4 |
5 | Занесите три последние записи в таблицуbook, первая запись уже добавлена на предыдущем шаге:
6 |
7 | | **book_id** | **title** | **author** | **price** | **amount** |
8 | |---|---|---|---|---|
9 | | INT PRIMARY KEY AUTO_INCREMENT | VARCHAR(50) | VARCHAR(30) | DECIMAL(8,2) | INT |
10 | | 1 | Мастер и Маргарита | Булгаков М.А. | 670.99 | 3 |
11 | | 2 | Белая гвардия | Булгаков М.А. | 540.50 | 5 |
12 | | 3 | Идиот | Достоевский Ф.М. | 460.00 | 10 |
13 | | 4 | Братья Карамазовы | Достоевский Ф.М. | 799.01 | 2 |
14 |
15 | ## Решение
16 |
17 | ```
18 | INSERT INTO book
19 | (title, author, price, amount)
20 | VALUES
21 | ('Белая гвардия', 'Булгаков М.А.', 540.50, 5),
22 | ('Идиот', 'Достоевский Ф.М.', 460.00, 10),
23 | ('Братья Карамазовы', 'Достоевский Ф.М.', 799.01, 2);
24 | ```
25 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.1 Отношение (таблица)/3 Вставка записи в таблицу.md:
--------------------------------------------------------------------------------
1 | # Вставка записи в таблицу
2 |
3 | ## Задание
4 |
5 | Занесите три последние записи в таблицуbook, первая запись уже добавлена на предыдущем шаге:
6 |
7 | | **book_id** | **title** | **author** | **price** | **amount** |
8 | |---|---|---|---|---|
9 | | INT PRIMARY KEY AUTO_INCREMENT | VARCHAR(50) | VARCHAR(30) | DECIMAL(8,2) | INT |
10 | | 1 | Мастер и Маргарита | Булгаков М.А. | 670.99 | 3 |
11 | | 2 | Белая гвардия | Булгаков М.А. | 540.50 | 5 |
12 | | 3 | Идиот | Достоевский Ф.М. | 460.00 | 10 |
13 | | 4 | Братья Карамазовы | Достоевский Ф.М. | 799.01 | 2 |
14 |
15 | ## Решение
16 |
17 | ```
18 | INSERT INTO book
19 | (title, author, price, amount)
20 | VALUES
21 | ('Белая гвардия', 'Булгаков М.А.', 540.50, 5),
22 | ('Идиот', 'Достоевский Ф.М.', 460.00, 10),
23 | ('Братья Карамазовы', 'Достоевский Ф.М.', 799.01, 2);
24 | ```
25 |
--------------------------------------------------------------------------------
/Python Course tasks/week 11/coords_min_max.md:
--------------------------------------------------------------------------------
1 | В каждой строчке файла даны координаты точки, два числа через пробел. Пример:
2 |
3 | ```
4 | 1 2
5 | 3 4
6 | -2 23
7 | 3 -1
8 | ```
9 |
10 | Напишите функцию, которая будет принимать имя файла и возвращать кортеж из четырех чисел: минимум и максимум первой координаты, минимум и максимум второй координаты. Для примера выше результатом будет:
11 |
12 | `(-2, 3, -1, 23)`
13 |
14 |
15 | Для пустого файла функция должна возвращать кортеж у которого все элементы будут None.
16 |
17 | В конце файла может быть пустая строка.
18 |
19 | **Решение**
20 |
21 | ```
22 | def minmax_coords(filename):
23 | with open(filename) as f:
24 | data = f.readlines()
25 | if not data:
26 | return None, None, None, None
27 | floats = [[float(y) for y in x.split()] for x in data]
28 | xs, ys = list(zip(*floats))
29 | return min(xs), max(xs), min(ys), max(ys)
30 | ```
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.1 Связи между таблицами/4 Действия при удалении записи главной таблицы.md:
--------------------------------------------------------------------------------
1 | # Действия при удалении записи главной таблицы
2 |
3 | ## Задание
4 |
5 | Создать таблицу `book` той же структуры, что и на предыдущем шаге. Будем считать, что при удалении автора из таблицы `author`, должны удаляться все записи о книгах из таблицы `book`, написанные этим автором. А при удалении жанра из таблицы genre для соответствующей записи `book` установить значение `Null` в столбце `genre_id`.
6 |
7 | ## Решение
8 |
9 | ```
10 | CREATE TABLE book (
11 | book_id INT PRIMARY KEY AUTO_INCREMENT,
12 | title VARCHAR(50),
13 | author_id INT NOT NULL,
14 | genre_id INT,
15 | price DECIMAL(8,2),
16 | amount INT,
17 | FOREIGN KEY (author_id) REFERENCES author (author_id) ON DELETE CASCADE,
18 | FOREIGN KEY (genre_id) REFERENCES genre (genre_id) ON DELETE SET NULL
19 | );
20 | ```
21 |
--------------------------------------------------------------------------------
/Алгоритмы методы/4.1.11 Различные слагаемые.md:
--------------------------------------------------------------------------------
1 | По данному числу 1 ≤ *n* ≤ 10^9 найдите максимальное число *k*, для которого *n* можно представить как сумму *k* различных натуральных слагаемых. Выведите в первой строке число *k*, во второй — *k* слагаемых.
2 |
3 | **Sample Input 1**:
4 |
5 | `4`
6 |
7 | **Sample Output 1**:
8 |
9 | ```
10 | 2
11 | 1 3
12 | ```
13 |
14 | **Sample Input 2**:
15 |
16 | `6`
17 |
18 | **Sample Output 2**:
19 |
20 | ```
21 | 3
22 | 1 2 3
23 | ```
24 |
25 | # Решение
26 |
27 | ```
28 | def calculation(n):
29 | terms = []
30 | a, b = 1, n - 1
31 | while b > a:
32 | terms.append(a)
33 | a += 1
34 | b = b - a
35 | terms.append(n-sum(terms))
36 | return terms
37 |
38 |
39 | def main():
40 | n = int(input())
41 | result = calculation(n)
42 | print(len(result))
43 | print(' '.join(map(str, result)))
44 |
45 | if __name__ == "__main__":
46 | main()
47 | ```
48 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.1 Связи между таблицами/4 Действия при удалении записи главной таблицы.md:
--------------------------------------------------------------------------------
1 | # Действия при удалении записи главной таблицы
2 |
3 | ## Задание
4 |
5 | Создать таблицу `book` той же структуры, что и на предыдущем шаге. Будем считать, что при удалении автора из таблицы `author`, должны удаляться все записи о книгах из таблицы `book`, написанные этим автором. А при удалении жанра из таблицы genre для соответствующей записи `book` установить значение `Null` в столбце `genre_id`.
6 |
7 | ## Решение
8 |
9 | ```
10 | CREATE TABLE book (
11 | book_id INT PRIMARY KEY AUTO_INCREMENT,
12 | title VARCHAR(50),
13 | author_id INT NOT NULL,
14 | genre_id INT,
15 | price DECIMAL(8,2),
16 | amount INT,
17 | FOREIGN KEY (author_id) REFERENCES author (author_id) ON DELETE CASCADE,
18 | FOREIGN KEY (genre_id) REFERENCES genre (genre_id) ON DELETE SET NULL
19 | );
20 | ```
21 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.2 Запросы на выборку, соединение таблиц/3 Перекрестное соединение CROSS JOIN.md:
--------------------------------------------------------------------------------
1 | # Перекрестное соединение CROSS JOIN
2 |
3 | ## Задание
4 |
5 | Есть список городов, хранящийся в таблице `city`:
6 |
7 | | city_id | name_city |
8 | |---|---|
9 | | 1 | Москва |
10 | | 2 | Санкт-Петербург |
11 | | 3 | Владивосток |
12 |
13 | Необходимо в каждом городе провести выставку книг каждого автора в течение 2020 года. Дату проведения выставки выбрать случайным образом. Создать запрос, который выведет город, автора и дату проведения выставки. Последний столбец назвать **Дата**. Информацию вывести, отсортировав сначала в алфавитном порядке по названиям городов, а потом по убыванию дат проведения выставок.
14 |
15 | ## Решение
16 |
17 | ```
18 | select
19 | name_city, name_author, date_add('2020-01-01', interval floor(rand() * 365) day) Дата
20 | from
21 | city, author
22 | order by
23 | 1, 3 desc
24 | ```
25 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.2 Запросы на выборку, соединение таблиц/3 Перекрестное соединение CROSS JOIN.md:
--------------------------------------------------------------------------------
1 | # Перекрестное соединение CROSS JOIN
2 |
3 | ## Задание
4 |
5 | Есть список городов, хранящийся в таблице `city`:
6 |
7 | | city_id | name_city |
8 | |---|---|
9 | | 1 | Москва |
10 | | 2 | Санкт-Петербург |
11 | | 3 | Владивосток |
12 |
13 | Необходимо в каждом городе провести выставку книг каждого автора в течение 2020 года. Дату проведения выставки выбрать случайным образом. Создать запрос, который выведет город, автора и дату проведения выставки. Последний столбец назвать **Дата**. Информацию вывести, отсортировав сначала в алфавитном порядке по названиям городов, а потом по убыванию дат проведения выставок.
14 |
15 | ## Решение
16 |
17 | ```
18 | select
19 | name_city, name_author, date_add('2020-01-01', interval floor(rand() * 365) day) Дата
20 | from
21 | city, author
22 | order by
23 | 1, 3 desc
24 | ```
25 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.2 Выборка данных/6 Выборка данных, вычисляемые столбцы, логические функции.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, вычисляемые столбцы, логические функции
2 |
3 | ## Задание
4 |
5 | При анализе продаж книг выяснилось, что наибольшей популярностью пользуются книги Михаила Булгакова, на втором месте книги Сергея Есенина. Исходя из этого решили поднять цену книг Булгакова на 10%, а цену книг Есенина - на 5%. Написать запрос, куда включить автора, название книги и новую цену, последний столбец назвать `new_price`. Значение округлить до двух знаков после запятой.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author,
12 | title,
13 | case
14 | when
15 | author like 'Булгаков%'
16 | then round(price * 1.1, 2)
17 | when
18 | author like 'Есенин%'
19 | then round(price * 1.05, 2)
20 | else
21 | price
22 | end new_price
23 | from book;
24 | ```
25 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.2 Выборка данных/6 Выборка данных, вычисляемые столбцы, логические функции.md:
--------------------------------------------------------------------------------
1 | # Выборка данных, вычисляемые столбцы, логические функции
2 |
3 | ## Задание
4 |
5 | При анализе продаж книг выяснилось, что наибольшей популярностью пользуются книги Михаила Булгакова, на втором месте книги Сергея Есенина. Исходя из этого решили поднять цену книг Булгакова на 10%, а цену книг Есенина - на 5%. Написать запрос, куда включить автора, название книги и новую цену, последний столбец назвать `new_price`. Значение округлить до двух знаков после запятой.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | author,
12 | title,
13 | case
14 | when
15 | author like 'Булгаков%'
16 | then round(price * 1.1, 2)
17 | when
18 | author like 'Есенин%'
19 | then round(price * 1.05, 2)
20 | else
21 | price
22 | end new_price
23 | from book;
24 | ```
25 |
--------------------------------------------------------------------------------
/Python - основы и применение/2.1 Ошибки и исключения 9.md:
--------------------------------------------------------------------------------
1 | Реализуйте класс **PositiveList**, отнаследовав его от класса **list**, для хранения положительных целых чисел.
2 |
3 | Также реализуйте новое исключение **NonPositiveError**.
4 |
5 | В классе **PositiveList** переопределите метод **append(self, x)** таким образом, чтобы при попытке добавить неположительное целое число бросалось исключение **NonPositiveError** и число не добавлялось, а при попытке добавить положительное целое число, число добавлялось бы как в стандартный **list**.
6 |
7 | В данной задаче гарантируется, что в качестве аргумента **x** метода **append** всегда будет передаваться целое число.
8 |
9 | **Примечание**
10 |
11 | Положительными считаются числа, строго большие нуля.
12 |
13 | # Решение
14 |
15 | ```
16 | class NonPositiveError(Exception):
17 | pass
18 |
19 | class PositiveList(list):
20 | def append(self, x):
21 | if x > 0:
22 | super(PositiveList, self).append(x)
23 | else:
24 | raise NonPositiveError
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/1.3 Запросы, групповые операции/4 Выборка данных c вычислением, групповые функции.md:
--------------------------------------------------------------------------------
1 | # Выборка данных c вычислением, групповые функции
2 |
3 | ## Задание
4 |
5 | Для каждого автора вычислить суммарную стоимость книг S (имя столбца **Стоимость**), а также вычислить налог на добавленную стоимость для полученных сумм (имя столбца НДС ) , который **включен в стоимость** и составляет k = 18%, а также стоимость книг (**Стоимость_без_НДС**) без него. Значения округлить до двух знаков после запятой. В запросе для расчета НДС(**tax**) и Стоимости без НДС (**S_without_tax**) использовать следующие формулы:
6 |
7 | ```
8 | tax = (S * 1/100) / (1 + k/100)
9 |
10 | S_without_tax = S / (1 + k/100)
11 | ```
12 |
13 | ## Решение
14 |
15 | ```
16 | select
17 | author,
18 | sum(price * amount) Стоимость,
19 | round((sum(price * amount) * 0.18) / (1 + 0.18), 2) НДС,
20 | round(sum(price * amount) / (1 + 0.18), 2) Стоимость_без_НДС
21 | from
22 | book
23 | group by
24 | author
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/1 Основы реляционной модели/1.3 Запросы, групповые операции/4 Выборка данных c вычислением, групповые функции.md:
--------------------------------------------------------------------------------
1 | # Выборка данных c вычислением, групповые функции
2 |
3 | ## Задание
4 |
5 | Для каждого автора вычислить суммарную стоимость книг S (имя столбца **Стоимость**), а также вычислить налог на добавленную стоимость для полученных сумм (имя столбца НДС ) , который **включен в стоимость** и составляет k = 18%, а также стоимость книг (**Стоимость_без_НДС**) без него. Значения округлить до двух знаков после запятой. В запросе для расчета НДС(**tax**) и Стоимости без НДС (**S_without_tax**) использовать следующие формулы:
6 |
7 | ```
8 | tax = (S * 1/100) / (1 + k/100)
9 |
10 | S_without_tax = S / (1 + k/100)
11 | ```
12 |
13 | ## Решение
14 |
15 | ```
16 | select
17 | author,
18 | sum(price * amount) Стоимость,
19 | round((sum(price * amount) * 0.18) / (1 + 0.18), 2) НДС,
20 | round(sum(price * amount) / (1 + 0.18), 2) Стоимость_без_НДС
21 | from
22 | book
23 | group by
24 | author
25 | ```
26 |
--------------------------------------------------------------------------------
/Python - основы и применение/2.4 Работа с файловой системой и файлами 6.md:
--------------------------------------------------------------------------------
1 | Вам дана в архиве (ссылка) файловая структура, состоящая из директорий и файлов.
2 |
3 | Вам необходимо распаковать этот архив, и затем найти в данной в файловой структуре все директории, в которых есть хотя бы один файл с расширением "**.py**".
4 |
5 | Ответом на данную задачу будет являться файл со списком таких директорий, **отсортированных в лексикографическом порядке**.
6 |
7 | Для лучшего понимания формата задачи, ознакомьтесь с примером.
8 |
9 | - Пример архива
10 | - Пример ответа
11 |
12 | # Solution/Решение
13 |
14 | ```
15 | import os
16 |
17 | with open('result.txt', 'a') as f:
18 | for current_dir, dirs, files in os.walk('main'):
19 | if list(filter(lambda x: x.endswith('.py'), files)):
20 | f.write('{}\n'.format(current_dir))
21 | ```
22 |
--------------------------------------------------------------------------------
/Адаптивный тренажёр Python/5.19 Find a substring.md:
--------------------------------------------------------------------------------
1 | Напишите программу, которая находит все позиции вхождения подстроки в строку.
2 |
3 | **Формат ввода**:
4 |
5 | На первой строке содержится исходная строка, на второй строке ввода указана подстрока, позиции которой требуется найти. Строки состоят из символов латинского алфавита.
6 |
7 | **Формат вывода**:
8 |
9 | Строка, содержащая индексы (индексация начинается с нуля) вхождения подстроки в строку, разделённые пробелом или число -1 в случае, когда подстрока не найдена.
10 |
11 | **Sample Input 1**:
12 |
13 | ```
14 | abacabadaba
15 | aba
16 | ```
17 |
18 | **Sample Output 1**:
19 |
20 | `0 4 8`
21 |
22 | **Sample Input 2**:
23 |
24 | ```
25 | aaaa
26 | aa
27 | ```
28 |
29 | **Sample Output 2**:
30 |
31 | `0 1 2`
32 |
33 | **Sample Input 3**:
34 |
35 | ```
36 | abc
37 | d
38 | ```
39 |
40 | **Sample Output 3**:
41 |
42 | `-1`
43 |
44 | # Solution/Решение
45 |
46 | ```
47 | initial, s = input(), input()
48 | res = [i for i in range(len(initial) - len(s) + 1) if initial[i:i + len(s)] == s]
49 | print(' '.join(map(str, res)) if res else -1)
50 | ```
51 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.1 Связи между таблицами/3 Создание таблицы с внешними ключами.md:
--------------------------------------------------------------------------------
1 | # Создание таблицы с внешними ключами
2 |
3 | ## Задание
4 |
5 | Перепишите запрос на создание таблицы `book`, чтобы ее структура соответствовала структуре, показанной на логической схеме (таблица `genre` уже создана, порядок следования столбцов - как на логической схеме в таблице `book`, `genre_id` - внешний ключ) . Для `genre_id` ограничение о недопустимости пустых значений **не задавать**. В качестве главной таблицы для описания поля `genre_id` использовать таблицу `genre` следующей структуры:
6 |
7 | | Поле | Тип, описание |
8 | |---|---|
9 | | author_id | `INT PRIMARY KEY AUTO_INCREMENT` |
10 | | name_author |`VARCHAR(30)` |
11 |
12 | ## Решение
13 |
14 | ```
15 | create table book (
16 | book_id int primary key auto_increment,
17 | title varchar(50),
18 | author_id int not null,
19 | genre_id int,
20 | price decimal(8,2),
21 | amount int,
22 | foreign key (author_id) references author (author_id),
23 | foreign key (genre_id) references genre (genre_id)
24 | )
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.3 Запросы корректировки, соединение таблиц/1 Запросы на обновление, связанные таблицы.md:
--------------------------------------------------------------------------------
1 | # Запросы на обновление, связанные таблицы
2 |
3 | ## Задание
4 |
5 | Для книг, которые уже есть на складе (в таблице `book`), но по другой цене, чем в поставке (`supply`), необходимо в таблице `book` увеличить количество на значение, указанное в поставке, и пересчитать цену. А в таблице `supply` обнулить количество этих книг. Формула для пересчета цены:
6 |
7 | `price = (p1 * k1 + p2 * k2) / (k1 + k2)`
8 |
9 | где
10 |
11 | - `p1`, `p2` - цена книги в таблицах `book` и `supply`;
12 | - `k1`, `k2` - количество книг в таблицах `book` и `supply`.
13 |
14 | ## Решение
15 |
16 | ```
17 | update
18 | book b
19 | join
20 | author a
21 | on a.author_id = b.author_id
22 | join supply s
23 | on s.title = b.title and s.author = a.name_author
24 | set
25 | b.price = (b.price * b.amount + s.price * s.amount) / (b.amount + s.amount),
26 | b.amount = b.amount + s.amount,
27 | s.amount = 0
28 | where
29 | b.price != s.price
30 | ```
31 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.1 Связи между таблицами/3 Создание таблицы с внешними ключами.md:
--------------------------------------------------------------------------------
1 | # Создание таблицы с внешними ключами
2 |
3 | ## Задание
4 |
5 | Перепишите запрос на создание таблицы `book`, чтобы ее структура соответствовала структуре, показанной на логической схеме (таблица `genre` уже создана, порядок следования столбцов - как на логической схеме в таблице `book`, `genre_id` - внешний ключ) . Для `genre_id` ограничение о недопустимости пустых значений **не задавать**. В качестве главной таблицы для описания поля `genre_id` использовать таблицу `genre` следующей структуры:
6 |
7 | | Поле | Тип, описание |
8 | |---|---|
9 | | author_id | `INT PRIMARY KEY AUTO_INCREMENT` |
10 | | name_author |`VARCHAR(30)` |
11 |
12 | ## Решение
13 |
14 | ```
15 | create table book (
16 | book_id int primary key auto_increment,
17 | title varchar(50),
18 | author_id int not null,
19 | genre_id int,
20 | price decimal(8,2),
21 | amount int,
22 | foreign key (author_id) references author (author_id),
23 | foreign key (genre_id) references genre (genre_id)
24 | )
25 | ```
26 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.3 Запросы корректировки, соединение таблиц/1 Запросы на обновление, связанные таблицы.md:
--------------------------------------------------------------------------------
1 | # Запросы на обновление, связанные таблицы
2 |
3 | ## Задание
4 |
5 | Для книг, которые уже есть на складе (в таблице `book`), но по другой цене, чем в поставке (`supply`), необходимо в таблице `book` увеличить количество на значение, указанное в поставке, и пересчитать цену. А в таблице `supply` обнулить количество этих книг. Формула для пересчета цены:
6 |
7 | `price = (p1 * k1 + p2 * k2) / (k1 + k2)`
8 |
9 | где
10 |
11 | - `p1`, `p2` - цена книги в таблицах `book` и `supply`;
12 | - `k1`, `k2` - количество книг в таблицах `book` и `supply`.
13 |
14 | ## Решение
15 |
16 | ```
17 | update
18 | book b
19 | join
20 | author a
21 | on a.author_id = b.author_id
22 | join supply s
23 | on s.title = b.title and s.author = a.name_author
24 | set
25 | b.price = (b.price * b.amount + s.price * s.amount) / (b.amount + s.amount),
26 | b.amount = b.amount + s.amount,
27 | s.amount = 0
28 | where
29 | b.price != s.price
30 | ```
31 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.2 Запросы на выборку, соединение таблиц/6 Запросы для нескольких таблиц со вложенными запросами.md:
--------------------------------------------------------------------------------
1 | # Запросы для нескольких таблиц со вложенными запросами
2 |
3 | ## Задание
4 |
5 | Вывести в алфавитном порядке всех авторов, которые пишут только в одном жанре. Поскольку у нас в таблицах так занесены данные, что у каждого автора книги только в одном жанре, для этого запроса внесем изменения в таблицу `book`. Пусть у нас книга Есенина «Черный человек» относится к жанру «Роман», а книга Булгакова «Белая гвардия» к «Приключениям» (эти изменения в таблицы уже внесены).
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | name_author
12 | from
13 | author
14 | where
15 | author_id in (
16 | select
17 | a.author_id
18 | from
19 | author a
20 | join
21 | book b
22 | on b.author_id = a.author_id
23 | join
24 | genre g
25 | on g.genre_id = b.genre_id
26 | group by
27 | a.author_id
28 | having
29 | count(distinct b.genre_id) = 1
30 | )
31 | ```
32 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.2 Запросы на выборку, соединение таблиц/6 Запросы для нескольких таблиц со вложенными запросами.md:
--------------------------------------------------------------------------------
1 | # Запросы для нескольких таблиц со вложенными запросами
2 |
3 | ## Задание
4 |
5 | Вывести в алфавитном порядке всех авторов, которые пишут только в одном жанре. Поскольку у нас в таблицах так занесены данные, что у каждого автора книги только в одном жанре, для этого запроса внесем изменения в таблицу `book`. Пусть у нас книга Есенина «Черный человек» относится к жанру «Роман», а книга Булгакова «Белая гвардия» к «Приключениям» (эти изменения в таблицы уже внесены).
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | name_author
12 | from
13 | author
14 | where
15 | author_id in (
16 | select
17 | a.author_id
18 | from
19 | author a
20 | join
21 | book b
22 | on b.author_id = a.author_id
23 | join
24 | genre g
25 | on g.genre_id = b.genre_id
26 | group by
27 | a.author_id
28 | having
29 | count(distinct b.genre_id) = 1
30 | )
31 | ```
32 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.2 Стандартные методы и функции для строк 7.md:
--------------------------------------------------------------------------------
1 | Вашей программе на вход подаются две строки **s** и **t**, состоящие из строчных латинских букв.
2 |
3 | Выведите одно число – количество вхождений строки **t** в строку **s**.
4 |
5 | **Пример**:
6 |
7 | ```
8 | s = "abababa"
9 | t = "aba"
10 | ```
11 |
12 | Вхождения строки **t** в строку **s**:
13 |
14 | **aba**baba
15 | ab**aba**ba
16 | abab**aba**
17 |
18 | ---
19 |
20 | **Sample Input 1**:
21 |
22 | ```
23 | abababa
24 | aba
25 | ```
26 |
27 | **Sample Output 1**:
28 |
29 | `3`
30 |
31 | ---
32 |
33 | **Sample Input 2**:
34 |
35 | ```
36 | abababa
37 | abc
38 | ```
39 |
40 | **Sample Output 2**:
41 |
42 | `0`
43 |
44 | ---
45 |
46 | **Sample Input 3**:
47 |
48 | ```
49 | abc
50 | abc
51 | ```
52 |
53 | **Sample Output 3**:
54 |
55 | `1`
56 |
57 | ---
58 |
59 | **Sample Input 4**:
60 |
61 | ```
62 | aaaaa
63 | a
64 | ```
65 |
66 | **Sample Output 4**:
67 |
68 | `5`
69 |
70 | ---
71 |
72 | # Solution / Решение
73 |
74 | ```
75 | s, t = (input() for _ in range(2))
76 | counter = 0
77 | for i in range(len(s)):
78 | if s.find(t, i, i + len(t)) >= 0:
79 | counter += 1
80 | ```
81 |
--------------------------------------------------------------------------------
/Python Course tasks/week 11/irises.md:
--------------------------------------------------------------------------------
1 | У вас есть файл со следующим содержимым (первые 10 строк):
2 |
3 | "sepal.length","sepal.width","petal.length","petal.width","variety"
4 | 5.1,3.5,1.4,.2,"Setosa"
5 | 4.9,3,1.4,.2,"Setosa"
6 | 4.7,3.2,1.3,.2,"Setosa"
7 | 4.6,3.1,1.5,.2,"Setosa"
8 | 5,3.6,1.4,.2,"Setosa"
9 | 5.4,3.9,1.7,.4,"Setosa"
10 | 4.6,3.4,1.4,.3,"Setosa"
11 | 5,3.4,1.5,.2,"Setosa"
12 | 4.4,2.9,1.4,.2,"Setosa"
13 | В этом файле записаны данные о цветах ирисах: длина чашелистика, ширина чашелистика, длина и ширина лепестка и сорт ириса.
14 |
15 | Напишите функцию, которая будет принимать имя файла и название сорта и возвращать среднюю длину лепестка.
16 |
17 | Обратите внимание, название сорта будет передаваться без лишних кавычек. Например:
18 |
19 | `mean_petal('filename', 'Setosa')`
20 |
21 | **Решение**
22 |
23 | ```
24 | def mean_petal(filename, variety):
25 | with open(filename) as f:
26 | data = f.read().split()[1:]
27 | result = []
28 | for line in data:
29 | _, _, petal_length, _, line_variety = line.split(',')
30 | if variety == line_variety[1:-1]:
31 | result.append(float(petal_length))
32 | if len(result):
33 | return sum(result) / len(result)
34 | return 0
35 | ```
--------------------------------------------------------------------------------
/Python - основы и применение/1.6 Наследование классов 9.md:
--------------------------------------------------------------------------------
1 | Одно из применений множественного наследование – расширение функциональности класса каким-то заранее определенным способом. Например, если нам понадобится логировать какую-то информацию при обращении к методам класса.
2 |
3 | Рассмотрим класс **Loggable**:
4 |
5 | ```
6 | import time
7 |
8 | class Loggable:
9 | def log(self, msg):
10 | print(str(time.ctime()) + ": " + str(msg))
11 | ```
12 |
13 | У него есть ровно один метод **log**, который позволяет выводить в лог (в данном случае в stdout) какое-то сообщение, добавляя при этом текущее время.
14 |
15 | Реализуйте класс **LoggableList**, отнаследовав его от классов **list** и **Loggable** таким образом, чтобы при добавлении элемента в список посредством метода **append** в лог отправлялось сообщение, состоящее из только что добавленного элемента.
16 |
17 | **Примечание**
18 |
19 | Ваша программа не должна содержать класс **Loggable**. При проверке вашей программе будет доступен этот класс, и он будет содержать метод **log**, описанный выше.
20 |
21 | # Решение
22 |
23 | ```
24 | class LoggableList(Loggable, list):
25 | def append(self, arg):
26 | super(LoggableList, self).append(arg)
27 | self.log(arg)
28 | ```
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/qa/models.py:
--------------------------------------------------------------------------------
1 | from __future__ import unicode_literals
2 |
3 | from django.contrib.auth.models import User
4 |
5 | from django.db import models
6 |
7 | # Create your models here.
8 |
9 |
10 | class QuestionManager(models.Manager):
11 |
12 | def new(self):
13 | return Question.objects.order_by('-added_at')
14 |
15 | def popular(self):
16 | return Question.objects.order_by('-rating')
17 |
18 |
19 | class Question(models.Model):
20 | title = models.CharField(max_length=100)
21 | text = models.TextField()
22 | added_at = models.DateTimeField(auto_now_add=True)
23 | rating = models.IntegerField(default=0)
24 | author = models.ForeignKey(User, related_name='question_author', default=1)
25 | likes = models.ManyToManyField(User, related_name='question_likes')
26 | objects = QuestionManager()
27 |
28 | def __unicode__(self):
29 | return self.title
30 |
31 |
32 | class Answer(models.Model):
33 | text = models.TextField()
34 | added_at = models.DateTimeField(auto_now_add=True)
35 | question = models.ForeignKey('Question')
36 | author = models.ForeignKey(User, related_name='answer_author')
37 |
38 | def __unicode__(self):
39 | return self.text
40 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/ask/urls.py:
--------------------------------------------------------------------------------
1 | """ask URL Configuration
2 |
3 | The `urlpatterns` list routes URLs to views. For more information please see:
4 | https://docs.djangoproject.com/en/1.10/topics/http/urls/
5 | Examples:
6 | Function views
7 | 1. Add an import: from my_app import views
8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
9 | Class-based views
10 | 1. Add an import: from other_app.views import Home
11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
12 | Including another URLconf
13 | 1. Import the include() function: from django.conf.urls import url, include
14 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
15 | """
16 | from django.conf.urls import url
17 | from django.contrib import admin
18 |
19 | from qa import views
20 |
21 | admin.autodiscover()
22 |
23 | urlpatterns = [
24 | url(r'^admin/', admin.site.urls),
25 | url(r'^login/$', views.login, name='login'),
26 | url(r'^signup/$', views.signup, name='signup'),
27 | url(r'^question/(?P[0-9]+)/$', views.question, name='question'),
28 | url(r'^ask/$', views.ask, name='ask'),
29 | url(r'^popular/$', views.popular, name='login'),
30 | url(r'^$', views.new, name='new')
31 | ]
32 |
--------------------------------------------------------------------------------
/Адаптивный тренажёр Python/5.15 Simple continued fraction.md:
--------------------------------------------------------------------------------
1 | Finite simple continued fraction ([wiki](https://en.wikipedia.org/wiki/Continued_fraction)) −− это дробь вида
2 |
3 | a0 + 1/(a1 + 1/(a2 + 1/⋱ + 1/n))
4 |
5 | Известно, что любую обыкновенную дробь можно записать в виде конечной простой непрерывной дроби.
6 |
7 | Напишите программу, которая преобразует обыкновенную дробь в последовательность коэффициентов *a0, a1, ..., an.
8 |
9 | Например, дроби 239/30239/30 будет соответствовать непрерывная дробь
10 |
11 | 7 + 1 / (1 + 1/29)
12 |
13 | Cоответственно, коэффициенты будут равны 7, 1 и 29.
14 |
15 | **Формат ввода**:
16 |
17 | Строка, содержащая обыкновенную дробь в формате числитель/знаменатель.
18 |
19 | **Формат вывода**:
20 |
21 | Строка с последовательностью коэффициентов, записанных через пробел.
22 |
23 | ---
24 |
25 | **Sample Input**:
26 |
27 | 239/30
28 |
29 | ---
30 |
31 | **Sample Output**:
32 |
33 | 7 1 29
34 |
35 | ---
36 |
37 | # Solution / Решение
38 |
39 | ```
40 | a, b = input().split('/')
41 | a, b = int(a), int(b)
42 |
43 |
44 | def calc(a, b):
45 | while b > 0:
46 | q = a // b
47 | c = b
48 | b = a - b * q
49 | a = c
50 | yield str(q)
51 |
52 | print(' '.join(list(calc(a, b))))
53 | ```
54 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.2 Запросы на выборку, соединение таблиц/8 Операция соединение, использование USING().md:
--------------------------------------------------------------------------------
1 | # Операция соединение, использование USING()
2 |
3 | ## Задание
4 |
5 | Если в таблицах `supply` и `book` есть одинаковые книги, которые имеют равную цену, вывести их название и автора, а также посчитать общее количество экземпляров книг в таблицах `supply` и `book`, столбцы назвать `Название`, `Автор` и `Количество`.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | q.title Название, q.name_author Автор, q.cnt + s.cnt Количество
12 | from
13 | (
14 | select
15 | b.title title, a.name_author name_author, sum(b.amount) cnt, b.price price
16 | from
17 | book b
18 | join
19 | author a
20 | on a.author_id = b.author_id
21 | group by
22 | title, name_author, price
23 | having
24 | cnt > 0
25 | ) q
26 | join
27 | (
28 | select
29 | title, author name_author, sum(amount) cnt, price
30 | from
31 | supply
32 | group by
33 | title, name_author, price
34 | having
35 | cnt > 0
36 | ) s
37 | using(title, name_author, price)
38 | ```
39 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.2 Запросы на выборку, соединение таблиц/8 Операция соединение, использование USING().md:
--------------------------------------------------------------------------------
1 | # Операция соединение, использование USING()
2 |
3 | ## Задание
4 |
5 | Если в таблицах `supply` и `book` есть одинаковые книги, которые имеют равную цену, вывести их название и автора, а также посчитать общее количество экземпляров книг в таблицах `supply` и `book`, столбцы назвать `Название`, `Автор` и `Количество`.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | q.title Название, q.name_author Автор, q.cnt + s.cnt Количество
12 | from
13 | (
14 | select
15 | b.title title, a.name_author name_author, sum(b.amount) cnt, b.price price
16 | from
17 | book b
18 | join
19 | author a
20 | on a.author_id = b.author_id
21 | group by
22 | title, name_author, price
23 | having
24 | cnt > 0
25 | ) q
26 | join
27 | (
28 | select
29 | title, author name_author, sum(amount) cnt, price
30 | from
31 | supply
32 | group by
33 | title, name_author, price
34 | having
35 | cnt > 0
36 | ) s
37 | using(title, name_author, price)
38 | ```
39 |
--------------------------------------------------------------------------------
/Python - основы и применение/2.3 Итераторы и генераторы 5.md:
--------------------------------------------------------------------------------
1 | Целое положительное число называется простым, если оно имеет ровно два различных делителя, то есть делится только на единицу и на само себя.
2 |
3 | Например, число **2** является простым, так как делится только на **1** и **2**. Также простыми являются, например, числа **3**, **5**, **31**, и еще бесконечно много чисел.
4 |
5 | Число 4, например, не является простым, так как имеет три делителя – **1**, **2**, **4**. Также простым не является число **1**, так как оно имеет ровно один делитель – **1**.
6 |
7 | Реализуйте функцию-генератор **primes**, которая будет генерировать простые числа в порядке возрастания, начиная с числа **2**.
8 |
9 | **Example/Пример использования**:
10 |
11 | ```
12 | print(list(itertools.takewhile(lambda x : x <= 31, primes())))
13 | # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31]
14 | ```
15 |
16 | # Solution/Решение
17 |
18 | ```
19 | def is_prime(num):
20 | if num == 2: return True
21 | if num % 2 == 0: return False
22 | for _ in range(3, num // 2, 2):
23 | if num % _ == 0:
24 | return False
25 | return True
26 |
27 | def primes():
28 | num = 2
29 | while True:
30 | if is_prime(num):
31 | yield num
32 | num += 1
33 | ```
34 |
--------------------------------------------------------------------------------
/Адаптивный тренажёр Python/5.10 Length translator.md:
--------------------------------------------------------------------------------
1 | Требуется написать программу, осуществляющую преобразование из одних единиц измерения длины в другие.
2 |
3 | Должны поддерживаться
4 |
5 | - мили (1 mile = 1609 m),
6 | - ярды (1 yard = 0.9144 m),
7 | - футы (1 foot = 30.48 cm),
8 | - дюймы (1 inch = 2.54 cm),
9 | - километры (1 km = 1000 m),
10 | - метры (m),
11 | - сантиметры (1 cm = 0.01 m)
12 | - миллиметры (1 mm = 0.001 m)
13 |
14 | Используйте именно указанные в формулировке задачи единицы измерения с указанной точностью.
15 |
16 | **Формат ввода**:
17 |
18 | Одна строка с фразой следующего вида:
19 |
20 | ** in **
21 |
22 | например, если пришла фраза "15.5 mile in km", то требуется перевести 15.5 миль в километры.
23 |
24 | **Формат вывода**:
25 |
26 | Дробное число в научном формате (экспоненциальном), с точностью ровно два знака после запятой.
27 |
28 | **Sample Input**:
29 |
30 | `15.5 mile in km`
31 |
32 | **Sample Output**:
33 |
34 | `2.49e+01`
35 |
36 | # Решение/Solution
37 |
38 | ```
39 | mapping, inp = {'mile': 1609, 'yard': 0.9144, 'foot': 0.3048, 'inch': 0.0254, 'km': 1000, 'm': 1, 'cm': 0.01, 'mm': 0.001}, input().split()
40 |
41 | print('%.2e' % (float(inp[0]) * float(mapping[inp[1]]) / float(mapping[inp[3]])))
42 | ```
--------------------------------------------------------------------------------
/Алгоритмы методы/6.1.4 Двоичный поиск.md:
--------------------------------------------------------------------------------
1 | В первой строке даны целое число 1 ≤ *n* ≤ 10^5 и массив A[1…n] из *n* различных натуральных чисел, не превышающих 10^9, в порядке возрастания, во второй — целое число 1 ≤ *k* ≤ 10^5 и *k* натуральных чисел *b1*, …, *bk*, не превышающих 10^9. Для каждого *i* от 1 до *k* необходимо вывести индекс 1 ≤ *j* ≤ *n*, для которого *A[j]* = *bi*, или −1.
2 |
3 | **Sample Input**:
4 |
5 | ```
6 | 5 1 5 8 12 13
7 | 5 8 1 23 1 11
8 | ```
9 |
10 | **Sample Output**:
11 |
12 | `3 1 -1 1 -1`
13 |
14 | # Решение
15 |
16 | ```
17 | def binary_search(A, bi):
18 | lo = 0
19 | hi = len(A) - 1
20 | mid = len(A) // 2
21 | while hi >= lo:
22 | if bi == A[mid]:
23 | return mid + 1
24 | if bi < A[mid]:
25 | hi = mid - 1
26 | if bi > A[mid]:
27 | lo = mid + 1
28 | mid = (lo + hi) // 2
29 | return -1
30 |
31 |
32 | def main():
33 | first_line = map(int, input().split())
34 | n, *A = first_line
35 | second_line = map(int, input().split())
36 | k, *b = second_line
37 | results = []
38 | for i in range(k):
39 | result = binary_search(A, b[i])
40 | results.append(result)
41 | print(' '.join(map(str, results)))
42 |
43 | if __name__ == '__main__':
44 | main()
45 | ```
46 |
--------------------------------------------------------------------------------
/Python - основы и применение/1.2 Модель данных - объекты 9.md:
--------------------------------------------------------------------------------
1 | Реализуйте программу, которая будет вычислять количество различных объектов в списке.
2 | Два объекта **a** и **b** считаются различными, если **a is b** равно **False**.
3 |
4 | Вашей программе доступна переменная с названием **objects**, которая ссылается на список, содержащий не более **100** объектов. Выведите количество различных объектов в этом списке.
5 |
6 | **Формат ожидаемой программы**:
7 |
8 | ```
9 | ans = 0
10 | for obj in objects: # доступная переменная objects
11 | ans += 1
12 |
13 | print(ans)
14 | ```
15 |
16 | **Примечание**:
17 |
18 | Количеством различных объектов называется максимальный размер множества объектов, в котором любые два объекта являются различными.
19 |
20 | Рассмотрим пример:
21 |
22 | `objects = [1, 2, 1, 2, 3]` # будем считать, что одинаковые числа соответствуют одинаковым объектам, а различные – различным
23 |
24 | Тогда все различные объекты являют собой множество **{1, 2, 3}**. Таким образом, количество различных объектов равно трём.
25 |
26 | # Решение
27 |
28 | ```
29 | ans = 0
30 | matches = 0
31 | for i in range(len(objects)):
32 | for j in range(i + 1, len(objects)):
33 | if objects[j] is objects[i]:
34 | matches += 1
35 | if matches == 0:
36 | ans += 1
37 | matches = 0
38 | print(ans)
39 | ```
40 |
41 |
--------------------------------------------------------------------------------
/Python - основы и применение/2.2 Работа с кодом - модули и импорт 5.md:
--------------------------------------------------------------------------------
1 | В первой строке дано три числа, соответствующие некоторой дате **date** -- год, месяц и день.
2 |
3 | Во второй строке дано одно число **days** -- число дней.
4 |
5 | Вычислите и выведите год, месяц и день даты, которая наступит, когда с момента исходной даты **date** пройдет число дней, равное **days**.
6 |
7 | **Примечание**:
8 |
9 | Для решения этой задачи используйте стандартный модуль **datetime**. Вам будут полезны класс **datetime.date** для хранения даты и класс **datetime.timedelta** для прибавления дней к дате.
10 |
11 | ---
12 |
13 | **Sample Input 1**:
14 |
15 | ```
16 | 2016 4 20
17 | 14
18 | ```
19 |
20 | ---
21 |
22 | **Sample Output 1**:
23 |
24 | `2016 5 4`
25 |
26 | ---
27 |
28 | **Sample Input 2**:
29 |
30 | ```
31 | 2016 2 20
32 | 9
33 | ```
34 |
35 | ---
36 |
37 | **Sample Output 2**:
38 | 2016 2 29
39 |
40 | ---
41 |
42 | **Sample Input 3**:
43 |
44 | ```
45 | 2015 12 31
46 | 1
47 | ```
48 |
49 | ---
50 |
51 |
52 | **Sample Output 3**:
53 |
54 | 2016 1 1
55 |
56 | ---
57 |
58 | # Решение
59 |
60 | ```
61 | from datetime import date, timedelta
62 | inp1 = list(map(int, input().split()))
63 | inp2 = int(input())
64 |
65 | date = date(*inp1)
66 | days = timedelta(days=inp2)
67 | result = date + days
68 |
69 | print(result.year, result.month, result.day)
70 | ```
71 |
--------------------------------------------------------------------------------
/Python - основы и применение/1.5 Введение в классы 8.md:
--------------------------------------------------------------------------------
1 | Реализуйте класс **MoneyBox**, для работы с виртуальной копилкой.
2 |
3 | Каждая копилка имеет ограниченную вместимость, которая выражается целым числом – количеством монет, которые можно положить в копилку. Класс должен поддерживать информацию о количестве монет в копилке, предоставлять возможность добавлять монеты в копилку и узнавать, можно ли добавить в копилку ещё какое-то количество монет, не превышая ее вместимость.
4 |
5 | Класс должен иметь следующий вид
6 |
7 | ```
8 | class MoneyBox:
9 | def __init__(self, capacity):
10 | # конструктор с аргументом – вместимость копилки
11 |
12 | def can_add(self, v):
13 | # True, если можно добавить v монет, False иначе
14 |
15 | def add(self, v):
16 | # положить v монет в копилку
17 | ```
18 |
19 | При создании копилки, число монет в ней равно **0**.
20 |
21 | **Примечание**:
22 |
23 | Гарантируется, что метод **add(self, v)** будет вызываться только если **can_add(self, v) – True**.
24 |
25 | # Решение
26 |
27 | ```
28 | class MoneyBox:
29 | def __init__(self, capacity):
30 | self.capacity = capacity
31 | self.count = 0
32 |
33 | def can_add(self, v):
34 | return self.count + v <= self.capacity
35 |
36 | def add(self, v):
37 | if self.can_add(v):
38 | self.count += v
39 | ```
40 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.6 API 3.md:
--------------------------------------------------------------------------------
1 | В этой задаче вам необходимо воспользоваться API сайта numbersapi.com.
2 |
3 | Вам дается набор чисел. Для каждого из чисел необходимо узнать, существует ли интересный математический факт об этом числе.
4 |
5 | Для каждого числа выведите **Interesting**, если для числа существует интересный факт, и **Boring** иначе.
6 | Выводите информацию об интересности чисел в таком же порядке, в каком следуют числа во входном файле.
7 |
8 | Пример запроса к интересному числу:
9 |
10 | `http://numbersapi.com/31/math?json=true`
11 |
12 | Пример запроса к скучному числу:
13 |
14 | `http://numbersapi.com/999/math?json=true`
15 |
16 | **Пример входного файла**:
17 |
18 | ```
19 | 31
20 | 999
21 | 1024
22 | 502
23 | ```
24 |
25 | **Пример выходного файла**:
26 |
27 | ```
28 | Interesting
29 | Boring
30 | Interesting
31 | Boring
32 | ```
33 |
34 | # Solution / Решение
35 |
36 | ```
37 | import requests
38 | import json
39 |
40 | with open('dataset_24476_3.txt') as file:
41 | for number in file:
42 | number = number.strip()
43 | params = {'default': 'Boring number is boring', 'json': True}
44 | url = 'http://numbersapi.com/{}/math'.format(number)
45 | res = requests.get(url, params=params).text
46 | data = json.loads(res)
47 | if 'Boring' in data['text']:
48 | print('Boring')
49 | else:
50 | print('Interesting')
51 | ```
52 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/qa/forms.py:
--------------------------------------------------------------------------------
1 | from django import forms
2 | from django.contrib.auth.models import User
3 | from .models import Question, Answer
4 | from django.contrib.auth import authenticate
5 |
6 |
7 | class SignupForm(forms.ModelForm):
8 |
9 | class Meta:
10 | model = User
11 | fields = ('username', 'email', 'password')
12 |
13 |
14 | class AskForm(forms.ModelForm):
15 |
16 | class Meta:
17 | model = Question
18 | fields = ('title', 'text',)
19 |
20 |
21 | class AnswerForm(forms.ModelForm):
22 |
23 | class Meta:
24 | model = Answer
25 | fields = ('text', 'question',)
26 |
27 |
28 | class LoginForm(forms.Form):
29 | username = forms.CharField(max_length=100)
30 | password = forms.CharField(widget=forms.PasswordInput)
31 |
32 | def clean_username(self):
33 | username = self.cleaned_data['username']
34 | if username.strip() == '':
35 | raise forms.ValidationError('Username is empty',
36 | code='validation_error')
37 | return username
38 |
39 | def clean_password(self):
40 | password = self.cleaned_data['password']
41 | if password.strip() == '':
42 | raise forms.ValidationError('Password is empty',
43 | code='validation_error')
44 | return password
45 |
46 | def save(self):
47 | auth = authenticate(**self.cleaned_data)
48 | return auth
49 |
--------------------------------------------------------------------------------
/Алгоритмы методы/4.3.8 Очередь с приоритетами.md:
--------------------------------------------------------------------------------
1 | Первая строка входа содержит число операций 1 ≤ *n* ≤ 10^5. Каждая из последующих nn строк задают операцию одного из следующих двух типов:
2 |
3 | - 𝙸𝚗𝚜𝚎𝚛𝚝 x, где 0 ≤ *x* ≤ 10^9 — целое число;
4 | - 𝙴𝚡𝚝𝚛𝚊𝚌𝚝𝙼𝚊𝚡.
5 |
6 | Первая операция добавляет число *x* в очередь с приоритетами, вторая — извлекает максимальное число и выводит его.
7 |
8 | **Sample Input**:
9 |
10 | ```
11 | 6
12 | Insert 200
13 | Insert 10
14 | ExtractMax
15 | Insert 5
16 | Insert 500
17 | ExtractMax
18 | ```
19 |
20 | **Sample Output**:
21 |
22 | ```
23 | 200
24 | 500
25 | ```
26 |
27 | # Решение
28 |
29 | ```
30 | import heapq
31 |
32 |
33 | class PriorityQueue:
34 | def __init__(self):
35 | self._queue = []
36 | self._index = 0
37 |
38 | def push(self, item, priority):
39 | heapq.heappush(self._queue, (-priority, self._index, item))
40 | self._index += 1
41 |
42 | def pop(self):
43 | return heapq.heappop(self._queue)[-1]
44 |
45 |
46 | def main():
47 | n = int(input())
48 | pq = PriorityQueue()
49 | maxs = []
50 | for _ in range(n):
51 | command = input()
52 | if command.startswith('Insert'):
53 | _, priority = command.split()
54 | priority = int(priority)
55 | pq.push(priority, priority)
56 | else:
57 | maxs.append(pq.pop())
58 | for m in maxs:
59 | print(m)
60 |
61 | if __name__ == '__main__':
62 | main()
63 | ```
64 |
--------------------------------------------------------------------------------
/Алгоритмы методы/4.1.10 Непрерывный рюкзак.md:
--------------------------------------------------------------------------------
1 | Первая строка содержит количество предметов 1 ≤ *n* ≤10^3 и вместимость рюкзака 0 ≤ *W* ≤2⋅10^6. Каждая из следующих *n* строк задаёт стоимость 0 ≤ *ci* ≤ 2⋅10^6 и объём 0 < *wi* ≤ 2⋅10^6 (*n*, *W*, *ci*, *wi* — целые числа). Выведите максимальную стоимость частей предметов (от каждого предмета можно отделить любую часть, стоимость и объём при этом пропорционально уменьшатся), помещающихся в данный рюкзак, с точностью не менее трёх знаков после запятой.
2 |
3 | **Sample Input**:
4 |
5 | ```
6 | 3 50
7 | 60 20
8 | 100 50
9 | 120 30
10 | ```
11 |
12 | **Sample Output**:
13 |
14 | `180.000`
15 |
16 | # Решение
17 |
18 | ```
19 | def calculation(c, items):
20 | capacity = c
21 | sack_value = 0
22 | while len(items) > 0:
23 | value, volume, value_per_unit = items[0]
24 | if capacity > 0:
25 | if capacity >= volume:
26 | sack_value += volume * value_per_unit
27 | capacity -= volume
28 | else:
29 | sack_value += capacity * value_per_unit
30 | break
31 | items = items[1:]
32 | return '%.3f' % sack_value
33 |
34 |
35 | def main():
36 | n, c = map(int, input().split())
37 | items = []
38 |
39 | for i in range(n):
40 | total_value, volume = map(int, input().split())
41 | value_per_unit = total_value / volume
42 | items.append((total_value, volume, value_per_unit))
43 |
44 | items.sort(key=lambda x: x[2], reverse=True)
45 | print(calculation(c, items))
46 |
47 | if __name__ == "__main__":
48 | main()
49 | ```
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/2 Связи между таблицами/2.2 Запросы на выборку, соединение таблиц/7 Вложенные запросы в операторах соединения.md:
--------------------------------------------------------------------------------
1 | # Вложенные запросы в операторах соединения
2 |
3 | ## Задание
4 |
5 | Вывести информацию о книгах (название книги, фамилию и инициалы автора, название жанра, цену и количество экземпляров книги), написанных в самых популярных жанрах, в отсортированном в алфавитном порядке по названию книг виде. Самым популярным считать жанр, общее количество экземпляров книг которого на складе максимально.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | b.title, a.name_author, g.name_genre, b.price, b.amount
12 | from
13 | book b
14 | join
15 | author a
16 | on a.author_id = b.author_id
17 | join
18 | genre g
19 | on g.genre_id = b.genre_id
20 | join
21 | (
22 | select
23 | q1.genre_id
24 | from
25 | (
26 | select
27 | genre_id, sum(amount) sum_amount
28 | from
29 | book
30 | group by
31 | genre_id
32 | ) q1
33 | join
34 | (
35 | select
36 | genre_id, sum(amount) sum_amount
37 | from
38 | book
39 | group by
40 | genre_id
41 | order by
42 | sum_amount desc
43 | limit 1
44 | ) q2
45 | on q1.sum_amount = q2.sum_amount
46 | ) g1
47 | on g1.genre_id = g.genre_id
48 | order by
49 | b.title
50 | ```
51 |
--------------------------------------------------------------------------------
/Интерактивный тренажер по SQL/3 Базы данных и SQL-запросы/2.2 Запросы на выборку, соединение таблиц/7 Вложенные запросы в операторах соединения.md:
--------------------------------------------------------------------------------
1 | # Вложенные запросы в операторах соединения
2 |
3 | ## Задание
4 |
5 | Вывести информацию о книгах (название книги, фамилию и инициалы автора, название жанра, цену и количество экземпляров книги), написанных в самых популярных жанрах, в отсортированном в алфавитном порядке по названию книг виде. Самым популярным считать жанр, общее количество экземпляров книг которого на складе максимально.
6 |
7 | ## Решение
8 |
9 | ```
10 | select
11 | b.title, a.name_author, g.name_genre, b.price, b.amount
12 | from
13 | book b
14 | join
15 | author a
16 | on a.author_id = b.author_id
17 | join
18 | genre g
19 | on g.genre_id = b.genre_id
20 | join
21 | (
22 | select
23 | q1.genre_id
24 | from
25 | (
26 | select
27 | genre_id, sum(amount) sum_amount
28 | from
29 | book
30 | group by
31 | genre_id
32 | ) q1
33 | join
34 | (
35 | select
36 | genre_id, sum(amount) sum_amount
37 | from
38 | book
39 | group by
40 | genre_id
41 | order by
42 | sum_amount desc
43 | limit 1
44 | ) q2
45 | on q1.sum_amount = q2.sum_amount
46 | ) g1
47 | on g1.genre_id = g.genre_id
48 | order by
49 | b.title
50 | ```
51 |
--------------------------------------------------------------------------------
/Python - основы и применение/2.2 Работа с кодом - модули и импорт 9.md:
--------------------------------------------------------------------------------
1 | Алиса владеет интересной информацией, которую хочет заполучить Боб.
2 | Алиса умна, поэтому она хранит свою информацию в зашифрованном файле.
3 | У Алисы плохая память, поэтому она хранит все свои пароли в открытом виде в текстовом файле.
4 |
5 | Бобу удалось завладеть зашифрованным файлом с интересной информацией и файлом с паролями, но он не смог понять какой из паролей ему нужен. Помогите ему решить эту проблему.
6 |
7 | Алиса зашифровала свою информацию с помощью библиотеки simple-crypt.
8 | Она представила информацию в виде строки, и затем записала в бинарный файл результат работы метода **simplecrypt.encrypt**.
9 |
10 | Вам необходимо установить библиотеку simple-crypt, и с помощью метода **simplecrypt.decrypt** узнать, какой из паролей служит ключом для расшифровки файла с интересной информацией.
11 |
12 | Ответом для данной задачи служит расшифрованная интересная информация Алисы.
13 |
14 | - Файл с информацией
15 | - Файл с паролями
16 |
17 | # Решение
18 |
19 | ```
20 | import simplecrypt
21 | import urllib.request as urllib
22 |
23 | passwords = urllib.urlopen('https://stepik.org/media/attachments/lesson/24466/passwords.txt')
24 |
25 | with open('encrypted.bin', 'rb') as inp:
26 | encrypted = inp.read()
27 |
28 | for password in passwords:
29 | password = password[:-1]
30 | try:
31 | print(simplecrypt.decrypt(password, encrypted).decode('utf8'))
32 | except simplecrypt.DecryptionException:
33 | print(password, 'is wrong')
34 | else:
35 | print(password, 'is correct')
36 | ```
37 |
--------------------------------------------------------------------------------
/Веб-технологии/web/nginx.conf:
--------------------------------------------------------------------------------
1 | #user nobody;
2 | worker_processes 5;
3 |
4 | #error_log logs/error.log;
5 | #error_log logs/error.log notice;
6 | #error_log logs/error.log info;
7 |
8 | #pid logs/nginx.pid;
9 |
10 |
11 | events {
12 | worker_connections 1024;
13 | }
14 |
15 | http {
16 | include mime.types;
17 | default_type application/octet-stream;
18 |
19 | #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
20 | # '$status $body_bytes_sent "$http_referer" '
21 | # '"$http_user_agent" "$http_x_forwarded_for"';
22 |
23 | #access_log logs/access.log main;
24 |
25 | sendfile on;
26 | keepalive_timeout 65;
27 |
28 | server {
29 | listen 80 default_server;
30 |
31 | # for uploaded files.
32 | #location ^~ /uploads/ {
33 | # root /home/box/web/;
34 | #}
35 |
36 | # for files with any extensions
37 | #location ~* \.(.*?)$ {
38 | # root /home/box/web/public/;
39 | #}
40 |
41 | # for files with no extensions
42 | #location ~* ^([^.]+)$ {
43 | # return 404;
44 | #}
45 |
46 | # echo server
47 | location /hello/ {
48 | proxy_pass http://0.0.0.0:8080/;
49 | }
50 |
51 | location / {
52 | proxy_pass http://0.0.0.0:8000/;
53 | }
54 |
55 | #error_page 404 /404.html;
56 |
57 | # redirect server error pages to the static page /50x.html
58 | #
59 | error_page 500 502 503 504 /50x.html;
60 |
61 | location = /50x.html {
62 | root html;
63 | }
64 | }
65 | include servers/*;
66 | }
--------------------------------------------------------------------------------
/Алгоритмы методы/4.1.9 Покрыть отрезки точками.md:
--------------------------------------------------------------------------------
1 | По данным *n* отрезкам необходимо найти множество точек минимального размера, для которого каждый из отрезков содержит хотя бы одну из точек.
2 |
3 | В первой строке дано число 1 ≤ *n* ≤ 100 отрезков. Каждая из последующих *n*
4 | строк содержит по два числа 0 ≤ *l* ≤ *r* ≤ 109, задающих начало и конец отрезка. Выведите оптимальное число *m* точек и сами *m* точек. Если таких множеств точек несколько, выведите любое из них.
5 |
6 | **Sample Input 1**:
7 |
8 | ```
9 | 3
10 | 1 3
11 | 2 5
12 | 3 6
13 | ```
14 |
15 | **Sample Output 1**:
16 |
17 | ```
18 | 1
19 | 3
20 | ```
21 |
22 | **Sample Input 2**:
23 |
24 | ```
25 | 4
26 | 4 7
27 | 1 3
28 | 2 5
29 | 5 6
30 | ```
31 |
32 | **Sample Output 2**:
33 |
34 | ```
35 | 2
36 | 3 6
37 | ```
38 |
39 | # Решение/Solution
40 |
41 | ```
42 | def dots(segments):
43 | resulting_segments = []
44 | while len(segments) > 0:
45 | if len(segments) < 2:
46 | seg = segments.pop()
47 | resulting_segments.append(seg)
48 | else:
49 | a, b = segments[0], segments[1]
50 | if b[0] <= a[1]:
51 | left, right = b[0], b[1] if b[1] <= a[1] else a[1]
52 | overlapping = (left, right)
53 | segments = segments[2:]
54 | segments = [overlapping] + segments
55 | else:
56 | resulting_segments.append(segments[0])
57 | segments = segments[1:]
58 | return [x[1] for x in resulting_segments]
59 |
60 |
61 | def main():
62 | n = int(input())
63 | segments = []
64 | for i in range(n):
65 | segments.append(tuple(map(int, input().split())))
66 | segments.sort(key=lambda x: (x[0], x[1]))
67 | result = dots(segments)
68 | print(len(result))
69 | print(' '.join(map(str, result)))
70 |
71 |
72 | if __name__ == "__main__":
73 | main()
74 | ```
75 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.2 Стандартные методы и функции для строк 6.md:
--------------------------------------------------------------------------------
1 | Вашей программе на вход подаются три строки **s**, **a**, **b**, состоящие из строчных латинских букв.
2 | За одну операцию вы можете заменить все вхождения строки **a** в строку **s** на строку **b**.
3 |
4 | Например, **s = "abab"**, **a = "ab"**, **b = "ba"**, тогда после выполнения одной операции строка **s** перейдет в строку **"baba"**, после выполнения двух и операций – в строку **"bbaa"**, и дальнейшие операции не будут изменять строку **s**.
5 |
6 | Необходимо узнать, после какого минимального количества операций в строке **s** не останется вхождений строки **a**, либо же определить, что это невозможно.
7 |
8 | Выведите одно число – минимальное число операций, после применения которых в строке **s** не останется вхождений строки **a**.
9 |
10 | Если после применения любого числа операций в строке **s** останутся вхождения строки **a**, выведите **Impossible**.
11 |
12 | ---
13 |
14 | **Sample Input 1**:
15 |
16 | ```
17 | ababa
18 | a
19 | b
20 | ```
21 |
22 | **Sample Output 1**:
23 |
24 | `1`
25 |
26 | ---
27 |
28 | **Sample Input 2**:
29 |
30 | ```
31 | ababa
32 | b
33 | a
34 | ```
35 |
36 | **Sample Output 2**:
37 |
38 | `1`
39 |
40 | ---
41 |
42 | **Sample Input 3**:
43 |
44 | ```
45 | ababa
46 | c
47 | c
48 | ```
49 |
50 | **Sample Output 3**:
51 |
52 | `0`
53 |
54 | ---
55 |
56 | **Sample Input 4**:
57 |
58 | ```
59 | ababac
60 | c
61 | c
62 | ```
63 |
64 | **Sample Output 4**:
65 |
66 | `Impossible`
67 |
68 | ---
69 |
70 | # Solution / Решение
71 |
72 | ```
73 | s, a, b = (input() for _ in range(3))
74 |
75 | def f(s, a, b, counter=0):
76 | if a in b and a in s:
77 | return 'Impossible'
78 | if s == s.replace(a, b):
79 | return counter
80 | else:
81 | counter += 1
82 | s = s.replace(a, b)
83 | return f(s, a, b, counter)
84 |
85 | print(f(s, a, b))
86 | ```
87 |
--------------------------------------------------------------------------------
/Веб-технологии/web/init.sh:
--------------------------------------------------------------------------------
1 | # upgrade package info
2 | # sudo apt-get update
3 |
4 | # install nginx
5 | # sudo apt-get install nginx
6 |
7 | # creating project structure
8 | mkdir -p /home/box/web/etc/
9 | mkdir -p /home/box/web/uploads/
10 | mkdir -p /home/box/web/public/css/
11 | mkdir -p /home/box/web/public/img/
12 | mkdir -p /home/box/web/public/js/
13 |
14 | # Configure NGINX
15 | sudo rm -rf /etc/nginx/nginx.conf
16 | sudo rm -rf /etc/nginx/sites-enabled/default
17 | cp nginx.conf /home/box/web/etc
18 | sudo ln -s /home/box/web/etc/nginx.conf /etc/nginx/nginx.conf
19 |
20 | # Run NGINX
21 | sudo /etc/init.d/nginx restart
22 |
23 |
24 | # Configure Gunicorn and echo WSGI server
25 | cp hello.py /home/box/web/
26 | cp ./conf/hello.py /home/box/web/etc/
27 | sudo ln -sf /home/box/web/etc/hello.py /etc/gunicorn.d/hello.py
28 | sudo /etc/init.d/gunicorn restart
29 | # sudo gunicorn -b 0.0.0.0:8080 hello:application
30 |
31 | sudo /etc/init.d/mysql start
32 | mysql -uroot -e "CREATE DATABASE ask;"
33 |
34 | # django-admin startproject ask
35 | # rm -rf ask
36 | # mv my_ask ask
37 | cd ask
38 | ./manage.py syncdb
39 | ./manage.py runserver 0.0.0.0:8000
40 |
41 | # cp -r /home/box/stepic_course_web/ask /home/box/web
42 | # cd /home/box/web/ask
43 |
44 | #install myysql
45 | #sudo apt-get install mysql-server #sql - сервер
46 |
47 | #sudo apt-get install mysql-client #sql -клиент
48 |
49 | # sudo apt-get install python-mysqldb #сама библиотека
50 | # sudo -H pip install pymysql
51 |
52 | # Start daemon
53 | # sudo /etc/init.d/mysql start
54 |
55 | # mysql -uroot -e "CREATE DATABASE ask;"
56 |
57 | # Create migrate
58 | # python manage.py migrate
59 |
60 | # Deploying echo server and Django project
61 | # gunicorn hello:app & --bind 0.0.0.0:8080 &
62 | # gunicorn ask.wsgi -b 0.0.0.0:8000 &
63 | # sudo ln -sf /home/box/web/etc/gunicorn_hello.conf /etc/gunicorn.d/test-wsgi
64 | # sudo ln -sf /home/box/web/etc/gunicorn_django.conf /etc/gunicorn.d/test-django
65 | # sudo /etc/init.d/gunicorn restart
--------------------------------------------------------------------------------
/Python - основы и применение/1.3 Функции и стек вызовов 15.md:
--------------------------------------------------------------------------------
1 | *Сочетанием из n элементов по **k*** называется подмножество этих **n** элементов размера **k**.
2 |
3 | Два сочетания называются *различными*, если одно из сочетаний содержит элемент, который не содержит другое.
4 |
5 | *Числом сочетаний из **n** по **k*** называется количество различных сочетаний из **n** по **k**. Обозначим это число за **C(n, k)**.
6 |
7 | **Пример**:
8 |
9 | Пусть **n = 3**, т. е. есть три элемента **(1, 2, 3)**. Пусть **k = 2**.
10 |
11 | Все различные сочетания из **3** элементов по **2**: **(1, 2), (1, 3), (2, 3)**.
12 |
13 | Различных сочетаний три, поэтому **C(3, 2) = 3**.
14 |
15 | Несложно понять, что **C(n, 0) = 1**, так как из **n** элементов выбрать **0** можно единственным образом, а именно, ничего не выбрать. Также несложно понять, что если **k > n**, то **C(n, k) = 0**, так как невозможно, например, из трех элементов выбрать пять.
16 |
17 | Для вычисления **C(n, k)** в других случаях используется следующая рекуррентная формула: **C(n, k) = C(n - 1, k) + C(n - 1, k - 1)**.
18 |
19 | Реализуйте программу, которая для заданных **n** и **k** вычисляет **C(n, k)**.
20 |
21 | Вашей программе на вход подается строка, содержащая два целых числа **n** и **k (1 ≤ n ≤ 10, 0 ≤ k ≤ 10)**. Ваша программа должна вывести единственное число: **C(n, k)**.
22 |
23 | **Примечание**:
24 |
25 | Считать два числа **n** и **k** вы можете, например, следующим образом:
26 |
27 | **n, k = map(int, input().split())**
28 |
29 | ---
30 |
31 | **Sample Input 1**:
32 |
33 | 3 2
34 |
35 | **Sample Output 1**:
36 |
37 | 3
38 |
39 | ---
40 |
41 | **Sample Input 2**:
42 |
43 | **10 5**
44 |
45 | **Sample Output 2**:
46 |
47 | 252
48 |
49 | ---
50 |
51 | # Решение
52 |
53 | ```
54 | n, k = map(int, input().split())
55 |
56 | def c(n, k):
57 | if k == 0:
58 | return 1
59 | elif k > n:
60 | return 0
61 | else:
62 | return c(n - 1, k) + c(n - 1, k - 1)
63 |
64 | print(c(n, k))
65 | ```
66 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.4 Обзорно об интернете http-запросы, html-страницы и requests 7.md:
--------------------------------------------------------------------------------
1 | Вашей программе на вход подается ссылка на HTML файл.
2 | Вам необходимо скачать этот файл, затем найти в нем все ссылки вида **** и вывести список сайтов, на которые есть ссылка.
3 |
4 | Сайтом в данной задаче будем называть имя домена вместе с именами поддоменов. То есть, это последовательность символов, которая следует сразу после символов протокола, если он есть, до символов порта или пути, если они есть, за исключением случаев с относительными ссылками вида ****.
5 |
6 | Сайты следует выводить в алфавитном порядке.
7 |
8 | **Пример HTML файла**:
9 |
10 | ```
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | ```
19 |
20 | **Пример ответа**:
21 |
22 | ```
23 | mail.ru
24 | neerc.ifmo.ru
25 | stepic.org
26 | www.ya.ru
27 | ya.ru
28 | ```
29 |
30 | # Solution / Решение
31 |
32 | ```
33 | import re
34 | import urllib.request
35 | from urllib.parse import urlparse
36 |
37 | url = input()
38 |
39 |
40 | def get_links():
41 | try:
42 | fp = urllib.request.urlopen(url)
43 | mybytes = fp.read()
44 | mystr = mybytes.decode("utf8")
45 | fp.close()
46 | links = re.findall(r' 1:
55 | freq1, _count1, left = heapq.heappop(h)
56 | freq2, _count2, right = heapq.heappop(h)
57 | heapq.heappush(h, (freq1 + freq2, count, Node(left, right)))
58 | count += 1
59 | code = {}
60 | if h:
61 | [(_freq, _count, root)] = h
62 | root.walk(code, '')
63 | return code
64 |
65 |
66 | def main():
67 | s = input()
68 | code = huffman_encode(s)
69 | encoded = ''.join(code[ch] for ch in s)
70 | print(len(code), len(encoded))
71 | for ch in sorted(code):
72 | print('{}: {}'.format(ch, code[ch]))
73 | print(encoded)
74 |
75 | if __name__ == "__main__":
76 | main()
77 | ```
78 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.5 Распространённые форматы текстовых файлов CSV, JSON 4.md:
--------------------------------------------------------------------------------
1 | Вам дано описание наследования классов в формате JSON.
2 |
3 | Описание представляет из себя массив JSON-объектов, которые соответствуют классам. У каждого JSON-объекта есть поле **name**, которое содержит имя класса, и поле **parents**, которое содержит список имен прямых предков.
4 |
5 | **Пример**:
6 |
7 | `[{"name": "A", "parents": []}, {"name": "B", "parents": ["A", "C"]}, {"name": "C", "parents": ["A"]}]`
8 |
9 | Эквивалент на Python:
10 |
11 | ```
12 | class A:
13 | pass
14 |
15 | class B(A, C):
16 | pass
17 |
18 | class C(A):
19 | pass
20 | ```
21 |
22 | Гарантируется, что никакой класс не наследуется от себя явно или косвенно, и что никакой класс не наследуется явно от одного класса более одного раза.
23 |
24 | Для каждого класса вычислите предком скольких классов он является и выведите эту информацию в следующем формате.
25 |
26 | **<имя класса> : <количество потомков>**
27 |
28 | Выводить классы следует в лексикографическом порядке.
29 |
30 | **Sample Input**:
31 |
32 | `[{"name": "A", "parents": []}, {"name": "B", "parents": ["A", "C"]}, {"name": "C", "parents": ["A"]}]`
33 |
34 | **Sample Output**:
35 |
36 | ```
37 | A : 3
38 | B : 1
39 | C : 2
40 | ```
41 |
42 | # Solution / Решение
43 |
44 | ```
45 | import json
46 |
47 | initial = json.loads(input())
48 |
49 | with_children = {element['name']: [] for element in initial}
50 |
51 | for eli in initial:
52 | for elc in with_children:
53 | if elc in eli['parents']:
54 | with_children[elc].append(eli['name'])
55 |
56 | for element in with_children:
57 | with_children[element] = set(with_children[element])
58 |
59 | def dfs(graph, start, visited=None):
60 | if visited is None:
61 | visited = set()
62 | visited.add(start)
63 | for next in graph[start] - visited:
64 | dfs(graph, next, visited)
65 | return visited
66 |
67 | for element in sorted(with_children.keys()):
68 | print(element, ':', len(dfs(with_children, element)))
69 | ```
--------------------------------------------------------------------------------
/Python - основы и применение/1.6 Наследование классов 8.md:
--------------------------------------------------------------------------------
1 | Реализуйте структуру данных, представляющую собой расширенную структуру стек. Необходимо поддерживать добавление элемента на вершину стека, удаление с вершины стека, и необходимо поддерживать операции сложения, вычитания, умножения и целочисленного деления.
2 |
3 | Операция сложения на стеке определяется следующим образом. Со стека снимается верхний элемент (**top1**), затем снимается следующий верхний элемент (**top2**), и затем как результат операции сложения на вершину стека кладется элемент, равный **top1 + top2**.
4 |
5 | Аналогичным образом определяются операции вычитания (**top1 - top2**), умножения (**top1 * top2**) и целочисленного деления (**top1 // top2**).
6 |
7 | Реализуйте эту структуру данных как класс **ExtendedStack**, отнаследовав его от стандартного класса list.
8 |
9 | Требуемая структура класса:
10 |
11 | ```
12 | class ExtendedStack(list):
13 | def sum(self):
14 | # операция сложения
15 |
16 | def sub(self):
17 | # операция вычитания
18 |
19 | def mul(self):
20 | # операция умножения
21 |
22 | def div(self):
23 | # операция целочисленного деления
24 | ```
25 |
26 | **Примечание**
27 |
28 | Для добавления элемента на стек используется метод **`append`**, а для снятия со стека – метод **`pop`**.
29 |
30 | Гарантируется, что операции будут совершаться только когда в стеке есть хотя бы два элемента.
31 |
32 | # Решение
33 |
34 | ```
35 | class ExtendedStack(list):
36 | def sum(self):
37 | top1 = self.pop()
38 | top2 = self.pop()
39 | self.append(top1 + top2)
40 | return self
41 |
42 | def sub(self):
43 | top1 = self.pop()
44 | top2 = self.pop()
45 | self.append(top1 - top2)
46 | return self
47 |
48 | def mul(self):
49 | top1 = self.pop()
50 | top2 = self.pop()
51 | self.append(top1 * top2)
52 | return self
53 |
54 | def div(self):
55 | top1 = self.pop()
56 | top2 = self.pop()
57 | self.append(top1 // top2)
58 | return self
59 | ```
60 |
--------------------------------------------------------------------------------
/Python Course tasks/week 3/life.py:
--------------------------------------------------------------------------------
1 | k = int(input())
2 |
3 | world = [
4 | ['.', '#', '.', '.', '.', '.', '.', '.', '.', '.'],
5 | ['.', '.', '#', '.', '.', '.', '.', '.', '.', '.'],
6 | ['#', '#', '#', '.', '.', '.', '.', '.', '.', '.'],
7 | ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
8 | ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
9 | ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
10 | ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
11 | ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
12 | ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'],
13 | ['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']
14 | ]
15 |
16 | world_size = len(world)
17 |
18 |
19 | def get_vicinity_borders(coord):
20 | start = coord - 1
21 | stop = coord + 2
22 | if coord == 0:
23 | start = 0
24 | if coord == world_size - 1:
25 | stop = world_size
26 | return start, stop
27 |
28 |
29 | def get_vicinity(start_x, stop_x, start_y, stop_y):
30 | vicinity = [
31 | world[x][y]
32 | for x in range(start_x, stop_x)
33 | for y in range(start_y, stop_y)
34 | ]
35 | return vicinity
36 |
37 |
38 | def calculate_new_cell(x, y, vicinity):
39 | cell = world[x][y]
40 | new_cell = cell
41 | if cell == '.':
42 | if vicinity.count('#') == 3:
43 | new_cell = '#'
44 | else:
45 | if vicinity.count('#') - 1 < 2 or vicinity.count('#') - 1 > 3:
46 | new_cell = '.'
47 | return new_cell
48 |
49 |
50 | def generate_next_world():
51 | next_world = []
52 | for x in range(world_size):
53 | start_x, stop_x = get_vicinity_borders(x)
54 | next_world.append([])
55 | for y in range(world_size):
56 | start_y, stop_y = get_vicinity_borders(y)
57 | vicinity = get_vicinity(start_x, stop_x, start_y, stop_y)
58 | new_cell = calculate_new_cell(x, y, vicinity)
59 | next_world[x].append(new_cell)
60 | return next_world
61 |
62 | for _ in range(k):
63 | world = generate_next_world()
64 |
65 | for row in world:
66 | print(row)
67 |
--------------------------------------------------------------------------------
/Алгоритмы методы/4.2.6 Декодирование Хаффмана.md:
--------------------------------------------------------------------------------
1 | Восстановите строку по её коду и беспрефиксному коду символов.
2 |
3 | В первой строке входного файла заданы два целых числа *k* и *l* через пробел — количество различных букв, встречающихся в строке, и размер получившейся закодированной строки, соответственно. В следующих *k* строках записаны коды букв в формате "letter: code". Ни один код не является префиксом другого. Буквы могут быть перечислены в любом порядке. В качестве букв могут встречаться лишь строчные буквы латинского алфавита; каждая из этих букв встречается в строке хотя бы один раз. Наконец, в последней строке записана закодированная строка. Исходная строка и коды всех букв непусты. Заданный код таков, что закодированная строка имеет минимальный возможный размер.
4 |
5 |
6 | В первой строке выходного файла выведите строку ss. Она должна состоять из строчных букв латинского алфавита. Гарантируется, что длина правильного ответа не превосходит 10^4 символов.
7 |
8 | **Sample Input 1**:
9 |
10 | ```
11 | 1 1
12 | a: 0
13 | 0
14 | ```
15 |
16 | **Sample Output 1**:
17 |
18 | `a`
19 |
20 | **Sample Input 2**:
21 |
22 | ```
23 | 4 14
24 | a: 0
25 | b: 10
26 | c: 110
27 | d: 111
28 | 01001100100111
29 | ```
30 |
31 | Sample Output 2:
32 |
33 | `abacabad`
34 |
35 | # Решение
36 |
37 | ```
38 | def huffman_decode(code_table, s):
39 | decoded = ''
40 | while len(s) > 0:
41 | i = 0
42 | acc = ''
43 | while i < len(s):
44 | current_char = s[i]
45 | acc += current_char
46 | if acc in code_table.values():
47 | new_dict = dict(zip(code_table.values(), code_table.keys()))
48 | acc = new_dict[acc]
49 | i += 1
50 | break
51 | i += 1
52 | s = s[i:]
53 | decoded += acc
54 | return decoded
55 |
56 |
57 | def main():
58 | letters_amount, encoded_length = map(int, input().split())
59 | code_table = {}
60 | for _ in range(letters_amount):
61 | letter, code = input().split(': ')
62 | code_table[letter] = code
63 | s = input()
64 | print(huffman_decode(code_table, s))
65 |
66 |
67 | if __name__ == "__main__":
68 | main()
69 | ```
70 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.7 XML, библиотека ElementTree, библиотека lxml 4.md:
--------------------------------------------------------------------------------
1 | Вам дано описание пирамиды из кубиков в формате XML.
2 |
3 | Кубики могут быть трех цветов: красный (**red**), зеленый (**green**) и синий (**blue**).
4 |
5 | Для каждого кубика известны его цвет, и известны кубики, расположенные прямо под ним.
6 |
7 | Пример:
8 |
9 | ```
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | ```
19 |
20 | Введем понятие ценности для кубиков. Самый верхний кубик, соответствующий корню XML документа имеет ценность **1**. Кубики, расположенные прямо под ним, имеют ценность **2**. Кубики, расположенные прямо под нижележащими кубиками, имеют ценность **3**. И т. д.
21 |
22 | Ценность цвета равна сумме ценностей всех кубиков этого цвета.
23 |
24 | Выведите через пробел три числа: ценности красного, зеленого и синего цветов.
25 |
26 | **Sample Input**:
27 |
28 | ``
29 |
30 | **Sample Output**:
31 |
32 | 4 3 1
33 |
34 | # Решение / Solution
35 |
36 | ```
37 | from xml.etree.ElementTree import XMLParser
38 |
39 | xml = input()
40 |
41 | class ColorWeights: # The target object of the parser
42 | depth = 0
43 | weights = {'red': 0, 'green': 0, 'blue': 0}
44 |
45 | def start(self, tag, attrib): # Called for each opening tag.
46 | self.depth += 1
47 | self.add_weight(attrib)
48 |
49 | def add_weight(self, attrib):
50 | self.weights[attrib['color']] += self.depth
51 |
52 | def end(self, tag): # Called for each closing tag.
53 | self.depth -= 1
54 |
55 | def data(self, data):
56 | pass # We do not need to do anything with data.
57 |
58 | def close(self): # Called when all data has been parsed.
59 | weights_list = [self.weights['red'], self.weights['green'], self.weights['blue']]
60 | return ' '.join(list(map(str, weights_list)))
61 |
62 | target = ColorWeights()
63 | parser = XMLParser(target=target)
64 | parser.feed(xml)
65 | print(parser.close())
66 | ```
67 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.4 Обзорно об интернете http-запросы, html-страницы и requests 6.md:
--------------------------------------------------------------------------------
1 | Рассмотрим два HTML-документа **A** и **B**.
2 |
3 | Из **A** можно перейти в **B** за один переход, если в **A** есть ссылка на **B**, т. е. внутри **A** есть тег ``, возможно с дополнительными параметрами внутри тега.
4 | Из **A** можно перейти в **B** за два перехода если существует такой документ **C**, что из **A** в **C** можно перейти за один переход и из **C** в **B** можно перейти за один переход.
5 |
6 | Вашей программе на вход подаются две строки, содержащие url двух документов **A** и **B**.
7 | Выведите **Yes**, если из **A** в **B** можно перейти за два перехода, иначе выведите **No**.
8 |
9 | Обратите внимание на то, что не все ссылки внутри HTML документа могут вести на существующие HTML документы.
10 |
11 | ---
12 |
13 | **Sample Input 1:**
14 |
15 | https://stepic.org/media/attachments/lesson/24472/sample0.html
16 |
17 | https://stepic.org/media/attachments/lesson/24472/sample2.html
18 |
19 | **Sample Output 1:**
20 |
21 | Yes
22 |
23 | ---
24 |
25 | **Sample Input 2:**
26 |
27 | https://stepic.org/media/attachments/lesson/24472/sample0.html
28 |
29 | https://stepic.org/media/attachments/lesson/24472/sample1.html
30 |
31 |
32 | **Sample Output 2:**
33 |
34 | No
35 |
36 | ---
37 |
38 | **Sample Input 3:**
39 |
40 | https://stepic.org/media/attachments/lesson/24472/sample1.html
41 |
42 | https://stepic.org/media/attachments/lesson/24472/sample2.html
43 |
44 | **Sample Output 3:**
45 |
46 | Yes
47 |
48 | ---
49 |
50 | # Solution / Решение
51 |
52 | ```
53 | import re
54 | import urllib.request
55 |
56 | a = input()
57 | b = input()
58 |
59 | def get_links(url):
60 | try:
61 | fp = urllib.request.urlopen(url)
62 | mybytes = fp.read()
63 | mystr = mybytes.decode("utf8")
64 | fp.close()
65 | links = re.findall(r'<масть>, а на следующей строке указывается козырная масть.
11 |
12 | **Формат вывода**:
13 |
14 | Программа должна вывести слово **First**, если первая карта бьёт вторую, **Second**, если вторая карта бьёт первую, **Error**, если ни одна из карт не может побить другую.
15 |
16 | **Sample Input 1**:
17 |
18 | AH JH
19 | D
20 |
21 | **Sample Output 1**:
22 |
23 | First
24 |
25 | ---
26 |
27 | **Sample Input 2**:
28 |
29 | AH JS
30 | S
31 |
32 | **Sample Output 2**:
33 |
34 | Second
35 |
36 | ---
37 |
38 | **Sample Input 3**:
39 |
40 | 7C 10H
41 | S
42 |
43 | **Sample Output 3**:
44 |
45 | Error
46 |
47 | # Solution/Решение
48 |
49 | ```
50 | c1, c2 = input().split()
51 | trump = input()
52 | suits = ('C', 'D', 'H', 'S')
53 | values = {'6': 1,
54 | '7': 2,
55 | '8': 3,
56 | '9': 4,
57 | '10': 5,
58 | 'J': 6,
59 | 'Q': 7,
60 | 'K': 8,
61 | 'A': 9}
62 |
63 |
64 | class Card:
65 | def __init__(self, c):
66 | self.suit = c[-1]
67 | self.value = values[c[:-1]]
68 | self.is_trump = self.suit == trump
69 | if self.is_trump:
70 | self.value += 10
71 |
72 | def __str__(self):
73 | return 'Value: {}, suit: {}, is trump: {}'.format(self.value, self.suit, self.is_trump)
74 |
75 | card1 = Card(c1)
76 | card2 = Card(c2)
77 |
78 | if card1.suit == card2.suit or any((card1.is_trump, card2.is_trump)):
79 | if card1.value > card2.value:
80 | print('First')
81 | else:
82 | print('Second')
83 | else:
84 | print('Error')
85 | ```
86 |
87 |
--------------------------------------------------------------------------------
/Python - основы и применение/1.5 Введение в классы 9.md:
--------------------------------------------------------------------------------
1 | Вам дается последовательность целых чисел и вам нужно ее обработать и вывести на экран сумму первой пятерки чисел из этой последовательности, затем сумму второй пятерки, и т. д.
2 |
3 | Но последовательность не дается вам сразу целиком. С течением времени к вам поступают её последовательные части. Например, сначала первые три элемента, потом следующие шесть, потом следующие два и т. д.
4 |
5 | Реализуйте класс **Buffer**, который будет накапливать в себе элементы последовательности и выводить сумму пятерок последовательных элементов по мере их накопления.
6 |
7 | Одним из требований к классу является то, что он не должен хранить в себе больше элементов, чем ему действительно необходимо, т. е. он не должен хранить элементы, которые уже вошли в пятерку, для которой была выведена сумма.
8 |
9 | Класс должен иметь следующий вид
10 |
11 | ```
12 | class Buffer:
13 | def __init__(self):
14 | # конструктор без аргументов
15 |
16 | def add(self, *a):
17 | # добавить следующую часть последовательности
18 |
19 | def get_current_part(self):
20 | # вернуть сохраненные в текущий момент элементы последовательности в порядке, в котором они были
21 | # добавлены
22 | ```
23 |
24 | Пример работы с классом
25 |
26 | ```
27 | buf = Buffer()
28 | buf.add(1, 2, 3)
29 | buf.get_current_part() # вернуть [1, 2, 3]
30 | buf.add(4, 5, 6) # print(15) – вывод суммы первой пятерки элементов
31 | buf.get_current_part() # вернуть [6]
32 | buf.add(7, 8, 9, 10) # print(40) – вывод суммы второй пятерки элементов
33 | buf.get_current_part() # вернуть []
34 | buf.add(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1) # print(5), print(5) – вывод сумм третьей и четвертой пятерки
35 | buf.get_current_part() # вернуть [1]
36 | ```
37 |
38 | Обратите внимание, что во время выполнения метода add выводить сумму пятерок может потребоваться несколько раз до тех пор, пока в буфере не останется менее пяти элементов.
39 |
40 | # Решение
41 |
42 | ```
43 | class Buffer:
44 |
45 | def __init__(self):
46 | self.current_part = []
47 |
48 | def add(self, *a):
49 | self.current_part.extend(a)
50 | while len(self.current_part) - 5 >= 0:
51 | print(sum(self.current_part[0:5]))
52 | self.current_part = self.current_part[5:]
53 |
54 | def get_current_part(self):
55 | return self.current_part
56 | ```
57 |
--------------------------------------------------------------------------------
/Адаптивный тренажёр Python/7.1 Minesweeper field.md:
--------------------------------------------------------------------------------
1 | Поле для игры сапёр представляет собой сетку размером *n×m*
2 | . В ячейке сетки может находиться или отсутствовать мина.
3 |
4 | Напишите программу, которая выводит "решённое" поле, т.е. для каждой ячейки, не являющейся миной, указывается число мин, находящихся в соседних ячейках (учитывая диагональные направления)
5 |
6 | **Формат ввода**:
7 |
8 | На первой строке указываются два натуральных числа *1≤n,m≤100*
9 | , после чего в *n* строках содержится описание поля в виде последовательности точек '.' и звёздочек '*', где точка означает пустую ячейку, а звёздочка − ячейку с миной.
10 |
11 | **Формат вывода**:
12 |
13 | *n* строк поля, в каждой ячейке которого будет либо число от 0 до 8, либо мина (обозначенная символом "*"), при этом число означает количество мин в соседних ячейках поля.
14 |
15 | ---
16 |
17 | **Sample Input**:
18 |
19 | ```
20 | 4 4
21 | ..*.
22 | **..
23 | ..*.
24 | ....
25 | ```
26 |
27 | **Sample Output**:
28 |
29 | ```
30 | 23*1
31 | **32
32 | 23*1
33 | 0111
34 | ```
35 |
36 | # Solution/Решение
37 |
38 |
39 | ```
40 | rows, columns = map(int, input().split())
41 |
42 |
43 | class Field:
44 | def __init__(self):
45 | self.field = []
46 | for x in range(rows):
47 | inp = input()
48 | field_row = []
49 | for y in range(columns):
50 | cell = Cell(x, y, inp[y])
51 | field_row.append(cell)
52 | self.field.append(field_row)
53 | self.render_mines()
54 |
55 | def render_mines(self):
56 | for x in range(rows):
57 | for y in range(columns):
58 | mines_around = 0
59 | cell_vicinity = self.field[x][y].vicinity
60 | for element in cell_vicinity:
61 | if self.field[element[0]][element[1]].status == '*':
62 | mines_around += 1
63 | if self.field[x][y].status == '.':
64 | self.field[x][y].status = str(mines_around)
65 |
66 | def __str__(self):
67 | res = ''
68 | for row in self.field:
69 | statuses = map(lambda x: x.status, row)
70 | res += ''.join(statuses) + '\n'
71 | return res.rstrip()
72 |
73 |
74 | class Cell:
75 | def __init__(self, x, y, status):
76 | self.x = x
77 | self.y = y
78 | self.status = status
79 | self.vicinity = []
80 | self.mines_around = 0
81 | steps = range(-1, 2)
82 | for x in steps:
83 | for y in steps:
84 | if self.x + x >= 0 and self.x + x <= rows - 1:
85 | if self.y + y >= 0 and self.y + y <= columns - 1:
86 | self.vicinity.append((self.x + x, self.y + y))
87 | self.vicinity.remove((self.x, self.y))
88 |
89 | def __str__(self):
90 | return self.status
91 |
92 |
93 | field = Field()
94 | print(field)
95 | ```
96 |
--------------------------------------------------------------------------------
/Python - основы и применение/1.6 Наследование классов 7.md:
--------------------------------------------------------------------------------
1 | Вам дано описание наследования классов в следующем формате.
2 |
3 | **имя класса 1 : имя класса 2 имя класса 3 ... имя класса k**
4 |
5 | Это означает, что **класс 1** отнаследован от **класса 2**, **класса 3**, и т. д.
6 |
7 | Или эквивалентно записи:
8 |
9 | ```
10 | class Class1(Class2, Class3 ... ClassK):
11 | pass
12 | ```
13 |
14 | Класс **A** является **прямым предком** класса **B**, если **B** отнаследован от **A**:
15 |
16 | ```
17 | class B(A):
18 | pass
19 | ```
20 |
21 | Класс **A** является **предком** класса **B**, если
22 |
23 | - **A = B**
24 | - **A** - прямой предок **B**
25 | - существует такой класс **C**, что **C** - прямой предок **B** и **A** - предок **C**
26 |
27 | Например:
28 |
29 | ```
30 | class B(A):
31 | pass
32 |
33 | class C(B):
34 | pass
35 |
36 | # A -- предок С
37 | ```
38 |
39 | Вам необходимо отвечать на запросы, является ли один класс предком другого класса
40 |
41 | **Важное примечание**:
42 |
43 | Создавать классы не требуется.
44 |
45 | Мы просим вас промоделировать этот процесс, и понять существует ли путь от одного класса до другого.
46 |
47 | **Формат входных данных**
48 |
49 | В первой строке входных данных содержится целое число **n** - число классов.
50 |
51 | В следующих **n** строках содержится описание наследования классов. В **i**-й строке указано от каких классов наследуется **i**-й класс. Обратите внимание, что класс может ни от кого не наследоваться. Гарантируется, что класс не наследуется сам от себя (прямо или косвенно), что класс не наследуется явно от одного класса более одного раза.
52 |
53 | В следующей строке содержится число **q** - количество запросов.
54 |
55 | В следующих **q** строках содержится описание запросов в формате **имя класса 1 имя класса 2**.
56 |
57 | Имя класса – строка, состоящая из символов латинского алфавита, длины не более 50.
58 |
59 | **Формат выходных данных**
60 |
61 | Для каждого запроса выведите в отдельной строке слово "**Yes**", если **класс 1** является предком **класса 2**, и "**No**", если не является.
62 |
63 | ---
64 |
65 | ** Sample Input**:
66 |
67 | ```
68 | 4
69 | A
70 | B : A
71 | C : A
72 | D : B C
73 | 4
74 | A B
75 | B D
76 | C D
77 | D A
78 | ```
79 |
80 | **Sample Output**:
81 |
82 | ```
83 | Yes
84 | Yes
85 | Yes
86 | No
87 | ```
88 |
89 | # Решение
90 |
91 | ```
92 | classes = {}
93 |
94 | def add_class(classes, class_name, parents):
95 | if class_name not in classes:
96 | classes[class_name] = []
97 | classes[class_name].extend(parents)
98 | for parent in parents:
99 | if parent not in classes:
100 | classes[parent] = []
101 |
102 | def found_path(classes, start, end, path=[]):
103 | path = path + [start]
104 | if start == end:
105 | return path
106 | if start not in classes:
107 | return None
108 | for node in classes[start]:
109 | if node not in path:
110 | newpath = found_path(classes, node, end, path)
111 | if newpath: return newpath
112 | return None
113 |
114 | def answer(classes, parent, child):
115 | if not(parent or child) in classes or not found_path(classes, child, parent):
116 | return 'No'
117 | return 'Yes'
118 |
119 | n = int(input())
120 | for _ in range(n):
121 | class_description = input().split()
122 | class_name = class_description[0]
123 | class_parents = class_description[2:]
124 | add_class(classes, class_name, class_parents)
125 |
126 | q = int(input())
127 | for _ in range(q):
128 | question = input().split()
129 | parent = question[0]
130 | child = question[1]
131 | print(answer(classes, parent, child))
132 | ```
133 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/ask/settings.py:
--------------------------------------------------------------------------------
1 | """
2 | Django settings for ask project.
3 |
4 | Generated by 'django-admin startproject' using Django 1.10.4.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/1.10/topics/settings/
8 |
9 | For the full list of settings and their values, see
10 | https://docs.djangoproject.com/en/1.10/ref/settings/
11 | """
12 |
13 | import os
14 |
15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
17 |
18 | # Quick-start development settings - unsuitable for production
19 | # See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
20 |
21 | # SECURITY WARNING: keep the secret key used in production secret!
22 | SECRET_KEY = 'tgtwjqxrt0%o@d0uxj-=c$e&4sph2pzjt09ndxguecga_dsfnk'
23 |
24 | # SECURITY WARNING: don't run with debug turned on in production!
25 | DEBUG = True
26 |
27 | ALLOWED_HOSTS = ['*']
28 |
29 |
30 | # Application definition
31 |
32 | INSTALLED_APPS = [
33 | 'django.contrib.admin',
34 | 'django.contrib.auth',
35 | 'django.contrib.contenttypes',
36 | 'django.contrib.sessions',
37 | 'django.contrib.messages',
38 | 'django.contrib.staticfiles',
39 | 'qa'
40 | ]
41 |
42 | MIDDLEWARE = [
43 | 'django.middleware.security.SecurityMiddleware',
44 | 'django.contrib.sessions.middleware.SessionMiddleware',
45 | 'django.middleware.common.CommonMiddleware',
46 | 'django.middleware.csrf.CsrfViewMiddleware',
47 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
48 | 'django.contrib.messages.middleware.MessageMiddleware',
49 | 'django.middleware.clickjacking.XFrameOptionsMiddleware',
50 | ]
51 |
52 | ROOT_URLCONF = 'ask.urls'
53 |
54 | TEMPLATES = [
55 | {
56 | 'BACKEND': 'django.template.backends.django.DjangoTemplates',
57 | 'DIRS': [],
58 | 'APP_DIRS': True,
59 | 'OPTIONS': {
60 | 'context_processors': [
61 | 'django.template.context_processors.debug',
62 | 'django.template.context_processors.request',
63 | 'django.contrib.auth.context_processors.auth',
64 | 'django.contrib.messages.context_processors.messages',
65 | ],
66 | },
67 | },
68 | ]
69 |
70 | TEMPLATE_DIRS = (os.path.join(BASE_DIR, 'templates'), )
71 |
72 | WSGI_APPLICATION = 'ask.wsgi.application'
73 |
74 |
75 | # Database
76 | # https://docs.djangoproject.com/en/1.10/ref/settings/#databases
77 |
78 | DATABASES = {
79 | 'default': {
80 | 'ENGINE': 'django.db.backends.mysql',
81 | 'NAME': 'ask',
82 | 'USER': 'root',
83 | 'PASSWORD': '',
84 | 'HOST': 'localhost',
85 | 'PORT': '3306',
86 | }
87 | }
88 |
89 | # Password validation
90 | # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
91 |
92 | AUTH_PASSWORD_VALIDATORS = [
93 | {
94 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
95 | },
96 | {
97 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
98 | },
99 | {
100 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
101 | },
102 | {
103 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
104 | },
105 | ]
106 |
107 |
108 | # Internationalization
109 | # https://docs.djangoproject.com/en/1.10/topics/i18n/
110 |
111 | LANGUAGE_CODE = 'en-us'
112 |
113 | TIME_ZONE = 'UTC'
114 |
115 | USE_I18N = True
116 |
117 | USE_L10N = True
118 |
119 | USE_TZ = True
120 |
121 |
122 | # Static files (CSS, JavaScript, Images)
123 | # https://docs.djangoproject.com/en/1.10/howto/static-files/
124 |
125 | STATIC_URL = '/static/'
126 |
--------------------------------------------------------------------------------
/Python - основы и применение/3.6 API 4.md:
--------------------------------------------------------------------------------
1 | В этой задаче вам необходимо воспользоваться API сайта artsy.net
2 |
3 | API проекта Artsy предоставляет информацию о некоторых деятелях искусства, их работах, выставках.
4 |
5 | В рамках данной задачи вам понадобятся сведения о деятелях искусства (назовем их, условно, художники).
6 |
7 | Вам даны идентификаторы художников в базе Artsy.
8 | Для каждого идентификатора получите информацию о имени художника и годе рождения.
9 | Выведите имена художников в порядке неубывания года рождения. В случае если у художников одинаковый год рождения, выведите их имена в лексикографическом порядке.
10 |
11 | **Работа с API Artsy**
12 |
13 | Полностью открытое и свободное API предоставляют совсем немногие проекты. В большинстве случаев, для получения доступа к API необходимо зарегистрироваться в проекте, создать свое приложение, и получить уникальный ключ (или токен), и в дальнейшем все запросы к API осуществляются при помощи этого ключа.
14 |
15 | Чтобы начать работу с API проекта Artsy, вам необходимо пройти на стартовую страницу документации к API https://developers.artsy.net/start и выполнить необходимые шаги, а именно зарегистрироваться, создать приложение, и получить пару идентификаторов **Client Id** и **Client Secret**. Не публикуйте эти идентификаторы.
16 |
17 | После этого необходимо получить токен доступа к API. На стартовой странице документации есть примеры того, как можно выполнить запрос и как выглядит ответ сервера. Мы приведем пример запроса на Python.
18 |
19 | ```
20 | import requests
21 | import json
22 |
23 | client_id = '...'
24 | client_secret = '...'
25 |
26 | # инициируем запрос на получение токена
27 | r = requests.post("https://api.artsy.net/api/tokens/xapp_token",
28 | data={
29 | "client_id": client_id,
30 | "client_secret": client_secret
31 | })
32 |
33 | # разбираем ответ сервера
34 | j = json.loads(r.text)
35 |
36 | # достаем токен
37 | token = j["token"]
38 | ```
39 |
40 | Теперь все готово для получения информации о художниках. На стартовой странице документации есть пример того, как осуществляется запрос и как выглядит ответ сервера. Пример запроса на Python.
41 |
42 | ```
43 | # создаем заголовок, содержащий наш токен
44 | headers = {"X-Xapp-Token" : token}
45 |
46 | # инициируем запрос с заголовком
47 | r = requests.get("https://api.artsy.net/api/artists/4d8b92b34eb68a1b2c0003f4", headers=headers)
48 |
49 | # разбираем ответ сервера
50 | j = json.loads(r.text)
51 | ```
52 |
53 | Примечание:
54 | В качестве имени художника используется параметр sortable_name в кодировке UTF-8.
55 |
56 | Пример входных данных:
57 | 4d8b92b34eb68a1b2c0003f4
58 | 537def3c139b21353f0006a6
59 | 4e2ed576477cc70001006f99
60 |
61 | Пример выходных данных:
62 | Abbott Mary
63 | Warhol Andy
64 | Abbas Hamra
65 |
66 |
67 | # Solution / Решение
68 |
69 | ```
70 | import requests
71 | import json
72 |
73 | client_id = 'db311cfe37ec4bc74a61'
74 | client_secret = 'ba1d22427d386b0b79ce4403c063b2ec'
75 |
76 | r = requests.post("https://api.artsy.net/api/tokens/xapp_token",
77 | data={
78 | "client_id": client_id,
79 | "client_secret": client_secret
80 | })
81 | j = json.loads(r.text)
82 | token = j["token"]
83 |
84 | artists = []
85 |
86 | with open('dataset_24476_4.txt') as file:
87 | for artist_id in file:
88 | artist_id = artist_id.strip()
89 | url = 'https://api.artsy.net/api/artists/{}'.format(artist_id)
90 | params = {'xapp_token': token}
91 | resp = requests.get(url, params=params).text
92 | data = json.loads(resp)
93 | artists.append({'name': data['sortable_name'], 'birthday': data['birthday']})
94 |
95 | for artist in sorted(artists, key=lambda x: (x['birthday'], x['name'])):
96 | print(artist['name'])
97 | ```
98 |
--------------------------------------------------------------------------------
/Python - основы и применение/2.1 Ошибки и исключения 7.md:
--------------------------------------------------------------------------------
1 | Вам дано описание наследования классов исключений в следующем формате.
2 |
3 | **имя исключения 1 : имя исключения 2 имя исключения 3 ... имя исключения k**
4 |
5 | Это означает, что **исключение 1** наследуется от **исключения 2**, **исключения 3**, и т. д.
6 |
7 | Или эквивалентно записи:
8 |
9 | ```
10 | class Error1(Error2, Error3 ... ErrorK):
11 | pass
12 | ```
13 |
14 | Антон написал код, который выглядит следующим образом.
15 |
16 | ```
17 | try:
18 | foo()
19 | except <имя 1>:
20 | print("<имя 1>")
21 | except <имя 2>:
22 | print("<имя 2>")
23 | ...
24 | ```
25 |
26 | Костя посмотрел на этот код и указал Антону на то, что некоторые исключения можно не ловить, так как ранее в коде будет пойман их предок. Но Антон не помнит какие исключения наследуются от каких. Помогите ему выйти из неловкого положения и напишите программу, которая будет определять обработку каких исключений можно удалить из кода.
27 |
28 | **Важное примечание**:
29 |
30 | В отличие от предыдущей задачи, типы исключений не созданы.
31 |
32 | Создавать классы исключений также не требуется
33 |
34 | Мы просим вас промоделировать этот процесс, и понять какие из исключений можно и не ловить, потому что мы уже ранее где-то поймали их предка.
35 |
36 | **Формат входных данных**
37 |
38 | В первой строке входных данных содержится целое число **n** - число классов исключений.
39 |
40 | В следующих **n** строках содержится описание наследования классов. В **i**-й строке указано от каких классов наследуется **i**-й класс. Обратите внимание, что класс может ни от кого не наследоваться. Гарантируется, что класс не наследуется сам от себя (прямо или косвенно), что класс не наследуется явно от одного класса более одного раза.
41 |
42 | В следующей строке содержится число **m** - количество обрабатываемых исключений. Следующие **m** строк содержат имена исключений в том порядке, в каком они были написаны у Антона в коде. Гарантируется, что никакое исключение не обрабатывается дважды.
43 |
44 | **Формат выходных данных**
45 |
46 | Выведите в отдельной строке имя каждого исключения, обработку которого можно удалить из кода, не изменив при этом поведение программы. Имена следует выводить в том же порядке, в котором они идут во входных данных.
47 |
48 | **Пример теста 1**
49 |
50 | Рассмотрим код
51 |
52 | ```
53 | try:
54 | foo()
55 | except ZeroDivision :
56 | print("ZeroDivision")
57 | except OSError:
58 | print("OSError")
59 | except ArithmeticError:
60 | print("ArithmeticError")
61 | except FileNotFoundError:
62 | print("FileNotFoundError")
63 | ...
64 | ```
65 |
66 | По условию этого теста, Костя посмотрел на этот код, и сказал Антону, что исключение **FileNotFoundError** можно не ловить, ведь мы уже ловим **OSError** -- предок **FileNotFoundError**
67 |
68 | ```
69 | Sample Input:
70 | 4
71 | ArithmeticError
72 | ZeroDivisionError : ArithmeticError
73 | OSError
74 | FileNotFoundError : OSError
75 | 4
76 | ZeroDivisionError
77 | OSError
78 | ArithmeticError
79 | FileNotFoundError
80 | Sample Output:
81 | FileNotFoundError
82 | ```
83 |
84 | # Решение
85 |
86 | ```
87 | exceptions = {}
88 | throwed_exceptions = []
89 |
90 | def found_path(exceptions, start, end, path=[]):
91 | path = path + [start]
92 | if start == end:
93 | return path
94 | if start not in exceptions:
95 | return []
96 | for node in exceptions[start]:
97 | if node not in path:
98 | newpath = found_path(exceptions, node, end, path)
99 | if newpath: return newpath
100 | return []
101 |
102 | n = int(input())
103 | for _ in range(n):
104 | inpt = input().split()
105 | child = inpt[0]
106 | parents = inpt[2:]
107 | exceptions[child] = parents
108 |
109 | m = int(input())
110 | for _ in range(m):
111 | throwing = input()
112 | for throwed_exception in throwed_exceptions:
113 | if len(found_path(exceptions, throwing, throwed_exception)) > 1:
114 | print(throwing)
115 | break
116 | throwed_exceptions.append(throwing)
117 | ```
118 |
--------------------------------------------------------------------------------
/Адаптивный тренажёр Python/5.20 Game of life.md:
--------------------------------------------------------------------------------
1 | # 5.20 Game of life
2 |
3 | Напишите программу, вычисляющую следующее состояние поля для Game of life.
4 |
5 | Поле представляет собой прямоугольник, причём для крайних клеток поля соседними являются клетки с противоположного конца (поле представляет собой тор).
6 |
7 | **Формат ввода**:
8 |
9 | На первой строке указаны два целых числа через пробел -- высота и ширина поля. В следующих строках подаётся состояние поля. Точка "." обозначает мёртвую клетку, символ "X" − живую.
10 |
11 | **Формат вывода**:
12 |
13 | Следующее состояние поля, используя те же обозначения, что использовались на вводе.
14 |
15 | **Sample Input 1**:
16 |
17 | ```
18 | 5 5
19 | .....
20 | ..X..
21 | ...X.
22 | .XXX.
23 | .....
24 | ```
25 |
26 | **Sample Output 1**:
27 |
28 | ```
29 | .....
30 | .....
31 | .X.X.
32 | ..XX.
33 | ..X..
34 | ```
35 |
36 | **Sample Input 2**:
37 |
38 | ```
39 | 5 5
40 | .....
41 | .....
42 | .XXX.
43 | .....
44 | .....
45 | ```
46 |
47 | **Sample Output 2**:
48 |
49 | ```
50 | .....
51 | ..X..
52 | ..X..
53 | ..X..
54 | .....
55 | ```
56 |
57 | **Sample Input 3**:
58 |
59 | ```
60 | 5 6
61 | ...XX.
62 | .XX...
63 | ..X...
64 | XX....
65 | X..XX.
66 | ```
67 |
68 | **Sample Output 3**:
69 |
70 | ```
71 | .X..XX
72 | .XX...
73 | X.X...
74 | XXXX.X
75 | XXXXX.
76 | ```
77 |
78 | # Решение/Solution
79 |
80 | ```
81 | rows, columns = map(int, input().split())
82 | inp = []
83 | for row in range(rows):
84 | inp.append(input())
85 |
86 |
87 | class Universe:
88 | def __init__(self, inp):
89 | self.inp = inp
90 | self.make_universe()
91 |
92 | def make_universe(self):
93 | self.universe = []
94 | for x in range(rows):
95 | universe_row = []
96 | for y in range(columns):
97 | cell = Cell(x, y, self.inp[x][y])
98 | universe_row.append(cell)
99 | self.universe.append(universe_row)
100 |
101 | def make_future_universe(self):
102 | self.future_universe = []
103 | for x in range(rows):
104 | universe_row = []
105 | for y in range(columns):
106 | cell = Cell(x, y, '.')
107 | universe_row.append(cell)
108 | self.future_universe.append(universe_row)
109 |
110 | def make_turn(self):
111 | self.make_future_universe()
112 | for x in range(rows):
113 | for y in range(columns):
114 | cell = self.universe[x][y]
115 | future_cell = self.future_universe[x][y]
116 | if cell.status == '.':
117 | if cell.count_neighbours() == 3:
118 | future_cell.status = 'X'
119 | else: future_cell.status = '.'
120 | else:
121 | if cell.count_neighbours() < 2 or cell.count_neighbours() > 3:
122 | future_cell.status = '.'
123 | else: future_cell.status = 'X'
124 |
125 | def print_future_universe(self):
126 | for row in self.future_universe:
127 | for cell in row:
128 | print(cell, end='')
129 | print()
130 |
131 |
132 | class Cell:
133 | def __init__(self, x, y, status):
134 | self.position = x, y
135 | self.status = status
136 |
137 | def get_vicinity(self):
138 | self.vicinity_coordinates = []
139 | increments = [-1, 0, 1]
140 | for x in increments:
141 | for y in increments:
142 | self.vicinity_coordinates.append(((self.position[0] + x) % rows, (self.position[1] + y) % columns))
143 | self.vicinity_coordinates.remove(self.position)
144 | return self.vicinity_coordinates
145 |
146 | def count_neighbours(self):
147 | self.get_vicinity()
148 | self.num_neighbours = 0
149 | for (x, y) in self.vicinity_coordinates:
150 | if inp[x][y] == 'X':
151 | self.num_neighbours += 1
152 | return self.num_neighbours
153 |
154 | def __str__(self):
155 | return self.status
156 |
157 | u = Universe(inp)
158 | u.make_turn()
159 | u.print_future_universe()
160 | ```
161 |
--------------------------------------------------------------------------------
/Веб-технологии/web/ask/qa/views.py:
--------------------------------------------------------------------------------
1 | from django.http import HttpResponse, HttpResponseRedirect
2 | from django.core.urlresolvers import reverse
3 | from django.shortcuts import render, get_object_or_404
4 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
5 | from .models import Question, Answer
6 | from .forms import AskForm, AnswerForm, SignupForm, LoginForm
7 |
8 | from django.contrib.auth.models import User
9 |
10 | from django.contrib.auth import authenticate, logout
11 | from django.contrib.auth import login as log_in
12 |
13 | import string
14 | import random
15 |
16 |
17 | def random_user():
18 | while True:
19 | for i in range(10):
20 | name += random.choice(string.ascii_letters)
21 | try:
22 | User.objects.get(username=name)
23 | except User.DoesNotExist:
24 | user = User.objects.create_user(
25 | username=name, email='hi@there.com', password='666')
26 | break
27 | return user
28 |
29 |
30 | def test(request, *args, **kwargs):
31 | return HttpResponse('OK')
32 |
33 |
34 | def login(request):
35 | if request.method == 'POST':
36 | form = LoginForm(request.POST)
37 | if form.is_valid():
38 | user = form.save()
39 | if user is not None:
40 | log_in(request, user)
41 | return HttpResponseRedirect(reverse('new'))
42 | form = LoginForm()
43 | return render(request, 'login.html', {'form': form})
44 |
45 |
46 | def signup(request):
47 | if request.method == 'POST':
48 | form = SignupForm(request.POST)
49 | if form.is_valid():
50 | user = form.save(commit=False)
51 | username = user.username
52 | email = user.email
53 | password = user.password
54 | new_user = User.objects.create_user(username, email, password)
55 | new_user.save()
56 | new_user = authenticate(username=username, password=password)
57 | log_in(request, new_user)
58 | return HttpResponseRedirect(reverse('new'))
59 | else:
60 | form = SignupForm()
61 | return render(request, 'signup.html', {'form': form})
62 |
63 |
64 | def ask(request):
65 |
66 | if request.method == 'POST':
67 | form = AskForm(request.POST)
68 | if form.is_valid():
69 | question = form.save(commit=False)
70 | try:
71 | question.author = request.user
72 | except ValueError:
73 | question.author = random_user()
74 | question.save()
75 | return HttpResponseRedirect(reverse('question', kwargs={'question_pk': question.pk}))
76 | else:
77 | form = AskForm()
78 | return render(request, 'ask.html', {'form': form})
79 |
80 |
81 | def question(request, question_pk):
82 | q = get_object_or_404(Question, pk=question_pk)
83 | answers = Answer.objects.filter(question=q)
84 |
85 | if request.method == 'POST':
86 | form = AnswerForm(request.POST)
87 | if form.is_valid():
88 | answer = form.save(commit=False)
89 | answer.author = request.user
90 | answer.question = q
91 | answer.save()
92 | return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
93 | else:
94 | form = AnswerForm(initial={'question': q})
95 |
96 | return render(request, 'question.html', {'question': q, 'answers': answers, 'form': form})
97 |
98 |
99 | def popular(request):
100 | questions = Question.objects.popular()
101 | paginator = Paginator(questions, 10)
102 | paginator.baseurl = '/popular/?page='
103 | page_num = request.GET.get('page')
104 | try:
105 | questions = paginator.page(page_num)
106 | except PageNotAnInteger:
107 | questions = paginator.page(1)
108 | except EmptyPage:
109 | questions = paginator.page(paginator.num_pages)
110 |
111 | return render(request, 'popular.html', {'questions': questions, 'paginator': paginator})
112 |
113 |
114 | def new(request):
115 | questions = Question.objects.new()
116 | paginator = Paginator(questions, 10)
117 | paginator.baseurl = '/?page='
118 | page_num = request.GET.get('page')
119 | try:
120 | questions = paginator.page(page_num)
121 | except PageNotAnInteger:
122 | questions = paginator.page(1)
123 | except EmptyPage:
124 | questions = paginator.page(paginator.num_pages)
125 |
126 | return render(request, 'index.html', {'questions': questions, 'paginator': paginator})
127 |
--------------------------------------------------------------------------------
/Адаптивный тренажёр Python/9.2 Poker hand.md:
--------------------------------------------------------------------------------
1 | A poker deck contains 52 cards. Each card has a suit of either clubs, diamonds, hearts, or spades (denoted C, D, H, S). Each card also has a value of either 2 through 10, jack, queen, king, or ace (denoted 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A). For scoring purposes card values are ordered as above, with 2 having the lowest and ace the highest value. The suit has no impact on value.
2 |
3 | A poker hand consists of five cards. Poker hands are ranked by the following partial order from lowest to highest.
4 |
5 |
6 | *High Card*
7 |
8 | Hands which do not fit any higher category are ranked by the value of their highest card.
9 |
10 | *Pair*
11 |
12 | Two of the five cards in the hand have the same value.
13 |
14 | *Two Pairs*
15 |
16 | The hand contains two different pairs.
17 |
18 | *Three of a Kind*
19 |
20 | Three of the cards in the hand have the same value.
21 |
22 | *Straight*
23 |
24 | Hand contains five cards with consecutive values.
25 |
26 | *Flush*
27 |
28 | Hand contains five cards of the same suit.
29 |
30 | *Full House*
31 |
32 | Three cards of the same value, with the remaining two cards forming a pair.
33 |
34 | *Four of a Kind*
35 |
36 | Four cards with the same value.
37 |
38 | *Straight Flush*
39 |
40 | Five cards of the same suit in numerical order.
41 |
42 | *Royal Flush*
43 |
44 | Consists of the ace, king, queen, jack and ten of a suit.
45 |
46 |
47 | Напишите программу, которая получает на вход пять карт и выводит старшую покерную комбинацию, которая образуется этими картами.
48 |
49 | **Формат ввода**:
50 |
51 | Одна строка, на которой указаны пять карт в формате , записанные через пробел.
52 |
53 | **Формат вывода**:
54 |
55 | Название старшей комбинации, сформировавшейся на пришедшем наборе.
56 |
57 | ---
58 |
59 | **Sample Input**:
60 |
61 | 10C JC QC KC AC
62 |
63 | **Sample Output**:
64 |
65 | Royal Flush
66 |
67 | ---
68 |
69 | # Решение / Solution
70 |
71 | ```
72 | from collections import Counter, OrderedDict
73 |
74 |
75 | class Hand:
76 | def __init__(self, cards):
77 | self.cards = cards
78 | self.values = [x.value for x in self.cards]
79 | self.suits = [x.suit for x in self.cards]
80 | self.true_values = sorted([x.true_value for x in self.cards])
81 | self.counter = Counter(self.values)
82 | self.value_amounts = self.counter.values()
83 |
84 | def pair(self):
85 | return max(self.value_amounts) == 2
86 |
87 | def two_pairs(self):
88 | return list(self.value_amounts).count(2) == 2
89 |
90 | def three_of_a_kind(self):
91 | return max(self.value_amounts) == 3
92 |
93 | def straight(self):
94 | first_value = self.true_values[0]
95 | return self.true_values == list(range(first_value, first_value + 5))
96 |
97 | def flush(self):
98 | return len(set(self.suits)) == 1
99 |
100 | def full_house(self):
101 | return 3 in self.value_amounts and 2 in self.value_amounts
102 |
103 | def four_of_a_kind(self):
104 | return max(self.value_amounts) == 4
105 |
106 | def straight_flush(self):
107 | return self.straight() and len(set(self.suits)) == 1
108 |
109 | def royal_flush(self):
110 | return self.true_values == list(range(10, 15)) and len(set(self.suits)) == 1
111 |
112 | def __str__(self):
113 | hand = OrderedDict()
114 | hand['Royal Flush'] = self.royal_flush()
115 | hand['Straight Flush'] = self.straight_flush()
116 | hand['Four of a Kind'] = self.four_of_a_kind()
117 | hand['Full House'] = self.full_house()
118 | hand['Flush'] = self.flush()
119 | hand['Straight'] = self.straight()
120 | hand['Three of a Kind'] = self.three_of_a_kind()
121 | hand['Two Pairs'] = self.two_pairs()
122 | hand['Pair'] = self.pair()
123 |
124 | for k, fn in hand.items():
125 | if fn:
126 | return k
127 | return 'High Card'
128 |
129 |
130 | class Card:
131 | def __init__(self, c):
132 | self.value = c[:-1]
133 | self.suit = c[-1]
134 | self.get_true_value()
135 |
136 | def get_true_value(self):
137 | elders = {'J': 11, 'Q': 12, 'K': 13, 'A': 14}
138 | self.true_value = 0
139 | try:
140 | self.true_value = int(self.value)
141 | except ValueError:
142 | self.true_value = elders[self.value]
143 |
144 |
145 | inp = input().split()
146 | cards = []
147 |
148 | for c in inp:
149 | card = Card(c)
150 | cards.append(card)
151 |
152 | hand = Hand(cards)
153 | print(hand)
154 | ```
155 |
--------------------------------------------------------------------------------
/Python - основы и применение/2.3 Итераторы и генераторы 4.md:
--------------------------------------------------------------------------------
1 | Одним из самых часто используемых классов в Python является класс **filter**. Он принимает в конструкторе два аргумента **a** и **f** – последовательность и функцию, и позволяет проитерироваться только по таким элементам **x** из последовательности **a**, что **f(x)** равно **True**. Будем говорить, что в этом случае функция **f** допускает элемент **x**, а элемент **x** является допущенным.
2 |
3 | В данной задаче мы просим вас реализовать класс **multifilter**, который будет выполнять ту же функцию, что и стандартный класс **filter**, но будет использовать не одну функцию, а несколько.
4 |
5 | Решение о допуске элемента будет приниматься на основании того, сколько функций допускают этот элемент, и сколько не допускают. Обозначим эти количества за **pos** и **neg**.
6 |
7 | Введем понятие решающей функции – это функция, которая принимает два аргумента – количества **pos** и **neg**, и возвращает **True**, если элемент допущен, и **False** иначе.
8 |
9 | Рассмотрим процесс допуска подробнее на следующем примере.
10 |
11 | ```
12 | a = [1, 2, 3]
13 | f2(x) = x % 2 == 0 # возвращает True, если x делится на 2
14 | f3(x) = x % 3 == 0
15 | judge_any(pos, neg) = pos >= 1 # возвращает True, если хотя бы одна функция допускает элемент
16 | ```
17 |
18 | В этом примере мы хотим отфильтровать последовательность a и оставить только те элементы, которые делятся на два или на три.
19 |
20 | Функция **f2** допускает только элементы, делящиеся на два, а функция **f3** допускает только элементы, делящиеся на три. Решающая функция допускает элемент в случае, если он был допущен хотя бы одной из функций **f2** или **f3**, то есть элементы, которые делятся на два или на три.
21 |
22 | Возьмем первый элемент **x = 1**.
23 |
24 | **f2(x)** равно **False**, т. е. функция **f2** не допускает элемент **x**.
25 |
26 | **f3(x)** также равно **False**, т. е. функция **f3** также не допускает элемент **x**.
27 |
28 | В этом случае **pos = 0**, так как ни одна функция не допускает **x**, и соответственно **neg = 2**.
29 |
30 | **judge_any(0, 2)** равно **False**, значит мы не допускаем элемент **x = 1**.
31 |
32 | Возьмем второй элемент **x = 2**.
33 |
34 | **f2(x)** равно **True**
35 |
36 | **f3(x)** равно **False**
37 |
38 | **pos = 1, neg = 1**
39 |
40 | **judge_any(1, 1)** равно **True**, значит мы допускаем элемент **x = 2**.
41 |
42 |
43 | Аналогично для третьего элемента **x = 3**.
44 |
45 | Таким образом, получили последовательность допущенных элементов **[2, 3]**.
46 |
47 | Класс должен обладать следующей структурой:
48 |
49 | ```
50 | class multifilter:
51 | def judge_half(pos, neg):
52 | # допускает элемент, если его допускает хотя бы половина фукнций (pos >= neg)
53 |
54 | def judge_any(pos, neg):
55 | # допускает элемент, если его допускает хотя бы одна функция (pos >= 1)
56 |
57 | def judge_all(pos, neg):
58 | # допускает элемент, если его допускают все функции (neg == 0)
59 |
60 | def __init__(self, iterable, *funcs, judge=judge_any):
61 | # iterable - исходная последовательность
62 | # funcs - допускающие функции
63 | # judge - решающая функция
64 |
65 | def __iter__(self):
66 | # возвращает итератор по результирующей последовательности
67 | ```
68 |
69 | **Пример использования**:
70 |
71 | ```
72 | def mul2(x):
73 | return x % 2 == 0
74 |
75 | def mul3(x):
76 | return x % 3 == 0
77 |
78 | def mul5(x):
79 | return x % 5 == 0
80 |
81 | a = [i for i in range(31)] # [0, 1, 2, ... , 30]
82 |
83 | print(list(multifilter(a, mul2, mul3, mul5)))
84 | # [0, 2, 3, 4, 5, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 26, 27, 28, 30]
85 |
86 | print(list(multifilter(a, mul2, mul3, mul5, judge=multifilter.judge_half)))
87 | # [0, 6, 10, 12, 15, 18, 20, 24, 30]
88 |
89 | print(list(multifilter(a, mul2, mul3, mul5, judge=multifilter.judge_all)))
90 | # [0, 30]
91 | ```
92 |
93 | # Solution/Решение
94 |
95 | ```
96 | def mul2(x):
97 | return x % 2 == 0
98 |
99 | def mul3(x):
100 | return x % 3 == 0
101 |
102 | def mul5(x):
103 | return x % 5 == 0
104 |
105 |
106 | a = [i for i in range(31)] # [0, 1, 2, ... , 30]
107 |
108 | class multifilter:
109 |
110 | def judge_half(pos, neg):
111 | # допускает элемент, если его допускает хотя бы половина функций (pos >= neg)
112 | return pos >= neg
113 |
114 | def judge_any(pos, neg):
115 | # допускает элемент, если его допускает хотя бы одна функция (pos >= 1)
116 | return pos >= 1
117 |
118 | def judge_all(pos, neg):
119 | # допускает элемент, если его допускают все функции (neg == 0)
120 | return neg == 0
121 |
122 | def __init__(self, iterable, *funcs, judge=judge_any):
123 | # iterable - исходная последовательность
124 | # funcs - допускающие функции
125 | # judge - решающая функция
126 | self.iterable = iterable
127 | self.funcs = funcs
128 | self.judge = judge
129 |
130 | def __iter__(self):
131 | # возвращает итератор по результирующей последовательности
132 | for element in self.iterable:
133 | pos = 0
134 | neg = 0
135 | for func in self.funcs:
136 | if func(element):
137 | pos += 1
138 | else:
139 | neg += 1
140 | if self.judge(pos, neg):
141 | yield element
142 | ```
143 |
144 |
--------------------------------------------------------------------------------
/Python - основы и применение/1.4 Пространства имён и область видимости 9.md:
--------------------------------------------------------------------------------
1 | Реализуйте программу, которая будет эмулировать работу с пространствами имен. Необходимо реализовать поддержку создания пространств имен и добавление в них переменных.
2 |
3 | В данной задаче у каждого пространства имен есть уникальный текстовый идентификатор – его имя.
4 |
5 | Вашей программе на вход подаются следующие запросы:
6 |
7 | - **create namespace parent** – создать новое пространство имен с именем **namespace** внутри пространства **parent**
8 | - **add namespace var** – добавить в пространство **namespace** переменную **var**
9 | - **get namespace var** – получить имя пространства, из которого будет взята переменная **var** при запросе из пространства **namespace**, или **None**, если такого пространства не существует
10 |
11 | Рассмотрим набор запросов
12 |
13 | - **add global a**
14 | - **create foo global**
15 | - **add foo b**
16 | - **create bar foo**
17 | - **add bar a**
18 |
19 | Структура пространств имен описанная данными запросами будет эквивалентна структуре пространств имен, созданной при выполнении данного кода
20 |
21 | ```
22 | a = 0
23 | def foo():
24 | b = 1
25 | def bar():
26 | a = 2
27 | ```
28 |
29 | В основном теле программы мы объявляем переменную **a**, тем самым добавляя ее в пространство **global**. Далее мы объявляем функцию **foo**, что влечет за собой создание локального для нее пространства имен внутри пространства **global**. В нашем случае, это описывается командой **create foo global**. Далее мы объявляем внутри функции **foo** функцию **bar**, тем самым создавая пространство **bar** внутри пространства **foo**, и добавляем в **bar** переменную **a**.
30 |
31 | Добавим запросы **get** к нашим запросам
32 |
33 | - **get foo a**
34 | - **get foo c**
35 | - **get bar a**
36 | - **get bar b**
37 |
38 | Представим как это могло бы выглядеть в коде
39 |
40 | ```
41 | a = 0
42 | def foo():
43 | b = 1
44 | get(a)
45 | get(c)
46 | def bar():
47 | a = 2
48 | get(a)
49 | get(b)
50 | ```
51 |
52 | Результатом запроса **get** будет имя пространства, из которого будет взята нужная переменная. Например, результатом запроса **get foo a** будет **global**, потому что в пространстве **foo** не объявлена переменная **a**, но в пространстве **global**, внутри которого находится пространство **foo**, она объявлена. Аналогично, результатом запроса **get bar b** будет являться **foo**, а результатом работы **get bar a** будет являться **bar**.
53 |
54 | Результатом **get foo c** будет являться **None**, потому что ни в пространстве **foo**, ни в его внешнем пространстве **global** не была объявлена переменная **с**.
55 |
56 | Более формально, результатом работы **get namespace var** является
57 |
58 | - **namespace**, если в пространстве **namespace** была объявлена переменная **var**
59 | - **get parent var** – результат запроса к пространству, внутри которого было создано пространство **namespace**, если переменная не была объявлена
60 | - **None**, если не существует parent, т. е. **namespace** – это **global**
61 |
62 | **Формат входных данных**
63 |
64 | В первой строке дано число **n (1 ≤ n ≤ 100)** – число запросов.
65 | В каждой из следующих n строк дано по одному запросу.
66 | Запросы выполняются в порядке, в котором они даны во входных данных.
67 | Имена пространства имен и имена переменных представляют из себя строки длины не более **10**, состоящие из строчных латинских букв.
68 |
69 | **Формат выходных данных**
70 |
71 | Для каждого запроса **get** выведите в отдельной строке его результат.
72 |
73 | ---
74 |
75 | **Sample Input**:
76 |
77 | ```
78 | 9
79 | add global a
80 | create foo global
81 | add foo b
82 | get foo a
83 | get foo c
84 | create bar foo
85 | add bar a
86 | get bar a
87 | get bar b
88 | Sample Output:
89 | global
90 | None
91 | bar
92 | foo
93 | ```
94 |
95 | ---
96 |
97 | **Sample Output**:
98 |
99 | ```
100 | global
101 | None
102 | bar
103 | foo
104 | ```
105 |
106 | # Решение
107 |
108 | ```
109 | n = int(input())
110 | scopes = {'global': {'funcs': [], 'vars': []}}
111 |
112 | def add(scopes, current_namespace, what):
113 | if current_namespace not in scopes:
114 | scopes[current_namespace] = {}
115 | scopes[current_namespace]['vars'] = []
116 | scopes[current_namespace]['vars'].append(what)
117 | else:
118 | if 'vars' not in scopes[current_namespace]:
119 | scopes[current_namespace]['vars'] = []
120 | scopes[current_namespace]['vars'].append(what)
121 | else:
122 | scopes[current_namespace]['vars'].append(what)
123 |
124 | def create(scopes, current_namespace, parent_namespace):
125 | if current_namespace not in scopes:
126 | scopes[current_namespace] = {}
127 | scopes[current_namespace]['funcs'] = []
128 | scopes[current_namespace]['vars'] = []
129 | scopes[parent_namespace]['funcs'].append(current_namespace)
130 | scopes[current_namespace]['parent'] = parent_namespace
131 | else:
132 | if 'funcs' not in scopes[current_namespace]:
133 | scopes[current_namespace]['funcs'] = []
134 | scopes[current_namespace]['parent'] = parent_namespace
135 | scopes[parent_namespace]['funcs'].append(current_namespace)
136 | else:
137 | scopes[current_namespace]['funcs'].append(current_namespace)
138 | scopes[parent_namespace]['funcs'].append(current_namespace)
139 |
140 | def search(scopes, namespace, what):
141 | if what in scopes[namespace]['vars']:
142 | return namespace
143 | else:
144 | try:
145 | upper_namespace = scopes[namespace]['parent']
146 | except KeyError:
147 | return None
148 | return search(scopes, upper_namespace, what)
149 |
150 | for i in range(n):
151 | command = input().split()
152 | if command[0] == 'add':
153 | add(scopes, command[1], command[2])
154 | elif command[0] == 'create':
155 | create(scopes, command[1], command[2])
156 | elif command[0] == 'get':
157 | print(search(scopes, command[1], command[2]))
158 | ```
159 |
--------------------------------------------------------------------------------