commit c3fa5367c3b92e14170e7f1a3fd6ef18b527e8dd Author: StNicolay Date: Sun Jul 16 13:23:25 2023 +0000 initial commit diff --git a/C++/.vscode/settings.json b/C++/.vscode/settings.json new file mode 100644 index 0000000..318dce3 --- /dev/null +++ b/C++/.vscode/settings.json @@ -0,0 +1,50 @@ +{ + "files.associations": { + "algorithm": "cpp", + "iostream": "cpp", + "numeric": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "compare": "cpp", + "concepts": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "vector": "cpp", + "exception": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "random": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "limits": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "typeinfo": "cpp", + "ctime": "cpp", + "cstring": "cpp" + } +} \ No newline at end of file diff --git a/C++/C++.md b/C++/C++.md new file mode 100644 index 0000000..f2639a4 --- /dev/null +++ b/C++/C++.md @@ -0,0 +1,547 @@ +# УДАЧИ НАМ + +## Statement + +> Наименьшая независимая еденица в языке C++ + +### Основные + +* declaration: + + ```C++ + int i; + ``` + +* assigment : + + ```C++ + i = 5; + ``` + +* Output (хоть Коля и не согласен, что это основной) + + ```C++ + std::cout << i; + ``` + +declaration и assigment можно вместе + +```C++ +int i = 5; +``` + +## Expression + +> Любое выражение: число, строка, вызов функции, мат(на английском). выражения + +## Функции + +> Последовательность statement'ов. Исполнение начинается с функции main() + +## Библиотеки + +> Набор скомпилированного кода, для использования в других программах + +### Примеры библиотек + +* iostream - для ввода / вывода + +## Коментарии + +* Однострочные + + ```C++ + // Коментарий + ``` + +* Многострочные + + ```C++ + /* Длинный + Коментарий */ + ``` + +## Пример простой программы + +```C++ +#include + +int main() { + std::cout << "Hello, world!\n"; +} +``` + +## Переменные + +> В C++ есть переменные, они жрут оперативку + +* Копирующая инициализация + +```C++ +int val = 5; +``` + +* Прямая инициализация + +```C++ +int val(5); +``` + +### Неинициализированные переменные + +> Неинициализированные переменные могут иметь в себе мусор, что может привести к ошибкам + +### Инициализация и объявление нескольких переменных + +```C++ +int a, b; +``` + +```C++ +int a = 5, b = 6; +``` + +## Типы данных + +* void - ничего + +### Числа + +* short - число 16 бит +* int - число 16 или 32 бита +* long - число 32 бита +* long long - число 64 бита +* char - число или символ. 8 бит + +#### Отрицательные числа + +* signed - может быть отрицательным (по умолчанию, кроме char) +* unsigned - число не отрицательно + +#### Переполнение + +* Переполнение случается при потере бит из-за того, что значение после операции выходит за границу их значений + +65635 как unsigned int + 1 выдаст 0 + +#### Целочисленное деление + +Деление двух цилочисленных значений всегда выдаёт целое число (округление вниз) + +### Символьные тип char + +char представляет собой 1 символ (не всегда) и всегда весит 1 байт. + +Для инициализации char символом используется *одинарные* ковычки + +### Строки + +Для строк используется библиотека string. Строки указываются в двойных ковычках + +### Типы данных с плавающией точкой + +Типы с плавающей могут показывать дробные числа + +* float - 32 бита +* double - 64 бита (двойная точность по сравнению с float) +* long double - от 8 до 16 байт (зависит от компилятора) + +### Логические значения + +* true +* false + +## Константы + +> Величины, которые остаются неизменными. Они должны быть инициализированны при объявлении + +## IOSTREAM + +### Подключение IOSTREAM + +```C++ +#include ; +``` + +### *cout* + +> *cout* - объект для вывода в терминал + +```C++ +#include ; + +std::cout << 5 << '\n'; +``` + +### *endl* + +> endl можно использовать как '\n' + +```C++ +#include ; + +std::cout << 5 << std::endl; +``` + +### *cin* + +> cin используется для ввода значений из терминала + +```C++ +#include ; + +int a = 0; +std::cin >> a; +``` + +## Ветвление + +```C++ +#include ; + +int a = 5; +if (a == 5) { + std::cout << 5 << '\n'; +} else if (a == 6) { + std::cout << 6 << '\n'; +} else { + std::cout << "Neither\n"; +} +``` + +### Логические операторы + +* && - и +* || - или +* ! - не + +## Циклы + +### Цикл for + +> for (инициализация; условие; изменение) + +```C++ +#include ; + +// Выводит числа от 0 до 5 включительно +for (int i = 0; i <= 5; i++) { + std::cout << i << '\n'; +} +``` + +### Цикл while (с пред условием) + +```C++ +#include ; + +// Аналогичен коду сверху +int i = 0; +while (i <= 5) { + std::cout << i << '\n'; + i++; +} +``` + +### Цикл do while + +> Цикл do while выполнит тело хотя бы один раз, даже если условие изначально false + +```C++ +#include ; + + +// Выведет 0 (не смотря на то, что 0 чётное) и 1 +int i = 0 +do { + std::cout << i << '\n'; + i++; +} while (i % 2 != 0) +``` + +### Операторы прерывания + +* *break* +* *continue* + +Они аналогичны оным из Python + +## switch + +```C++ +int a = 5; +switch(a){ + case 1: + std::cout << "1" << '\n'; + break; + case 2: + std::cout << "2" << '\n'; + break; + default: + std::cout << "Other" << '\n'; + break; +} +``` + +## Goto + +> Goto позволяет перейти к исполнению другого блока кода. Если будете его использовать, то придёт страшный Николай и даст по рукам книжкой о правильном написании кода + +```C++ +mark: + // do-something + +// 1 eternity later (возможно даже в другой функции) + +goto mark; +``` + +## Массивы + +> Структура данных позволяющая хранить набор элементов одного типа. Объявление состоит из указания типа и размерности. Массивы в C++ имеют нумерацию элементов, начинающуюся с 0 + +### Объявление массива + +```C++ +int number[5]; // пять интов. Массив называется numbers +char chars[20]; +bool flags[3]; +``` + +### Инициализация массива + +```C++ +int numbers[3] = {10, 20, 30}; +int foo[] = {10, 20, 30}; // Тоже будет на 3 элемента +int bar[10] = {10, 20, 30} // Оставшиеся 8 не инициализированны +``` + +### Обход массива + +```C++ +#include + +int numbers[] = {10, 20, 30} + +for (int i = 0; i < 3; i++) { + std::cout << i << '\n'; +} +``` + +### Размер массива + +```C++ +int arr[5]; + +int n = sizeof(arr) / sizeof(int); // n - длинна массива +``` + +### Многомерные массивы + +```C++ +#include + +int arr[2][2] = {{10, 20}, {30, 40}}; +for (int i = 0; i < 2; i++) { + for (int j = 0; j < 2; j++) { + std::cout << arr[i][j] << '\n'; + } +} +``` + +### Динамический массив + +> Массив, размер которого может быть указан в runtime. Ключевое слово *new* используется для создания, a *delete* для освобождения памяти. + +```C++ +int* dynamic_array = new int[5]; // dynamic_array - список из 5 чисел +delete[] dynamic_array; +``` + +```C++ +#include + +int n; +std::cin >> n; +int* nums = new int[n]; + +for (int i = 0; i < n; i++) { + std::cin >> nums[i]; +} + +for (int i = 0; i < n; i ++) { + std::cout << nums[i] << ' '; +} +std::cout << std::endl; + +delete[] nums; +``` + +## Процедуры и функции + +> Процедуры - функции, которые возвращают void + +```C++ +#include + +// Функция, возвращает int который получила +int foo(int n) { + return n; +} + +// Процедура +void bar(int n) { + std::cout << n << '\n'; +} +``` + +### Передача значений в функцию + +> При передаче аргумента, как значения, создаётся его копия, а при передаче по ссылки, копия не создаётся и может менять его + +```C++ +#include + +void increment1(int i) { + i++; + std::cout << i << '\n'; +} + +void increment2(int& i) { + i++; + std::cout << i << '\n'; +} + +int main() { + int i = 5; + increment1(i) // Выведет 6, но i останется 5 + increment2(i) // Выведет 6, и i станет 6 +} +``` + +### Передача массивов в функцию + +> При передаче массивов в функцию, нужно кинуть туда ещё и длину. Функция может менять оригинальный массив. Копия не создаётся + +```C++ +#include + +void foo(int bar[], int size) { + if (size >= 1) { + std::cout << bar[1] << '\n'; + } else { + std::cout << "Not enough elements\n"; + } +} +``` + +## Ссылки и указатели + +> *Ссылка* (*reference*) - псевдоним джя существующей переменной. Может иметь не валидный адрес или быть не инициализированной + +```C++ +int a = 5; +int& b = a; // При изменении b, будет меняться a +b++; // a и b станут 6 +``` + +> Указатель (*pointer*) содержит адрес существующей переменной + +```C++ +int a = 5; +int* b = &a; // При изменении b, будет меняться a +(*b)++ // a станет равна 6 +``` + +## Строки (углубление) + +```C++ +#include +#include + +int main() { + std::string a = "abc"; + + // b - копия a + std::string b = a; + + // c содержит 'c' + сhar c = a[2]; + + // последний символ a стал z + a[2] = 'z' +} +``` + +### Перебор символов + +```C++ +#include + +std::string a = "abc" +for (char c: a) { + std::cout << c << '\n'; +} + +for (int i = 0; i < a.length(); i++) { + std::cout << a[i] << '\n'; +} +``` + +### Ввод строки с клавиатуры + +```C++ +#include +#include + +std::string str; +// Ввести 1 слово +std::cin >> str; + +// Ввести строку +std::getLine(std::cin, str); +``` + +### Полезные методы строк + +* length(), size() - длина строки +* substr(start,length) - извлекает часть строки +* find(substring) - первое вхождение +* replace(oldString, NewString) - заменяет все вхождения из старой в новую строку (ничего не возвращает, изменения на месте) +* toupper(), tolower() - меняет регистр соответсвенно названию +* empty() - проверяет пустая ли строка +* compare() -сравнивает две строки. Возвращает 0, если строкми одинаковые. +* insert(index,string) - вставляет строку в указанную позицию. +* erase(start,length) - удалает часть строки + +### Полезные функции для строк + +* getLine(inputStream, string) - считывает строку из потока и тсохраняет в переменную str + +## Способы передачи аргументов в функию + +* по значению (pass by value) - создание копии + * Изначальное не меняется + * Создание копии может занимать много времени + * Используется для передачи примитивов +* по сслылке (pass by reference) - передача в функцию указатель на объект + * Изначальное значение может меняться + * Копия не создаётся + * Используется для составных типов и больших объектов +* Передача по указателю (pass by pointer) - pass by reference без кучки синтактического сахара + Разименование - операция, которая позволяет получить доступ к значению, на которое указывает pointer.(*) + +```C++ +void boo(int* ptr) { + (*ptr)++; +} +``` + +## Возврат значений из функции + +* Возврат по значению return +* Важно не вернуть ссылку или указатель на локальную переменную + +## Структуры + +> Структура - тип данных, позоляющий объединить несколько переменных в одной еденице. diff --git a/C++/THE_HARDEST_TASK.CPP b/C++/THE_HARDEST_TASK.CPP new file mode 100644 index 0000000..9294ecb --- /dev/null +++ b/C++/THE_HARDEST_TASK.CPP @@ -0,0 +1,11 @@ +#include + +int main() { + int i = 2; +mark: + std::cout << i << '\n'; + if (i < 50) { + i += 2; + goto mark; + } +} diff --git a/C++/a.out b/C++/a.out new file mode 100755 index 0000000..319eb96 Binary files /dev/null and b/C++/a.out differ diff --git a/C++/lesson1/task1.cpp b/C++/lesson1/task1.cpp new file mode 100644 index 0000000..232cc7d --- /dev/null +++ b/C++/lesson1/task1.cpp @@ -0,0 +1,5 @@ +#include + +int main() { + std::cout << "Hello, world!\n"; +} diff --git a/C++/lesson1/task2.cpp b/C++/lesson1/task2.cpp new file mode 100644 index 0000000..15355b1 --- /dev/null +++ b/C++/lesson1/task2.cpp @@ -0,0 +1,9 @@ +#include +#include + +int main() { + std::string a = "Hello"; + std::string b = "Привет"; + std::cout << a.length() << '\n'; + std::cout << b.length() << '\n'; +} diff --git a/C++/lesson1/task3.cpp b/C++/lesson1/task3.cpp new file mode 100644 index 0000000..6457884 --- /dev/null +++ b/C++/lesson1/task3.cpp @@ -0,0 +1,17 @@ +#include + +int main() { + int min = 6; + for (int i = 0; i < 5; i++) { + int value; + std::cin >> value; + if (value < min) { + min = value; + } + } + if (min < 4) { + std::cout << "Could be better\n"; + } else { + std::cout << "Great!\n"; + } +} diff --git a/C++/lesson1/task4.cpp b/C++/lesson1/task4.cpp new file mode 100644 index 0000000..6ef296d --- /dev/null +++ b/C++/lesson1/task4.cpp @@ -0,0 +1,21 @@ +#include +#include + +using namespace std; + +int main() { + int age1 = 1; + int age2 = 1; + int age3 = 1; + int weight1 = 4; + int weight2 = 4; + int weight3 = 1; + string color1 = "g"; + string color2 = "r"; + string color3 = "y"; + if (age1 == age2 && age2 == age3 && weight1 == weight2 && weight2 == weight3 && !(color1 == color2 && color2 == color3)) { + cout << "YES\n"; + } else { + cout << "NO\n"; + } +} diff --git a/C++/lesson1/task5.cpp b/C++/lesson1/task5.cpp new file mode 100644 index 0000000..0e91173 --- /dev/null +++ b/C++/lesson1/task5.cpp @@ -0,0 +1,13 @@ +#include + +int main() { + float age; + std::cin >> age; + if (age <= 1) { + std::cout << "Молодая\n"; + } else if (age <= 5) { + std::cout << "Взрослая\n"; + } else { + std::cout << "Старая\n"; + } +} diff --git a/C++/lesson1/task6.cpp b/C++/lesson1/task6.cpp new file mode 100644 index 0000000..6a3a90a --- /dev/null +++ b/C++/lesson1/task6.cpp @@ -0,0 +1,20 @@ +#include + +int main() { + int a; + std::cin >> a; + switch (a) { + case 1: + std::cout << "Дизайн\n"; + break; + case 2: + std::cout << "Программирование\n"; + break; + case 3: + std::cout << "Веб\n"; + break; + case 4: + std::cout << "Сис-админ\n"; + break; + } +} \ No newline at end of file diff --git a/C++/lesson2/task1.cpp b/C++/lesson2/task1.cpp new file mode 100644 index 0000000..78d6c16 --- /dev/null +++ b/C++/lesson2/task1.cpp @@ -0,0 +1,13 @@ +#include + +int main() { + int num; + + std::cin >> num; + + for (int i = num; i >= 1; i--) { + if (i % 3 == 0) { + std::cout << i << '\n'; + } + } +} diff --git a/C++/lesson2/task10.cpp b/C++/lesson2/task10.cpp new file mode 100644 index 0000000..8998fae --- /dev/null +++ b/C++/lesson2/task10.cpp @@ -0,0 +1,17 @@ +#include +#include + +int main() { + std::string value = std::string(); + std::cin >> value; + int offset; + std::cin >> offset; + offset = offset % 26 - 'A'; + for (char& c : value) { + if (c > 'Z' || c < 'A') { + continue; + } + c = (c + offset) % 26 + 'A'; + } + std::cout << value << '\n'; +} diff --git a/C++/lesson2/task2.cpp b/C++/lesson2/task2.cpp new file mode 100644 index 0000000..d98f7ec --- /dev/null +++ b/C++/lesson2/task2.cpp @@ -0,0 +1,14 @@ +#include + +int main() { + unsigned sum = 0; + while (true) { + int i; + std::cin >> i; + if (i < 0) { + break; + } + sum += i; + } + std::cout << sum << '\n'; +} diff --git a/C++/lesson2/task3.cpp b/C++/lesson2/task3.cpp new file mode 100644 index 0000000..55a4349 --- /dev/null +++ b/C++/lesson2/task3.cpp @@ -0,0 +1,12 @@ +#include + +int main() { + const int days[]{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + int month; + std::cin >> month; + if (month <= 0 || month > 12) { + std::cout << "You are a bad person!\n"; + return 0; + } + std::cout << days[month - 1] << '\n'; +} diff --git a/C++/lesson2/task4.cpp b/C++/lesson2/task4.cpp new file mode 100644 index 0000000..77b2712 --- /dev/null +++ b/C++/lesson2/task4.cpp @@ -0,0 +1,17 @@ +#include + +int main() { + int sum = 0; + int num; + std::cin >> num; + if (num < 0) { + std::cout << "You are a bad person!\n"; + return 0; + } + while (num != 0) { + int digit = num % 10; + num /= 10; + sum += digit; + } + std::cout << sum << '\n'; +} diff --git a/C++/lesson2/task5.cpp b/C++/lesson2/task5.cpp new file mode 100644 index 0000000..bdaf7e9 --- /dev/null +++ b/C++/lesson2/task5.cpp @@ -0,0 +1,21 @@ +#include +#include + +int main() { + int a, b; + std::cin >> a; + std::cin >> b; + std::cout << std::lcm(a, b) << '\n'; + // int guess; + // if (a > b) { + // guess = a; + // } else { + // guess = b; + // } + // for (;; guess++) { + // if (guess % a == 0 && guess % b == 0) { + // std::cout << guess << '\n'; + // break; + // } + // } +} diff --git a/C++/lesson2/task6.cpp b/C++/lesson2/task6.cpp new file mode 100644 index 0000000..373972a --- /dev/null +++ b/C++/lesson2/task6.cpp @@ -0,0 +1,27 @@ +#include +#include +#include + +int main() { + int n; + std::cin >> n; + if (n < 0) { + std::cout << "You are a bad person!\n"; + return 0; + } + std::vector values(n + 1, true); + int root = sqrt(n); + for (unsigned int i = 2; i <= root; i++) { + if (values[i]) { + std::cout << i << '\n'; + for (int j = i * i; j <= n; j += i) { + values[j] = false; + } + } + } + for (int i = root + 1; i <= n; i++) { + if (values[i]) { + std::cout << i << '\n'; + } + } +} diff --git a/C++/lesson2/task7.cpp b/C++/lesson2/task7.cpp new file mode 100644 index 0000000..c6b476a --- /dev/null +++ b/C++/lesson2/task7.cpp @@ -0,0 +1,21 @@ +#include +#include + +int main() { + std::string value = std::string(); + value.reserve(9); + for (int count = 4; count >= 0; count--) { + value.clear(); + for (int j = 0; j < count; j++) { + value.push_back(' '); + } + int limit = 9 - count * 2; + for (int j = 0; j < limit; j++) { + value.push_back('*'); + } + for (int j = 0; j < count; j++) { + value.push_back(' '); + } + std::cout << value << '\n'; + } +} \ No newline at end of file diff --git a/C++/lesson2/task8.cpp b/C++/lesson2/task8.cpp new file mode 100644 index 0000000..4a9edc5 --- /dev/null +++ b/C++/lesson2/task8.cpp @@ -0,0 +1,36 @@ +#include +#include + +int main() { + int height; + std::cin >> height; + std::string value = std::string(); + for (int count = height - 1; count >= 0; count--) { + value.clear(); + for (int j = 0; j < count; j++) { + value.push_back(' '); + } + int limit = height * 2 - 1 - count * 2; + for (int j = 0; j < limit; j++) { + value.push_back('*'); + } + for (int j = 0; j < count; j++) { + value.push_back(' '); + } + std::cout << value << '\n'; + } + for (int count = 1; count < height; count++) { + value.clear(); + for (int j = 0; j < count; j++) { + value.push_back(' '); + } + int limit = height * 2 - 1 - count * 2; + for (int j = 0; j < limit; j++) { + value.push_back('*'); + } + for (int j = 0; j < count; j++) { + value.push_back(' '); + } + std::cout << value << '\n'; + } +} diff --git a/C++/lesson2/task9.cpp b/C++/lesson2/task9.cpp new file mode 100644 index 0000000..7c982cf --- /dev/null +++ b/C++/lesson2/task9.cpp @@ -0,0 +1,23 @@ +#include + +int main() { + unsigned int sum = 0; + while (true) { + int num; + std::cin >> num; + if (num == 0) { + break; + } + if (num < 0) { + std::cout << "You are a bad person!\n"; + return 0; + } + sum += num; + } + if (sum > 1000) { + sum += sum * 2 / 10; + } else if (sum < 500) { + sum -= sum / 10; + } + std::cout << sum << '\n'; +} diff --git a/C++/lesson3/task0.cpp b/C++/lesson3/task0.cpp new file mode 100644 index 0000000..f42d8d9 --- /dev/null +++ b/C++/lesson3/task0.cpp @@ -0,0 +1,18 @@ +#include + +int main() { + int n; + std::cin >> n; + int* nums = new int[n]; + + for (int i = 0; i < n; i++) { + std::cin >> nums[i]; + } + + for (int i = 0; i < n; i++) { + std::cout << nums[i] << ' '; + } + std::cout << std::endl; + + delete[] nums; +} diff --git a/C++/lesson3/task1.cpp b/C++/lesson3/task1.cpp new file mode 100644 index 0000000..a311886 --- /dev/null +++ b/C++/lesson3/task1.cpp @@ -0,0 +1,18 @@ +#include + +int main() { + int a[10] = {11, 34, 32, 5, 86, 34, 123, 456, 148, 3456}; + int min = a[0]; + int max = a[0]; + + for (int i = 0; i < 10; i++) { + if (a[i] < min) { + min = a[i]; + } + if (a[i] > max) { + max = a[i]; + } + } + std::cout << min << "\n"; + std::cout << max << "\n"; +} diff --git a/C++/lesson3/task2.cpp b/C++/lesson3/task2.cpp new file mode 100644 index 0000000..23f2a7e --- /dev/null +++ b/C++/lesson3/task2.cpp @@ -0,0 +1,19 @@ +#include +#include +#include + +int main() { + int nums[10]; + std::srand(std::time(NULL)); + for (int i = 0; i < 10; i++) { + nums[i] = rand() % 100 + 1; + } + + int sum = 0; + + for (int i = 0; i < 10; i++) { + sum += nums[i]; + } + + std::cout << sum / 10 << '\n'; +} diff --git a/C++/lesson3/task3.cpp b/C++/lesson3/task3.cpp new file mode 100644 index 0000000..ffd326e --- /dev/null +++ b/C++/lesson3/task3.cpp @@ -0,0 +1,20 @@ +#include + +int main() { + int n; + std::cin >> n; + + int* nums = new int[n]; + for (int i = 0; i < n; i++) { + std::cin >> nums[i]; + } + + int sum = 0; + + for (int i = 0; i < n; i++) { + sum += nums[i]; + } + + std::cout << sum << '\n'; + delete[] nums; +} diff --git a/C++/lesson3/task4.cpp b/C++/lesson3/task4.cpp new file mode 100644 index 0000000..1140125 --- /dev/null +++ b/C++/lesson3/task4.cpp @@ -0,0 +1,26 @@ +#include + +int main() { + int n; + std::cin >> n; + int a[n][n]; + + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + a[i][j] = i * j; + std::cout << a[i][j] << " "; + } + std::cout << "\n"; + } + + int s = 0; + + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + s += a[i][j]; + } + int avg = s / n; + std::cout << avg << "\n"; + s = 0; + } +} \ No newline at end of file diff --git a/C++/lesson3/task5.cpp b/C++/lesson3/task5.cpp new file mode 100644 index 0000000..8579711 --- /dev/null +++ b/C++/lesson3/task5.cpp @@ -0,0 +1,23 @@ +#include + +int main() { + int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + std::cout << a[i][j] << ' '; + } + std::cout << '\n'; + } + + std::cout << '\n'; + + std::swap(a[0], a[2]); + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + std::cout << a[i][j] << ' '; + } + std::cout << '\n'; + } +} diff --git a/C++/lesson3/task6.cpp b/C++/lesson3/task6.cpp new file mode 100644 index 0000000..3a70a87 --- /dev/null +++ b/C++/lesson3/task6.cpp @@ -0,0 +1,22 @@ +#include + +void bubbleSort(int data[], int lenD) { + int tmp = 0; + for (int i = 0; i < lenD; i++) { + for (int j = (lenD - 1); j >= (i + 1); j--) { + if (data[j] < data[j - 1]) { + tmp = data[j]; + data[j] = data[j - 1]; + data[j - 1] = tmp; + } + } + } +} + +int main() { + int a[3] = {1, 3, 5}; + int b[3] = {0, 2, 4}; + + int c[6]; + for (int) +} diff --git a/C++/lesson4/task1.cpp b/C++/lesson4/task1.cpp new file mode 100644 index 0000000..6910456 --- /dev/null +++ b/C++/lesson4/task1.cpp @@ -0,0 +1,13 @@ +#include + +void increment(int& num) { + num++; + std::cout << "Inside function: " << num << "\n"; +} + +int main() { + int x = 5; + increment(x); + std::cout << "Outside function: " << x << "\n"; + return 0; +} diff --git a/C++/lesson4/task2.cpp b/C++/lesson4/task2.cpp new file mode 100644 index 0000000..5f022ac --- /dev/null +++ b/C++/lesson4/task2.cpp @@ -0,0 +1,11 @@ +#include + +void foo(int* bar) { + (*bar)++; +} + +int main() { + int a[3] = {10, 20, 300}; + foo(a); + std::cout << a[0]; +} diff --git a/C++/lesson4/task3.cpp b/C++/lesson4/task3.cpp new file mode 100644 index 0000000..3d5ab80 --- /dev/null +++ b/C++/lesson4/task3.cpp @@ -0,0 +1,14 @@ +#include +#include + +int main() { + std::string s; + std::getline(std::cin, s); + unsigned count = 1; + for (char c : s) { + if (c == ' ') { + count++; + } + } + std::cout << count << '\n'; +} \ No newline at end of file diff --git a/C++/lesson4/task4.cpp b/C++/lesson4/task4.cpp new file mode 100644 index 0000000..23f805d --- /dev/null +++ b/C++/lesson4/task4.cpp @@ -0,0 +1,17 @@ +#include +#include + +int main() { + const std::string vovels = "aeiouAEIOU"; + std::string s; + std::getline(std::cin, s); + unsigned count = 0; + + for (char c : s) { + if (vovels.find(c) != std::string::npos) { + count++; + } + } + + std::cout << count << '\n'; +} diff --git a/C++/lesson4/task5.cpp b/C++/lesson4/task5.cpp new file mode 100644 index 0000000..7e598aa --- /dev/null +++ b/C++/lesson4/task5.cpp @@ -0,0 +1,11 @@ +#include +#include + +int main() { + std::string s; + std::string sf; + std::string sr; + std::getline(std::cin, s); + std::getline(std::cin, sf); + std::getline(std::cin, sr); +} diff --git a/C++/lesson4/task6.cpp b/C++/lesson4/task6.cpp new file mode 100644 index 0000000..0a62ecd --- /dev/null +++ b/C++/lesson4/task6.cpp @@ -0,0 +1,16 @@ +#include +#include + +int main() { + std::string s; + std::string r; + + std::getline(std::cin, s); + r.reserve(s.length()); + + for (int i = s.length() - 1; i >= 0; i--) { + r.push_back(s[i]); + } + + std::cout << r << '\n'; +} \ No newline at end of file diff --git a/C++/lesson4/task7.cpp b/C++/lesson4/task7.cpp new file mode 100644 index 0000000..b04623c --- /dev/null +++ b/C++/lesson4/task7.cpp @@ -0,0 +1,20 @@ +#include +#include + +int main() { + std::string s; + std::string f; + std::string r; + + std::getline(std::cin, s); + std::getline(std::cin, f); + std::getline(std::cin, r); + + size_t pos = s.find(f); + while (pos != std::string::npos) { + s.replace(pos, f.length(), r); + pos = s.find(f); + } + + std::cout << s << '\n'; +} \ No newline at end of file diff --git a/C++/lesson5/task1.cpp b/C++/lesson5/task1.cpp new file mode 100644 index 0000000..73948ee --- /dev/null +++ b/C++/lesson5/task1.cpp @@ -0,0 +1,14 @@ +#include +#include + +void addOne(int &x) { + x = x + 1; +} + +int main() { + int a = 7; + std::cout << "a = " << a << '\n'; + addOne(a); + std::cout << "a = " << a << '\n'; + return 0; +} \ No newline at end of file diff --git a/C++/lesson5/task2.cpp b/C++/lesson5/task2.cpp new file mode 100644 index 0000000..729321b --- /dev/null +++ b/C++/lesson5/task2.cpp @@ -0,0 +1,16 @@ +#include +#include + +void boo(int *ptr) { + *ptr = 7; +} + +int main(){ + + int value = 4; + + std::cout << "value = " << value << '\n'; + boo(&value); + std::cout << "value = " << value << '\n'; + return 0; +} \ No newline at end of file diff --git a/C++/lesson7/task1.cpp b/C++/lesson7/task1.cpp new file mode 100644 index 0000000..8603bf9 --- /dev/null +++ b/C++/lesson7/task1.cpp @@ -0,0 +1,30 @@ +#include +#include + +struct Good { + std::string name; + unsigned cost; + unsigned amount; + + Good(std::string name, unsigned cost, unsigned amount) { + this->name = name; + this->cost = cost; + this->amount = amount; + } + + void information() { + std::cout << '(' << name << ',' << cost << ',' << amount + << ")\n"; + } + + void changeCost(unsigned cost) { + this->cost = cost; + } +}; + +int main() { + Good apple("Apple", 10, 20); + apple.information(); + apple.changeCost(20); + apple.information(); +} diff --git a/C++/lesson7/task8.cpp b/C++/lesson7/task8.cpp new file mode 100644 index 0000000..fa18c0e --- /dev/null +++ b/C++/lesson7/task8.cpp @@ -0,0 +1,43 @@ +#include +#include + +enum EventKind { + Lesson, + Meeting, + Celebration +}; + +struct Event { + std::string name; + std::string time; + std::string date; + EventKind kind; + + Event(std::string name, std::string time, std::string date, EventKind kind) { + this->name = name; + this->time = time; + this->date = date; + this->kind = kind; + } + + void information() { + std::cout + << '(' << name << ',' << time << ',' << date << ',' << kind << ')' << '\n'; + } + + ~Event() { + std::cout + << '(' << name << ',' << time << ',' << date << ',' << kind << ')' << " was deleted\n"; + } +}; + +void display_events(Event events[], size_t length) { + for (size_t i = 0; i < length; i++) { + events[i].information(); + } +}; + +int main() { + Event m[3] = {Event("NewYear", "00:00", "31:12:2023", Celebration), Event("Breefing", "17:00", "15:06:2023", Meeting), Event("AI", "10:00", "03:07:2023", Lesson)}; + display_events(m, 3); +} diff --git a/C++/lesson7/task9.cpp b/C++/lesson7/task9.cpp new file mode 100644 index 0000000..9edd34c --- /dev/null +++ b/C++/lesson7/task9.cpp @@ -0,0 +1,160 @@ +#include +#include +#include + +class Book { + int id; + std::string name; + std::string writer; + std::string year; + + public: + Book() {} + + Book(unsigned id, std::string name, std::string writer, std::string year) { + this->id = id; + this->name = name; + this->writer = writer; + this->year = year; + } + + std::string& get_name() { + return name; + } + std::string& get_writer() { + return writer; + } + std::string& get_year() { + return year; + } + + void setname(std::string name) { + this->name = name; + } + void setwriter(std::string writer) { + this->name = name; + } + void setyear(std::string year) { + this->name = name; + } +}; + +class Reader { + std::string name; + unsigned number; + + public: + Reader() {} + + Reader(std::string name, unsigned number) { + this->name = name; + this->number = number; + } + + std::string& getName() { + return name; + } + + unsigned getNumber() { + return number; + } + + void setName(std::string name) { + this->name = name; + } + + void setNumber(unsigned number) { + this->number = number; + } +}; + +class Library { + public: + Reader* readers; + size_t amount_readers; + Book* books; + size_t amount_books; + + Library() { + readers = new Reader[0]; + amount_readers = 0; + books = new Book[0]; + amount_books = 0; + } + + void addReader(Reader reader) { + Reader* new_readers = new Reader[amount_readers + 1]; + for (size_t i = 0; i < amount_readers; i++) { + new_readers[i] = readers[i]; + } + new_readers[amount_readers] = reader; + delete[] readers; + readers = new_readers; + amount_readers++; + } + + void addBook(Book book) { + Book* new_books = new Book[amount_books + 1]; + for (size_t i = 0; i < amount_books; i++) { + new_books[i] = books[i]; + } + new_books[amount_books] = book; + delete[] books; + books = new_books; + amount_books++; + } + + Book deleteBook(size_t n) { + Book* new_books = new Book[amount_books - 1]; + + for (size_t i = 0; i < n; i++) { + new_books[i] = books[i]; + } + + for (size_t j = n + 1; j < amount_books; j++) { + new_books[j - 1] = books[j]; + } + Book deleted = books[n]; + delete[] books; + books = new_books; + amount_books -= 1; + return deleted; + } + + Book takeBook(size_t n) { + Book taken = this->deleteBook(n); + std::cout << "Book" << taken.get_name() << "is taken\n"; + return taken; + } + + void returnBook(Book book) { + std::cout << "Book" << book.get_name() << "is returned\n"; + this->addBook(book); + } +}; + +int main() { + Book WarAndPeace(0, "WarAndPeace", "Tolstoy", "1867"); + Book EugeneOnegin(1, "EugeneOnegin", "Pushkin", "1832"); + Book HeroOfOurTime(2, "HeroOfOurTime", "Lemontov", "1840"); + Book PortraitOfDorianGray(3, "PortraitOfDorianGray", "Wilde", "1890"); + + Library library; + library.addBook(WarAndPeace); + library.addBook(EugeneOnegin); + library.addBook(HeroOfOurTime); + library.addBook(PortraitOfDorianGray); + + Reader petya("Petya", 0); + Reader vasya("Vasya", 1); + library.addReader(petya); + library.addReader(vasya); + + Book book1 = library.takeBook(0); + Book book2 = library.takeBook(0); + + library.returnBook(book1); + library.returnBook(book2); + + library.takeBook(3); +} \ No newline at end of file diff --git a/C++/lesson8/ex5.cpp b/C++/lesson8/ex5.cpp new file mode 100644 index 0000000..970b661 --- /dev/null +++ b/C++/lesson8/ex5.cpp @@ -0,0 +1,105 @@ +#include +#include + +class Character { + public: + std::string name; + int level; + int exp; + int health; + int attack; + int protection; + + Character(std::string name) { + this->name = name; + level = 0; + exp = 0; + health = 10; + attack = 2; + protection = 2; + } + + void levelUp() { + level++; + health += 5; + attack++; + protection++; + } + + void gainExp(int amount) { + exp += amount; + } + + int getHelth() { + return health; + } + + int getLevel() { + return level; + } + + bool isAlive() { + return health > 0; + } + + void attack_character(Character& target) { + if (target.protection == 0) { + target.health -= attack; + std::cout << target.name << " was attacked\n"; + } else { + target.protection--; + std::cout << target.name << " has protection\n"; + } + } +}; + +int main() { + Character vasiya("Вася"); + Character petyia("Петя"); + + vasiya.levelUp(); + vasiya.levelUp(); + vasiya.levelUp(); + + petyia.levelUp(); + petyia.levelUp(); + + vasiya.attack_character(petyia); + vasiya.attack_character(petyia); + + petyia.attack_character(vasiya); + petyia.attack_character(vasiya); + + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + vasiya.attack_character(vasiya); // Вася не умный + + if (vasiya.isAlive()) { + std::cout << "Вася как-то выжил\n"; + } else { + std::cout << "Вася умер\n"; + } + + if (petyia.isAlive()) { + std::cout << "Петя как-то выжил\n"; + } else { + std::cout << "Петя умер\n"; + } +} diff --git a/C++/lesson8/ex7.cpp b/C++/lesson8/ex7.cpp new file mode 100644 index 0000000..e2ce575 --- /dev/null +++ b/C++/lesson8/ex7.cpp @@ -0,0 +1,162 @@ +#include +#include + +class Passenger { + std::string firstName; + std::string lastName; + int passportNamber; + + public: + Passenger() = default; + + Passenger(std::string firstName, std::string lastName, int passportNamber) { + this->firstName = firstName; + this->lastName = lastName; + this->passportNamber = passportNamber; + } + + void info() { + std::cout << firstName << ", " << lastName << ", " << passportNamber << "\n"; + } +}; + +class Plane { + std::string model; + int year; + size_t seat_count; + + public: + Passenger* passengers; + size_t passengerAmount; + + Plane() = default; + + Plane(std::string model, int year, size_t seat_count) { + passengerAmount = 0; + passengers = new Passenger[0]; + this->model = model; + this->year = year; + this->seat_count = seat_count; + } + + void info() { + std::cout << model << ", " << year << ", " << seat_count << '\n'; + } + + void PassengerInformation() { + for (size_t i = 0; i < passengerAmount; i++) { + passengers[i].info(); + } + } + + void addPassager(Passenger passenger) { + Passenger* new_passengers = new Passenger[passengerAmount + 1]; + for (size_t i = 0; i < passengerAmount; i++) { + new_passengers[i] = passengers[i]; + } + new_passengers[passengerAmount] = passenger; + delete[] passengers; + passengers = new_passengers; + passengerAmount++; + } + + void removePassenger(size_t n) { + Passenger* new_passengers = new Passenger[passengerAmount - 1]; + + for (size_t i = 0; i < n; i++) { + new_passengers[i] = passengers[i]; + } + + for (size_t j = n + 1; j < passengerAmount; j++) { + new_passengers[j - 1] = passengers[j]; + } + delete[] passengers; + passengers = new_passengers; + passengerAmount -= 1; + } +}; + +class FlyCompany { + Plane* planes; + size_t planeAmount; + + public: + FlyCompany() { + planes = new Plane[0]; + planeAmount = 0; + } + + void addPlane(Plane plane) { + Plane* new_planes = new Plane[planeAmount + 1]; + for (size_t i = 0; i < planeAmount; i++) { + new_planes[i] = planes[i]; + } + new_planes[planeAmount] = plane; + delete[] planes; + planes = new_planes; + planeAmount++; + } + + void deletePlane(size_t n) { + Plane* new_planes = new Plane[planeAmount - 1]; + + for (size_t i = 0; i < n; i++) { + new_planes[i] = planes[i]; + } + + for (size_t j = n + 1; j < planeAmount; j++) { + new_planes[j - 1] = planes[j]; + } + delete[] planes; + planes = new_planes; + planeAmount--; + } + + void register_passenger(Passenger passanger, size_t plane_index) { + planes[plane_index].addPassager(passanger); + } + + void unregister_passenger(size_t passenger_id, size_t plane_index) { + planes[plane_index].removePassenger(passenger_id); + } + + void plane_info() { + for (size_t i = 0; i < planeAmount; i++) { + planes[i].info(); + } + } + + void passenger_info() { + for (size_t i = 0; i < planeAmount; i++) { + planes[i].PassengerInformation(); + } + } +}; + +int main() { + FlyCompany company; + + Plane boing("Boing", 2000, 10); + Plane plane2("Plane2", -5, 3); + + Passenger petiya("Петя", "Васильев", 112245326); + Passenger pasha("Паша", "Александров", 531930186); + Passenger vova("Вова", "Клепцов", 913573127); + + company.addPlane(boing); + company.addPlane(plane2); + + company.register_passenger(petiya, 0); + company.register_passenger(pasha, 1); + company.register_passenger(vova, 1); + + company.passenger_info(); + company.plane_info(); + std::cout << '\n'; + + company.deletePlane(0); + company.unregister_passenger(0, 0); + + company.passenger_info(); + company.plane_info(); +} diff --git a/Python/OOP2/task1.py b/Python/OOP2/task1.py new file mode 100644 index 0000000..1df6cf5 --- /dev/null +++ b/Python/OOP2/task1.py @@ -0,0 +1,24 @@ +from dataclasses import dataclass, field +from datetime import datetime, timedelta + + +@dataclass(order=True) +class Train: + id: int = field(compare=False) + to: str + leaves_at: datetime = field(default_factory=datetime.now) + + +now = datetime.now() +trains = [Train(i, f"somewhere{i}", now + timedelta(hours=i)) for i in range(1, 6)] +print(*trains, sep="\n", end="\n\n") +print(*sorted(trains), sep="\n") + + +def sort_by_id(trains: list[Train]) -> list[Train]: + return sorted(trains, key=lambda train: train.id) + + +def get_from_user() -> None: + id = int(input()) + print(trains[id]) diff --git a/Python/OOP2/task10.py b/Python/OOP2/task10.py new file mode 100644 index 0000000..0d877f5 --- /dev/null +++ b/Python/OOP2/task10.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass + +@dataclass +class Foo1: + text: str + +@dataclass +class Foo2(Foo1): + num:int + diff --git a/Python/OOP2/task2.py b/Python/OOP2/task2.py new file mode 100644 index 0000000..cf14121 --- /dev/null +++ b/Python/OOP2/task2.py @@ -0,0 +1,14 @@ +from dataclasses import dataclass +from typing import Self + + +@dataclass +class Foo: + a: int + b: int + + def sum(self: Self) -> int: + return self.a + self.b + + def greater(self: Self) -> int: + return max(self.a, self.b) diff --git a/Python/OOP2/task3.py b/Python/OOP2/task3.py new file mode 100644 index 0000000..e91bcce --- /dev/null +++ b/Python/OOP2/task3.py @@ -0,0 +1,21 @@ +from typing import Self + +from attrs import define, field, validators + + +@define +class time: + hours: int = field(validator=validators.in_(range(24))) + minutes: int = field(validator=validators.in_(range(60))) + seconds: int = field(validator=validators.in_(range(60))) + + def change( + self: Self, hours: int | None, minutes: int | None, seconds: int | None + ) -> Self: + if hours is not None: + self.hours += hours + if minutes is not None: + self.minutes += minutes + if seconds is not None: + self.seconds += seconds + return self diff --git a/Python/OOP2/task4.py b/Python/OOP2/task4.py new file mode 100644 index 0000000..90615a8 --- /dev/null +++ b/Python/OOP2/task4.py @@ -0,0 +1,45 @@ +import random +from dataclasses import dataclass, field +from typing import Self + + +@dataclass +class _Base: + id: int + level: int = 1 + + +@dataclass +class Hero(_Base): + soliders: list["Solider"] = field(default_factory=list) + + def level_up(self: Self) -> Self: + self.level += 1 + return self + + +@dataclass +class Solider(_Base): + def follow(self: Self, hero: Hero) -> None: + print(f"Иду за героем {hero.id}") + + +def main() -> None: + amount_of_players = 2 + heroes = [Hero(i) for i in range(2)] + for i in range(amount_of_players, amount_of_players * 3 + 1): + solider = Solider(i) + random.choice(heroes).soliders.append(solider) + + amount_of_soliders = [len(hero.soliders) for hero in heroes] + winner_id = amount_of_soliders.index(max(amount_of_soliders)) + winner = heroes[winner_id] + loser_id = amount_of_soliders.index(max(amount_of_soliders)) + loser = heroes[loser_id] + winner.level_up() + print(winner) + random.choice(loser.soliders).follow(winner) + + +if __name__ == "__main__": + main() diff --git a/Python/OOP2/task5.py b/Python/OOP2/task5.py new file mode 100644 index 0000000..2334100 --- /dev/null +++ b/Python/OOP2/task5.py @@ -0,0 +1,14 @@ +from dataclasses import dataclass +from typing import Self + + +@dataclass +class Person: + name: str + age: int + + def move(self: Self) -> None: + print(f"{self.name} говорит") + + def talk(self: Self) -> None: + print(f"{self.name} идёт") diff --git a/Python/OOP2/task6.py b/Python/OOP2/task6.py new file mode 100644 index 0000000..51f0721 --- /dev/null +++ b/Python/OOP2/task6.py @@ -0,0 +1,12 @@ +from dataclasses import dataclass +from typing import Self + + +@dataclass +class Game: + name: str + year: int + + # НАХ? + def get_name(self: Self): + return self.name diff --git a/Python/OOP2/task7.py b/Python/OOP2/task7.py new file mode 100644 index 0000000..e69de29 diff --git a/Python/OOP2/task8.py b/Python/OOP2/task8.py new file mode 100644 index 0000000..d4078a7 --- /dev/null +++ b/Python/OOP2/task8.py @@ -0,0 +1,26 @@ +from dataclasses import dataclass + + +@dataclass +class Game: + year: int + name: str + + def get_name(self) -> str: + return self.name + + +class PCGame(Game): + pass + + +class PS4Game(Game): + pass + + +class XboxGame(Game): + pass + + +class Mobiles(Game): + pass diff --git a/Python/OOP2/task9.py b/Python/OOP2/task9.py new file mode 100644 index 0000000..1522894 --- /dev/null +++ b/Python/OOP2/task9.py @@ -0,0 +1,19 @@ +from dataclasses import dataclass + + +class Figure: + pass + + +@dataclass +class Triangle: + sides: tuple[int, int, int] + height: int + + def area(self) -> int: + return self.sides[0] * self.height + + +@dataclass +class Circle: + pass diff --git a/Python/OOP2/test.py b/Python/OOP2/test.py new file mode 100644 index 0000000..37cfc45 --- /dev/null +++ b/Python/OOP2/test.py @@ -0,0 +1,13 @@ +import asyncio + + +async def sleep_print(i: str) -> None: + print(i) + await asyncio.sleep(5) + + +async def main() -> int: + await asyncio.gather(*[sleep_print(i) for i in range(5)]) + + +asyncio.run(main()) diff --git a/Python/OOP3/run1 b/Python/OOP3/run1 new file mode 100644 index 0000000..9f6200b --- /dev/null +++ b/Python/OOP3/run1 @@ -0,0 +1,999 @@ +1 false +2 true +3 true +4 false +5 true +6 false +7 true +8 false +9 true +10 false +11 true +12 false +13 true +14 false +15 true +16 false +17 true +18 false +19 true +20 false +21 false +22 false +23 true +24 false +25 true +26 false +27 false +28 false +29 true +30 false +31 true +32 false +33 false +34 false +35 true +36 false +37 true +38 false +39 false +40 false +41 true +42 false +43 true +44 false +45 false +46 false +47 true +48 false +49 true +50 false +51 false +52 false +53 true +54 false +55 false +56 false +57 false +58 false +59 true +60 false +61 true +62 false +63 false +64 false +65 false +66 false +67 true +68 false +69 false +70 false +71 true +72 false +73 true +74 false +75 false +76 false +77 false +78 false +79 true +80 false +81 false +82 false +83 true +84 false +85 false +86 false +87 false +88 false +89 true +90 false +91 false +92 false +93 false +94 false +95 false +96 false +97 true +98 false +99 false +100 false +101 true +102 false +103 true +104 false +105 false +106 false +107 true +108 false +109 true +110 false +111 false +112 false +113 true +114 false +115 false +116 false +117 false +118 false +119 false +120 false +121 true +122 false +123 false +124 false +125 false +126 false +127 true +128 false +129 false +130 false +131 true +132 false +133 false +134 false +135 false +136 false +137 true +138 false +139 true +140 false +141 false +142 false +143 true +144 false +145 false +146 false +147 false +148 false +149 true +150 false +151 true +152 false +153 false +154 false +155 false +156 false +157 true +158 false +159 false +160 false +161 false +162 false +163 true +164 false +165 false +166 false +167 true +168 false +169 true +170 false +171 false +172 false +173 true +174 false +175 false +176 false +177 false +178 false +179 true +180 false +181 true +182 false +183 false +184 false +185 false +186 false +187 false +188 false +189 false +190 false +191 true +192 false +193 true +194 false +195 false +196 false +197 true +198 false +199 true +200 false +201 false +202 false +203 false +204 false +205 false +206 false +207 false +208 false +209 false +210 false +211 true +212 false +213 false +214 false +215 false +216 false +217 false +218 false +219 false +220 false +221 false +222 false +223 true +224 false +225 false +226 false +227 true +228 false +229 true +230 false +231 false +232 false +233 true +234 false +235 false +236 false +237 false +238 false +239 true +240 false +241 true +242 false +243 false +244 false +245 false +246 false +247 false +248 false +249 false +250 false +251 true +252 false +253 false +254 false +255 false +256 false +257 true +258 false +259 false +260 false +261 false +262 false +263 true +264 false +265 false +266 false +267 false +268 false +269 true +270 false +271 true +272 false +273 false +274 false +275 false +276 false +277 true +278 false +279 false +280 false +281 true +282 false +283 true +284 false +285 false +286 false +287 false +288 false +289 true +290 false +291 false +292 false +293 true +294 false +295 false +296 false +297 false +298 false +299 false +300 false +301 false +302 false +303 false +304 false +305 false +306 false +307 true +308 false +309 false +310 false +311 true +312 false +313 true +314 false +315 false +316 false +317 true +318 false +319 false +320 false +321 false +322 false +323 true +324 false +325 false +326 false +327 false +328 false +329 false +330 false +331 true +332 false +333 false +334 false +335 false +336 false +337 true +338 false +339 false +340 false +341 false +342 false +343 false +344 false +345 false +346 false +347 true +348 false +349 true +350 false +351 false +352 false +353 true +354 false +355 false +356 false +357 false +358 false +359 true +360 false +361 true +362 false +363 false +364 false +365 false +366 false +367 true +368 false +369 false +370 false +371 false +372 false +373 true +374 false +375 false +376 false +377 false +378 false +379 true +380 false +381 false +382 false +383 true +384 false +385 false +386 false +387 false +388 false +389 true +390 false +391 false +392 false +393 false +394 false +395 false +396 false +397 true +398 false +399 false +400 false +401 true +402 false +403 false +404 false +405 false +406 false +407 false +408 false +409 true +410 false +411 false +412 false +413 false +414 false +415 false +416 false +417 false +418 false +419 true +420 false +421 true +422 false +423 false +424 false +425 false +426 false +427 false +428 false +429 false +430 false +431 true +432 false +433 true +434 false +435 false +436 false +437 false +438 false +439 true +440 false +441 false +442 false +443 true +444 false +445 false +446 false +447 false +448 false +449 true +450 false +451 false +452 false +453 false +454 false +455 false +456 false +457 true +458 false +459 false +460 false +461 true +462 false +463 true +464 false +465 false +466 false +467 true +468 false +469 false +470 false +471 false +472 false +473 false +474 false +475 false +476 false +477 false +478 false +479 true +480 false +481 false +482 false +483 false +484 false +485 false +486 false +487 true +488 false +489 false +490 false +491 true +492 false +493 false +494 false +495 false +496 false +497 false +498 false +499 true +500 false +501 false +502 false +503 true +504 false +505 false +506 false +507 false +508 false +509 true +510 false +511 false +512 false +513 false +514 false +515 false +516 false +517 false +518 false +519 false +520 false +521 true +522 false +523 true +524 false +525 false +526 false +527 false +528 false +529 true +530 false +531 false +532 false +533 false +534 false +535 false +536 false +537 false +538 false +539 false +540 false +541 true +542 false +543 false +544 false +545 false +546 false +547 true +548 false +549 false +550 false +551 false +552 false +553 false +554 false +555 false +556 false +557 true +558 false +559 false +560 false +561 false +562 false +563 true +564 false +565 false +566 false +567 false +568 false +569 true +570 false +571 true +572 false +573 false +574 false +575 false +576 false +577 true +578 false +579 false +580 false +581 false +582 false +583 false +584 false +585 false +586 false +587 true +588 false +589 false +590 false +591 false +592 false +593 true +594 false +595 false +596 false +597 false +598 false +599 true +600 false +601 true +602 false +603 false +604 false +605 false +606 false +607 true +608 false +609 false +610 false +611 false +612 false +613 true +614 false +615 false +616 false +617 true +618 false +619 true +620 false +621 false +622 false +623 false +624 false +625 false +626 false +627 false +628 false +629 false +630 false +631 true +632 false +633 false +634 false +635 false +636 false +637 false +638 false +639 false +640 false +641 true +642 false +643 true +644 false +645 false +646 false +647 true +648 false +649 false +650 false +651 false +652 false +653 true +654 false +655 false +656 false +657 false +658 false +659 true +660 false +661 true +662 false +663 false +664 false +665 false +666 false +667 false +668 false +669 false +670 false +671 false +672 false +673 true +674 false +675 false +676 false +677 true +678 false +679 false +680 false +681 false +682 false +683 true +684 false +685 false +686 false +687 false +688 false +689 false +690 false +691 true +692 false +693 false +694 false +695 false +696 false +697 false +698 false +699 false +700 false +701 true +702 false +703 false +704 false +705 false +706 false +707 false +708 false +709 true +710 false +711 false +712 false +713 false +714 false +715 false +716 false +717 false +718 false +719 true +720 false +721 false +722 false +723 false +724 false +725 false +726 false +727 true +728 false +729 false +730 false +731 false +732 false +733 true +734 false +735 false +736 false +737 false +738 false +739 true +740 false +741 false +742 false +743 true +744 false +745 false +746 false +747 false +748 false +749 false +750 false +751 true +752 false +753 false +754 false +755 false +756 false +757 true +758 false +759 false +760 false +761 true +762 false +763 false +764 false +765 false +766 false +767 false +768 false +769 true +770 false +771 false +772 false +773 true +774 false +775 false +776 false +777 false +778 false +779 false +780 false +781 false +782 false +783 false +784 false +785 false +786 false +787 true +788 false +789 false +790 false +791 false +792 false +793 false +794 false +795 false +796 false +797 true +798 false +799 false +800 false +801 false +802 false +803 false +804 false +805 false +806 false +807 false +808 false +809 true +810 false +811 true +812 false +813 false +814 false +815 false +816 false +817 false +818 false +819 false +820 false +821 true +822 false +823 true +824 false +825 false +826 false +827 true +828 false +829 true +830 false +831 false +832 false +833 false +834 false +835 false +836 false +837 false +838 false +839 true +840 false +841 true +842 false +843 false +844 false +845 false +846 false +847 false +848 false +849 false +850 false +851 false +852 false +853 true +854 false +855 false +856 false +857 true +858 false +859 true +860 false +861 false +862 false +863 true +864 false +865 false +866 false +867 false +868 false +869 false +870 false +871 false +872 false +873 false +874 false +875 false +876 false +877 true +878 false +879 false +880 false +881 true +882 false +883 true +884 false +885 false +886 false +887 true +888 false +889 false +890 false +891 false +892 false +893 false +894 false +895 false +896 false +897 false +898 false +899 true +900 false +901 false +902 false +903 false +904 false +905 false +906 false +907 true +908 false +909 false +910 false +911 true +912 false +913 false +914 false +915 false +916 false +917 false +918 false +919 true +920 false +921 false +922 false +923 false +924 false +925 false +926 false +927 false +928 false +929 true +930 false +931 false +932 false +933 false +934 false +935 false +936 false +937 true +938 false +939 false +940 false +941 true +942 false +943 false +944 false +945 false +946 false +947 true +948 false +949 false +950 false +951 false +952 false +953 true +954 false +955 false +956 false +957 false +958 false +959 false +960 false +961 true +962 false +963 false +964 false +965 false +966 false +967 true +968 false +969 false +970 false +971 true +972 false +973 false +974 false +975 false +976 false +977 true +978 false +979 false +980 false +981 false +982 false +983 true +984 false +985 false +986 false +987 false +988 false +989 false +990 false +991 true +992 false +993 false +994 false +995 false +996 false +997 true +998 false +999 false diff --git a/Python/OOP3/run2 b/Python/OOP3/run2 new file mode 100644 index 0000000..83aa022 --- /dev/null +++ b/Python/OOP3/run2 @@ -0,0 +1,999 @@ +1 false +2 true +3 true +4 false +5 true +6 false +7 true +8 false +9 false +10 false +11 true +12 false +13 true +14 false +15 false +16 false +17 true +18 false +19 true +20 false +21 false +22 false +23 true +24 false +25 false +26 false +27 false +28 false +29 true +30 false +31 true +32 false +33 false +34 false +35 false +36 false +37 true +38 false +39 false +40 false +41 true +42 false +43 true +44 false +45 false +46 false +47 true +48 false +49 false +50 false +51 false +52 false +53 true +54 false +55 false +56 false +57 false +58 false +59 true +60 false +61 true +62 false +63 false +64 false +65 false +66 false +67 true +68 false +69 false +70 false +71 true +72 false +73 true +74 false +75 false +76 false +77 false +78 false +79 true +80 false +81 false +82 false +83 true +84 false +85 false +86 false +87 false +88 false +89 true +90 false +91 false +92 false +93 false +94 false +95 false +96 false +97 true +98 false +99 false +100 false +101 true +102 false +103 true +104 false +105 false +106 false +107 true +108 false +109 true +110 false +111 false +112 false +113 true +114 false +115 false +116 false +117 false +118 false +119 false +120 false +121 false +122 false +123 false +124 false +125 false +126 false +127 true +128 false +129 false +130 false +131 true +132 false +133 false +134 false +135 false +136 false +137 true +138 false +139 true +140 false +141 false +142 false +143 false +144 false +145 false +146 false +147 false +148 false +149 true +150 false +151 true +152 false +153 false +154 false +155 false +156 false +157 true +158 false +159 false +160 false +161 false +162 false +163 true +164 false +165 false +166 false +167 true +168 false +169 false +170 false +171 false +172 false +173 true +174 false +175 false +176 false +177 false +178 false +179 true +180 false +181 true +182 false +183 false +184 false +185 false +186 false +187 false +188 false +189 false +190 false +191 true +192 false +193 true +194 false +195 false +196 false +197 true +198 false +199 true +200 false +201 false +202 false +203 false +204 false +205 false +206 false +207 false +208 false +209 false +210 false +211 true +212 false +213 false +214 false +215 false +216 false +217 false +218 false +219 false +220 false +221 false +222 false +223 true +224 false +225 false +226 false +227 true +228 false +229 true +230 false +231 false +232 false +233 true +234 false +235 false +236 false +237 false +238 false +239 true +240 false +241 true +242 false +243 false +244 false +245 false +246 false +247 false +248 false +249 false +250 false +251 true +252 false +253 false +254 false +255 false +256 false +257 true +258 false +259 false +260 false +261 false +262 false +263 true +264 false +265 false +266 false +267 false +268 false +269 true +270 false +271 true +272 false +273 false +274 false +275 false +276 false +277 true +278 false +279 false +280 false +281 true +282 false +283 true +284 false +285 false +286 false +287 false +288 false +289 false +290 false +291 false +292 false +293 true +294 false +295 false +296 false +297 false +298 false +299 false +300 false +301 false +302 false +303 false +304 false +305 false +306 false +307 true +308 false +309 false +310 false +311 true +312 false +313 true +314 false +315 false +316 false +317 true +318 false +319 false +320 false +321 false +322 false +323 false +324 false +325 false +326 false +327 false +328 false +329 false +330 false +331 true +332 false +333 false +334 false +335 false +336 false +337 true +338 false +339 false +340 false +341 false +342 false +343 false +344 false +345 false +346 false +347 true +348 false +349 true +350 false +351 false +352 false +353 true +354 false +355 false +356 false +357 false +358 false +359 true +360 false +361 false +362 false +363 false +364 false +365 false +366 false +367 true +368 false +369 false +370 false +371 false +372 false +373 true +374 false +375 false +376 false +377 false +378 false +379 true +380 false +381 false +382 false +383 true +384 false +385 false +386 false +387 false +388 false +389 true +390 false +391 false +392 false +393 false +394 false +395 false +396 false +397 true +398 false +399 false +400 false +401 true +402 false +403 false +404 false +405 false +406 false +407 false +408 false +409 true +410 false +411 false +412 false +413 false +414 false +415 false +416 false +417 false +418 false +419 true +420 false +421 true +422 false +423 false +424 false +425 false +426 false +427 false +428 false +429 false +430 false +431 true +432 false +433 true +434 false +435 false +436 false +437 false +438 false +439 true +440 false +441 false +442 false +443 true +444 false +445 false +446 false +447 false +448 false +449 true +450 false +451 false +452 false +453 false +454 false +455 false +456 false +457 true +458 false +459 false +460 false +461 true +462 false +463 true +464 false +465 false +466 false +467 true +468 false +469 false +470 false +471 false +472 false +473 false +474 false +475 false +476 false +477 false +478 false +479 true +480 false +481 false +482 false +483 false +484 false +485 false +486 false +487 true +488 false +489 false +490 false +491 true +492 false +493 false +494 false +495 false +496 false +497 false +498 false +499 true +500 false +501 false +502 false +503 true +504 false +505 false +506 false +507 false +508 false +509 true +510 false +511 false +512 false +513 false +514 false +515 false +516 false +517 false +518 false +519 false +520 false +521 true +522 false +523 true +524 false +525 false +526 false +527 false +528 false +529 false +530 false +531 false +532 false +533 false +534 false +535 false +536 false +537 false +538 false +539 false +540 false +541 true +542 false +543 false +544 false +545 false +546 false +547 true +548 false +549 false +550 false +551 false +552 false +553 false +554 false +555 false +556 false +557 true +558 false +559 false +560 false +561 false +562 false +563 true +564 false +565 false +566 false +567 false +568 false +569 true +570 false +571 true +572 false +573 false +574 false +575 false +576 false +577 true +578 false +579 false +580 false +581 false +582 false +583 false +584 false +585 false +586 false +587 true +588 false +589 false +590 false +591 false +592 false +593 true +594 false +595 false +596 false +597 false +598 false +599 true +600 false +601 true +602 false +603 false +604 false +605 false +606 false +607 true +608 false +609 false +610 false +611 false +612 false +613 true +614 false +615 false +616 false +617 true +618 false +619 true +620 false +621 false +622 false +623 false +624 false +625 false +626 false +627 false +628 false +629 false +630 false +631 true +632 false +633 false +634 false +635 false +636 false +637 false +638 false +639 false +640 false +641 true +642 false +643 true +644 false +645 false +646 false +647 true +648 false +649 false +650 false +651 false +652 false +653 true +654 false +655 false +656 false +657 false +658 false +659 true +660 false +661 true +662 false +663 false +664 false +665 false +666 false +667 false +668 false +669 false +670 false +671 false +672 false +673 true +674 false +675 false +676 false +677 true +678 false +679 false +680 false +681 false +682 false +683 true +684 false +685 false +686 false +687 false +688 false +689 false +690 false +691 true +692 false +693 false +694 false +695 false +696 false +697 false +698 false +699 false +700 false +701 true +702 false +703 false +704 false +705 false +706 false +707 false +708 false +709 true +710 false +711 false +712 false +713 false +714 false +715 false +716 false +717 false +718 false +719 true +720 false +721 false +722 false +723 false +724 false +725 false +726 false +727 true +728 false +729 false +730 false +731 false +732 false +733 true +734 false +735 false +736 false +737 false +738 false +739 true +740 false +741 false +742 false +743 true +744 false +745 false +746 false +747 false +748 false +749 false +750 false +751 true +752 false +753 false +754 false +755 false +756 false +757 true +758 false +759 false +760 false +761 true +762 false +763 false +764 false +765 false +766 false +767 false +768 false +769 true +770 false +771 false +772 false +773 true +774 false +775 false +776 false +777 false +778 false +779 false +780 false +781 false +782 false +783 false +784 false +785 false +786 false +787 true +788 false +789 false +790 false +791 false +792 false +793 false +794 false +795 false +796 false +797 true +798 false +799 false +800 false +801 false +802 false +803 false +804 false +805 false +806 false +807 false +808 false +809 true +810 false +811 true +812 false +813 false +814 false +815 false +816 false +817 false +818 false +819 false +820 false +821 true +822 false +823 true +824 false +825 false +826 false +827 true +828 false +829 true +830 false +831 false +832 false +833 false +834 false +835 false +836 false +837 false +838 false +839 true +840 false +841 false +842 false +843 false +844 false +845 false +846 false +847 false +848 false +849 false +850 false +851 false +852 false +853 true +854 false +855 false +856 false +857 true +858 false +859 true +860 false +861 false +862 false +863 true +864 false +865 false +866 false +867 false +868 false +869 false +870 false +871 false +872 false +873 false +874 false +875 false +876 false +877 true +878 false +879 false +880 false +881 true +882 false +883 true +884 false +885 false +886 false +887 true +888 false +889 false +890 false +891 false +892 false +893 false +894 false +895 false +896 false +897 false +898 false +899 false +900 false +901 false +902 false +903 false +904 false +905 false +906 false +907 true +908 false +909 false +910 false +911 true +912 false +913 false +914 false +915 false +916 false +917 false +918 false +919 true +920 false +921 false +922 false +923 false +924 false +925 false +926 false +927 false +928 false +929 true +930 false +931 false +932 false +933 false +934 false +935 false +936 false +937 true +938 false +939 false +940 false +941 true +942 false +943 false +944 false +945 false +946 false +947 true +948 false +949 false +950 false +951 false +952 false +953 true +954 false +955 false +956 false +957 false +958 false +959 false +960 false +961 false +962 false +963 false +964 false +965 false +966 false +967 true +968 false +969 false +970 false +971 true +972 false +973 false +974 false +975 false +976 false +977 true +978 false +979 false +980 false +981 false +982 false +983 true +984 false +985 false +986 false +987 false +988 false +989 false +990 false +991 true +992 false +993 false +994 false +995 false +996 false +997 true +998 false +999 false diff --git a/Python/OOP3/task1.py b/Python/OOP3/task1.py new file mode 100644 index 0000000..8be4f29 --- /dev/null +++ b/Python/OOP3/task1.py @@ -0,0 +1,22 @@ +from abc import ABC, abstractmethod + + +class Animal(ABC): + @abstractmethod + def move(self): + pass + + +class Cat(Animal): + def move(self): + print("No. Cat doesn't want to move his furry arse") + + +class Dog(Animal): + def move(self) -> None: + print("Dog's running towards you") + + +animals: list[Animal] = [Cat(), Dog()] +for animal in animals: + animal.move() diff --git a/Python/OOP3/task2py b/Python/OOP3/task2py new file mode 100644 index 0000000..dd8b90e --- /dev/null +++ b/Python/OOP3/task2py @@ -0,0 +1,7 @@ +class SomeClass(object): + @classmethod + def hello(cls): + print("It's", cls.__name__) + + +SomeClass.hello() diff --git a/Python/OOP3/task3.py b/Python/OOP3/task3.py new file mode 100644 index 0000000..1562137 --- /dev/null +++ b/Python/OOP3/task3.py @@ -0,0 +1,9 @@ +class SomeClass(object): + @staticmethod + def hello(): + print("Hello world") + + +SomeClass.hello() +obj = SomeClass() +obj.hello() diff --git a/Python/OOP3/task4.py b/Python/OOP3/task4.py new file mode 100644 index 0000000..a370b7f --- /dev/null +++ b/Python/OOP3/task4.py @@ -0,0 +1,17 @@ +class Person: + def __init__(self, name: str): + self._name = name + + @property + def name(self) -> str: + return self._name + + @name.setter + def name(self, new_name) -> None: + self._name = new_name + + +p = Person("abc") +print(p.name) +p.name = "10" +print(p.name) diff --git a/Python/OOP3/task5.py b/Python/OOP3/task5.py new file mode 100644 index 0000000..20b353c --- /dev/null +++ b/Python/OOP3/task5.py @@ -0,0 +1,14 @@ +from typing import Self + + +class CrazyNumber: + def __init__(self, number): + self.number = number + + def __sub__(self, other: Self) -> float: + return self.number // other.number + + +n1 = CrazyNumber(1243) +n2 = CrazyNumber(2) +print(n1 - n2) diff --git a/Python/OOP3/task6.py b/Python/OOP3/task6.py new file mode 100644 index 0000000..a9f7bd5 --- /dev/null +++ b/Python/OOP3/task6.py @@ -0,0 +1,13 @@ +class Singleton(object): + obj = None + + def __new__(cls, *args, **kwards): + if cls.obj is None: + cls.obj = object.__new__(cls) + return cls.obj + + +sing1 = Singleton() +sing2 = Singleton() +print(id(sing1)) +print(id(sing2)) diff --git a/Python/OOP3/test.cpp b/Python/OOP3/test.cpp new file mode 100644 index 0000000..99781c5 --- /dev/null +++ b/Python/OOP3/test.cpp @@ -0,0 +1,27 @@ +#include +#include + +bool isPrime(const int number) { + if (number == 1) { + return false; + } + if (number == 2 || number == 3) { + return true; + } + if (number % 2 == 0) { + return false; + } + int border = sqrt(number) + 1; + for (int i = 3; i < border; i += 2) { + if (number % i == 0) { + return false; + } + } + return true; +} + +int main() { + for (int i = 1; i < 1000; i++) { + std::cout << i << ' ' << (isPrime(i) ? "true" : "false") << '\n'; + } +} \ No newline at end of file diff --git a/Python/Python-test/task1.py b/Python/Python-test/task1.py new file mode 100644 index 0000000..6fb1e94 --- /dev/null +++ b/Python/Python-test/task1.py @@ -0,0 +1,10 @@ +a = [12, 34, 542, 12, 63653, 635, 635] + + +def foo(i): + print(i) + return i + + +seen = set() +print(not any(i in seen or seen.add(i) for i in a)) diff --git a/Python/Python-test/task10.py b/Python/Python-test/task10.py new file mode 100644 index 0000000..727a73e --- /dev/null +++ b/Python/Python-test/task10.py @@ -0,0 +1,11 @@ +from random import randint + +import numpy as np + +SIZE = 10 + +a = [randint(0, 100_000) for _ in range(SIZE**2)] +a = np.array(a) +a = a.reshape((SIZE, SIZE)) +print(a) +print(np.min(a), np.max(a)) diff --git a/Python/Python-test/task2.py b/Python/Python-test/task2.py new file mode 100644 index 0000000..b23dabb --- /dev/null +++ b/Python/Python-test/task2.py @@ -0,0 +1,6 @@ +a = [12, 34, 542, 63653, 635, 635, 20] + +for id, i in enumerate(a): + if i == 20: + a[id] = 200 + break diff --git a/Python/Python-test/task3.py b/Python/Python-test/task3.py new file mode 100644 index 0000000..1e9d22e --- /dev/null +++ b/Python/Python-test/task3.py @@ -0,0 +1,16 @@ +a = { + 12: 30, + 30: 40, + 50: 60, + 70: 80, +} +# Вар 1 +for key, value in a.items(): + print(a) + +# Вар 2 +for key in a: + print(key) + +for value in a.values(): + print(value) diff --git a/Python/Python-test/task4.py b/Python/Python-test/task4.py new file mode 100644 index 0000000..e72ba3e --- /dev/null +++ b/Python/Python-test/task4.py @@ -0,0 +1,2 @@ +a = {i: i**2 for i in range(1, 16)} +print(a) diff --git a/Python/Python-test/task5.py b/Python/Python-test/task5.py new file mode 100644 index 0000000..c038ac3 --- /dev/null +++ b/Python/Python-test/task5.py @@ -0,0 +1,4 @@ +with open("task5.txt") as f: + nums = map(int, f.read().split()) + +print(sum(nums)) diff --git a/Python/Python-test/task5.txt b/Python/Python-test/task5.txt new file mode 100644 index 0000000..68d2dd0 --- /dev/null +++ b/Python/Python-test/task5.txt @@ -0,0 +1 @@ +10 20 30 \ No newline at end of file diff --git a/Python/Python-test/task6.py b/Python/Python-test/task6.py new file mode 100644 index 0000000..3021034 --- /dev/null +++ b/Python/Python-test/task6.py @@ -0,0 +1,21 @@ +from dataclasses import dataclass +from typing import Self + + +@dataclass +class Foo: + a: int + b: int + + def print(self: Self) -> None: + print(self.a, self.b) + + def max(self: Self) -> int: + return max(self.a, self.b) + + def sum(self: Self) -> int: + return self.a + self.b + + def change_vals(self: Self, a: int, b: int) -> None: + self.a = a + self.b = b diff --git a/Python/Python-test/task7.py b/Python/Python-test/task7.py new file mode 100644 index 0000000..9cf2a5f --- /dev/null +++ b/Python/Python-test/task7.py @@ -0,0 +1,3 @@ +a = [10, 12, 34, 542, 63653, 635, 635] +b = [21, 5165, 623, 542, 10] +print(sorted(set(a).intersection(b))) diff --git a/Python/Python-test/task8.py b/Python/Python-test/task8.py new file mode 100644 index 0000000..4ecf6ee --- /dev/null +++ b/Python/Python-test/task8.py @@ -0,0 +1,4 @@ +def sum_range(a: int, b: int, /) -> int: + if a > b: + a, b = b, a + return sum(range(a, b)) diff --git a/Python/Python-test/task9.py b/Python/Python-test/task9.py new file mode 100644 index 0000000..ddaa52d --- /dev/null +++ b/Python/Python-test/task9.py @@ -0,0 +1,4 @@ +from collections import Counter + +a = [12, 34, 542, 63653, 635, 635] +print(Counter(a)) diff --git a/Python/requirements.txt b/Python/requirements.txt new file mode 100644 index 0000000..5be176c --- /dev/null +++ b/Python/requirements.txt @@ -0,0 +1,4 @@ +attrs +black +flake8 +isort diff --git a/Python/telegram/.env b/Python/telegram/.env new file mode 100644 index 0000000..85d1d6b --- /dev/null +++ b/Python/telegram/.env @@ -0,0 +1 @@ +TG_TOKEN=5684427592:AAEwHcoWyLCaGi7uaT7Eso_BDzpFusWE6jY diff --git a/Python/telegram/main.py b/Python/telegram/main.py new file mode 100644 index 0000000..af3f5ce --- /dev/null +++ b/Python/telegram/main.py @@ -0,0 +1,39 @@ +from io import BytesIO +from os import environ + +import dotenv +from aiogram import Bot, Dispatcher, executor, types +from httpx import AsyncClient + +dotenv.load_dotenv() +bot = Bot(token=environ["TG_TOKEN"]) +dp = Dispatcher(bot) + + +@dp.message_handler(commands=["start"]) +async def start(mes: types.Message) -> None: + await mes.reply( + f"Привет {mes.from_user.get_mention()}", + parse_mode="MarkdownV2", + ) + + +@dp.message_handler(commands=["send_pic"]) +async def send_pic(mes: types.Message) -> None: + async with AsyncClient() as client: + response = await client.get( + "https://loremflickr.com/320/240/dog", + follow_redirects=True, + ) + photo = BytesIO(response.content) + photo.name = "dog.jpg" + await mes.reply_photo(photo, "Here you go") + + +@dp.message_handler(content_types=types.ContentTypes.TEXT) +async def message_handler(mes: types.Message) -> None: + await bot.send_message(mes.chat.id, mes.text) + print(mes.text) + + +executor.start_polling(dp) diff --git a/Python/telegram/task1.py b/Python/telegram/task1.py new file mode 100644 index 0000000..b917e1b --- /dev/null +++ b/Python/telegram/task1.py @@ -0,0 +1,27 @@ +import asyncio +from typing import Never + + +async def print_nums() -> Never: + num = 1 + while True: + num += 1 + print(num) + await asyncio.sleep(0.1) + + +async def print_time() -> Never: + count = 0 + while True: + if not count % 3: + print(f"Time {count}") + count += 1 + await asyncio.sleep(1) + + +async def main() -> Never: + await asyncio.gather(print_nums(), print_time()) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/Python/telegram/task2.py b/Python/telegram/task2.py new file mode 100644 index 0000000..d7f2500 --- /dev/null +++ b/Python/telegram/task2.py @@ -0,0 +1,37 @@ +import asyncio +import pathlib +from time import perf_counter + +import aiofiles +from httpx import AsyncClient, Response + + +async def get_file(client: AsyncClient, url: str) -> Response: + return await client.get(url, follow_redirects=True) + + +async def write_file(response: Response) -> None: + file_name = response.url.path.rsplit("/", 1)[1] + print(file_name) + async with aiofiles.open(f"photos/{file_name}", "wb") as f: + await f.write(response.content) + + +async def download_file(client: AsyncClient, url: str) -> None: + await write_file(await get_file(client, url)) + + +async def main(): + pathlib.Path("photos").mkdir(exist_ok=True) + async with AsyncClient() as client: + await asyncio.gather( + *( + download_file(client, "https://loremflickr.com/320/240") + for _ in range(10) + ) + ) + + +start = perf_counter() +asyncio.run(main()) +print(perf_counter() - start) diff --git a/Unreal/Unreal.md b/Unreal/Unreal.md new file mode 100644 index 0000000..8dcd85e --- /dev/null +++ b/Unreal/Unreal.md @@ -0,0 +1,83 @@ +# Unreal (may the force be with us) Engine + +* Unreal engine был создан Epic Games +* Первая игра - Unreal +* На нём делают много всего + +## Ассет + +Любой ресурс для создания аудио-визуального контента + +## Меш + +Геометрическая структура из вершин (vertices) и полигонов. Представляют собой сетку из этих самых полигонов + +## Материалы + +Материалы определяют цвет, прозрачность, блеск объектов. Могут быть наложены на Меши и частицы + +**Параметры:** + +* Base color +* Metallic +* Specular +* Roughness + +## Ноды (узлы) + +События, вызовы функции, управление потоками и переменные. Определяют функцианал графика и схемы, которые его содержат + +## Текстурирование + +Для текстурирования используется цветовая модель RGB (Red Green Blue) + +## Частицы + +Используются для взрывов, дождя, дыма. В unreal Engine используется Cascade + +## Blueprints + +### Типы данных + +* boolean +* byte +* integer +* float +* name (название объекта) +* string +* text (произвольная длина) +* vector (кординаты) +* rotator (поворот) +* transform (положение, поворот, маштаб) + +### Массив + +Операции: + +* get ref +* get copy +* set +* add +* insert +* remove +* clear +* P.S. тоже, что и в питоне + +### Циклы + +аналогично: + +* for +* while + +### Условный оператор + +Они есть + +* branch +* switch +* select + +### Логические операторы + +Классический набор diff --git a/Unreal/foo.py b/Unreal/foo.py new file mode 100644 index 0000000..fce9e3b --- /dev/null +++ b/Unreal/foo.py @@ -0,0 +1,12 @@ +def prettify(val: str) -> str: + return val.removeprefix("").strip() + +lines = [] + +while True: + try: + lines.append(prettify(input())) + except EOFError: + break + +print("\n".join(lines)) diff --git a/sql/Databases.md b/sql/Databases.md new file mode 100644 index 0000000..8137c1b --- /dev/null +++ b/sql/Databases.md @@ -0,0 +1,377 @@ +# Базы данных + +## Основы + +### Основные определения + + *База данных* - набор структурированной информации или данных, которые хранятся в компьютерной системе + + *СУБД* - система управления БД + + *SQL* - основной интерфейс работы с реляционными базами данных + + *Транзакция* - Последовательность операция над БД, рассматриваемых СУБД, как одно целое + +### Классификация + +* Простейшие базы двнных +* SQL базы данных (реляционные) +* NoSQL базы данных (нереляционные) +* Комбинированные типы + +### Реляционные базы данных + +> Набор данных с предопределенными связями между ними. Эти данные организованны в виде набора таблиц, состоящих из столбцов и строк. В таблицах хранится информация об объектах, представленных в виде данных + +### NoSQL базы данных + +> База данных, в которой не используется табличная система строк и столбцов + +### Основные функции + +* Управление данными во внешней памяти +* Управление данными в оперативной памяти +* Управление транзакциями +* Ведение журнала выполнения операций в базе данных +* поддержка языков баз данных + +### Основные БД + +* SQL + * Oracle (Вы любите деньги больше, чем надо) + * Microsoft SQL Server (Вы любите деньги больше, чем надо) + * PostgreSQL (Халява) +* NoSQL + * MongoDB + * DB2 + * Cassandra + +### Первичный и внеший ключ + +* *Ключ* - это колонка или колонки,не имеющие дублирующих значений. + + * *Первичный ключ* - это поле или набор полей со значением, которые являются уникальными для всей таблицы. + + * *Естественные* являются свойствами моделируемого объекта интересными сами по себе, даже если никто не стремится сделать из них ключ + + * *Искусственные (суррогатные)* - придуманные коды для ссылки на данные или объекты + + * *Внешний ключ* - столбец или группа столбцов, используемых в SQL БД для связи данных между таблицами + +### Типы связи в SQL БД + +1. "Один к одному" + + Образуется когда ключевой столбец присутствует в другой таблице, в которой тоже является ключом либо свойствами столбца задана его уникальность. Используется, когда нужно разделить данные одной таблицы на несколько отдельных таблиц. + +2. "Один к многим" + + Одной записи первой таблицы соответсвует неколько записей в другой таблие. Символ ключа связи указывает, что таблица,к которой этот конец прилегает, находится на стороне "один", а символ бесконечности находится на стороне "многие". +3. "Многие к многим" + + Если нескольким записям одно таблицы соответсвует несколько запясей из другой таблицы. Связь организовывается посредством связывающей таблицы. + +### Реляционная алгебра. Операции + +* *Проекция* - это столбец фильтра. Получаем содержимое только части столбцов. +* *Выборка* - это фильтрование строки. Включает в себя выбор строк. +* *Декартово произведение* - Каждому элементу из множества R сопоставлен в соответсвие определенный элемент из множества S, то возникает множество, сопоставленное из пар элементов множества R и S. +* *Объединение* - это отношение, которое включает в себя все кортежи обоих отношений без повторов. +* *Вычитание* - это разность односхемных отношений R и S назывется множество кортежей R, не входящих в S. +* *Пересечение* - это пересечение двух односхемных отношений R и S есть подмножество кортежей, принадлежащих обоим отношениям. Это можно выразить через разность: R-(R-S). +* *Соединение* - эта операция определяет подмножество декартова произведения двух разносхемных отношений. Предназначена для обеспечения выборки данных из двух таблиц и включение этих данных в один результативный набор. + +### Нормализация и Денормализация + + *Нормальная форма* - Свойство отношения, характеризующее его с точки зрения избыточности + + *Нормализация* - процесс минимизации избыточности отношения(приведение к НФ) + + *Денормализация* - намеренное приведение структуры базы данных в состояние, не соотвествующее критериям нормализации + +## Основы синтаксиса + +### Идентификаторы и ключевые слова + +* *SELECT*, *UPDATE* и *VALUES* являются примерами ключевых слов, то есть слов, имеющих фиксированное значение в языке SQL + +* Ключевые слова и идентификаторы без кавычек воспринимаются системой без учета регистра. + +* Есть и другой тип идентификаторов: отделённые идентификаторы, или идентификаторы в ковычках + +```sql +UPDATE my_table SET a = 5; +UPDATE "my_table" SET "a" = 5; +``` + +### Константы + +* *Строковая константа в SQL* - обычная последовательность символов, заключённая в одинарные ковычки + + ```sql + SELECT 'foobar' + ``` + +* Ещё один способ записи строковых констант - "заключение строк в доллары". + + ```sql + $$Жанна д Арк$$ + ``` + +* Числовые константы + + * 42 + * 3.5 + * 5e2 + * 1.925e-3 + +* Битовые константы похожи на обычные с дополнительной буквой перед опострофом, показывающих систему счисления + + * B'1001' + * X'1FF' + +* Константы: Со спецпоследовательностями (начинается с буквы E перед апострофом) + + * \b - "забой" (BackSpace) + * \f - подача формы + * \n - новая строка + * \r - возврат каретки + * \t - табуляция + +### Операторы + +* ^ - возведение в степень +* IS TRUE, IS FALSE +* ISNULL + +### Специальные знаки (Вот вооще не операторы) + + **Вот с#ка не забудь про ;** + +### Коментарии + +```sql +-- Коментарий +``` + +```sql +/* многострочный +коментарий */ +``` + +## Типы данных + +### Числовые типы + +* *smallint* (2 байта) - целое в небольшом диапозоне +* *integer* (4 байта) - типичный выбор для целых чисел +* *bigint* (8 байт) - целое в большом диапозоне +* *numeric* / *decimal* (переменный) - десятичное с указанной точностью +* *real* (4 байта) - десятичное с переменной точностью +* *double precision* (8 байт) - вещественное число с переменной точностью +* *smallserial* (2 байта) - небольшое целое с автоувелечением +* *serial* (4 байта) - целое с автоувеличением +* *bigserial* (8 байт) - большое целое с автоувеличением +* *money* - два знака после запятой, денежный тип + +### Символьные типы данных + +* *character varing(n)* / *varchar(n)* - строка ограниченной переменной длины +* *character(n)* / *char(n)* - строка фиксированной длины с пробелами +* *text* - строка неограничсенной переменной длины + +### Логический тип данных + +* *boolean* (1 байт) - TRUE / FALSE / NULL + +### Типы данных даты и времени + +* *date* - дата без времени YYYY-MM-DD +* *timestamp* - дата и время с точностью до микросекунды +* *interval* - интервал между датами +* *time* - время без даты. Удобный тип данных чем-то похожий на interval, который работает по модулю 24 (часа), то есть интервал, в котором отстутствуют дни + +## DDL - Data Defintion Language + +* CREATE - создание таблиц +* ALTER - используется для изменения объектов БД +* DROP - оспользуется для удаления БД + +### Примеры + +* Создать базу данных: + + ```sql + CREATE DATABASE test; + ``` + +* Создать таблицу + + ```sql + CREATE TABLE films( + code char(5) CONSTRAINT firstkey PRIMARY KEY, + title varchar(40) NOT NULL, + did integer NOT NULL, + date_prod date, + kind varchar(10), + len interval hour to minute + ); + ``` + +* Добавить столбец + + ```sql + ALTER TABLE distributors ADD COLUMN adress varchar(30); + ``` + +* Удалить столбец + + ```sql + ALTER TABLE distributors DROP COLUMN adress RESTRICT; + ``` + +* Изменить тип данных + + ```sql + ALTER TABLE distributors + ALTER COLUMN address TYPE varchar(80), + ALTER COLUMN name TYPE varchar(100); + ``` + +* Создать таблицу, если нет с таким же названием: + + ```sql + CREATE TABLE IF NOT EXISTS ... ; + ``` + +* Получить всё из таблицы: + + ```sql + SELECT * FROM authors; + ``` + +* Вставить что-то в таблицу: + + ```sql + INSERT INTO authors VALUES (1, 'Лёва Толстый'); + ``` + +## Фильтрация и компоновка данных + +### Where + +> Для осуществления фильтрации в SQL есть специальный оператор *WHERE* + +```sql +SELECT * FROM stores WHERE amount > 10 +``` + +### Агрегатные функции + +> Агрегатные функции выполняют вычисления над набром значений и возвращает 1 значение. Агрегатные функции игранируют NULL значения (кроме COUNT) + +* *СOUNT(\*)* - находит количество строк в запросе +* *COUNT(**expression**)* - находит количество строк в запросе, для которых **expression** не содержит значение NULL; +* *SUM* - сумма значений выьранных столбцов +* *MAX* - максимальное значение определённого столбца +* *MIN* - минимальное значение определённого столбца +* *AVG* - вычисление среднее значение столбца + +### Группировка данных (*GROUP BY*) + +> *GROUP BY* определяет, как строки будут группироваться, чтобы разделить их на логические наборы, благодаря чему становится возможном выполнение статических вычеслений отдельно в каждой группе + +```sql +SELECT age, SUM(salary) as sum FROM workers GROUP BY age; +-- Сумма зарплат для каждого возраста +-- *as sum* меняет название столбца на нужное нам (было бы так, как написанно (SUM(salary))) +``` + +### Оператор *HAVING* + +> Оператор *HAVING* позволяет определять условия выборки уже сгрупированных данных. *HAVING* применяется строго после GROUP_BY и может использовать результаты агрегатных функций + +```sql +SELECT model, COUNT(model) as Qty_model, AVG(price) as Avg_price +FROM PC +GROUP BY model +HAVING AVG(price) < 800; +-- Фильтрует столбцы, которые были бы выданы после GROUP BY +``` + +### Оператор *SORT BY* + +> *ORDER BY* используется для сортировки записей в наборе результатов запроса *SELECT*. Сортирует по возрастанию, но, если нужно сделать по убыванию, то используем *DESC* (от английского descending) + +```sql +SELECT * FROM Sumproduct ORDER BY Amount DESC, City +-- Значала сортирует по Amount по убыванию, потом по городу по возростанию +``` + +### *LIMIT* и *OFFSET* + +* *LIMIT* - макс количество выданных строк +* *OFFSET* - пропустить первые N строк + +### Общий вид + +```sql +SELECT столбцы +FROM ТАБЛИЦА +WHERE условие-фильтра +GROUP BY столбцы-для-группировки +HAVING фильтр-груп +ORDER BY столбцы для сортировки +LIMIT N +OFFSET K +``` + +```sql +SELECT name, AVG(salary) as avg_salary +FROM workers +GROUP BY name +HAVING name != 'JOHN' +ORDER BY avg_salary DESC +LIMIT 5 +OFFSET 3 +``` + +## Соединение и объединение таблиц + +### *JOIN* + +> *JOIN* позволяет соединения двух или более таблиц + +#### Виды + +* *JOIN* (только пересечение) +* *LEFT JOIN* (всё из первой и пересечение) +* *RIGHT JOIN* (всё из второй таблицы и пересечение) +* *FULL JOIN* (всё из обоих таблиц) + +#### Пример + +```sql +SELECT * FROM AUTHORS [LEFT/RIGHT/FULL/""] JOIN BOOKS +ON Author.id = Books.author_id +``` + +### *UNION* + +> Выводит результаты двух *SELECT*. Удаляет дубликаты, если не *UNION ALL*. Кол-во и названия строк должны быть одинаковыми + +#### Пример *UNION* + +```sql +SELECT val1 FROM table1 +UNION +SELECT val1 FROM table2 +``` + +### *INTERSECT* + +> Возвращает значения, которые выводят оба *SELECT*. Кол-во и названия строк должны быть одинаковыми. Синтаксис как у UNION + +### *EXCEPT* + +> Возвращает значения, которые выдал первый *SELECT*, но не второй. Кол-во и названия строк должны быть одинаковыми. Синтаксис как у UNION diff --git a/sql/compose.yaml b/sql/compose.yaml new file mode 100644 index 0000000..1c95102 --- /dev/null +++ b/sql/compose.yaml @@ -0,0 +1,12 @@ +services: + db: + image: postgres + environment: + - POSTGRES_USER=tester + - POSTGRES_PASSWORD=example123! + - POSTGRES_DB=testing + ports: + - 5432:5432/tcp + volumes: + - ./data:/var/lib/postgresql/data + restart: always diff --git a/sql/task1.sql b/sql/task1.sql new file mode 100644 index 0000000..7adfb9c --- /dev/null +++ b/sql/task1.sql @@ -0,0 +1,44 @@ +/* CREATE TABLE IF NOT EXISTS stations( + id INT CONSTRAINT firstkey PRIMARY KEY, + city VARCHAR(21), + state VARCHAR(21), + lat_n INT, + long_w int +); + +INSERT INTO stations VALUES (794, 'Kissee Mills', 'MO', 140, 73), +(824, 'Loma Mar', 'CA', 49, 131), +(603, 'Sandy Hook', 'CT', 72, 148), +(478, 'Tipton', 'IN', 34, 98), +(619, 'Arlington', 'CO', 75, 93), +(711, 'Turner', 'AR', 50, 101), +(839, 'Slidell', 'LA', 85, 152), +(411, 'Negreet', 'LA', 99, 105), +(588, 'Glencoe', 'KY', 46, 136), +(665, 'Chelsea', 'IA', 99, 60), +(342, 'Chignik Lagoon', 'AK', 103, 153), +(733, 'Pelahatchie', 'MS', 39, 28), +(441, 'Hanna City', 'IL', 51, 137), +(811, 'Dorrance', 'KS', 102, 122), +(698, 'Albany', 'CA', 50, 80), +(325, 'Monument', 'KS', 71, 142), +(414, 'Manchester', 'MD', 74, 37), +(113, 'Prescott', 'IA', 40, 66), +(971, 'Graettinger', 'IA', 95, 150), +(266, 'Cahone', 'CO', 116, 127), +(617, 'Sturgis', 'MS', 36, 126), +(495, 'Upperco', 'MD', 114, 30), +(473, 'Highwood', 'IL', 27, 151), +(756, 'Garden City', 'AL', 96, 105), +(225, 'Garden City', 'IA', 54, 119); +*/; +SELECT city, state FROM stations; +SELECT SUM(lat_n), SUM(long_W) FROM stations; +SELECT city FROM stations WHERE id % 2 = 0; +SELECT COUNT(city) - COUNT(DISTINCT(city)) FROM stations; +SELECT lat_n FROM stations WHERE lat_n BETWEEN 39 AND 137; +SELECT max(lat_n) FROM stations WHERE lat_n <= 137; +SELECT min(lat_n) FROM stations WHERE lat_n >= 39; +SELECT DISTINCT(city) FROM stations WHERE LOWER(RIGHT(city, 1)) in ('a', 'e', 'i', 'o', 'u', 'y'); +SELECT DISTINCT(city) FROM stations WHERE LOWER(RIGHT(city, 1)) IN ('a', 'e', 'i', 'o', 'u', 'y') AND LOWER(LEFT(city, 1)) IN ('a', 'e', 'i', 'o', 'u', 'y'); +SELECT DISTINCT(city) FROM stations WHERE LOWER(LEFT(city, 1)) NOT IN ('a', 'e', 'i', 'o', 'u', 'y'); diff --git a/sql/task2.sql b/sql/task2.sql new file mode 100644 index 0000000..550a5ae --- /dev/null +++ b/sql/task2.sql @@ -0,0 +1,47 @@ +DROP TABLE IF EXISTS Salary CASCADE; +CREATE TABLE Salary( + id INT PRIMARY KEY, + salary INT +); + +DROP TABLE IF EXISTS Positions CASCADE; +CREATE TABLE Positions( + id INT PRIMARY KEY, + title VARCHAR(255) +); + +DROP TABLE IF EXISTS People; +CREATE TABLE People( + id INT PRIMARY KEY, + name VARCHAR(255), + position_id INT REFERENCES Positions(id), + salary_id INT REFERENCES Salary(id) +); + +INSERT INTO Salary VALUES (1, 10000), (2, 20000), (3, 3000); +INSERT INTO Positions VALUES (1, 'Дизайнер'), (2, 'Редактор'), (3, 'Программист'); +INSERT INTO PEOPLE VALUES (1, 'Владмир', 1, 1), (2, 'Татьяна', 2, 2), (3, 'Александр', NULL, 2), (4, 'Борис', 2, NULL); + +SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People JOIN Positions on People.position_id = Positions.id; + +SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People RIGHT JOIN Positions on People.position_id = Positions.id; + +SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People LEFT JOIN Positions on People.position_id = Positions.id +EXCEPT +SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People JOIN Positions on People.position_id = Positions.id; + +SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People LEFT JOIN Positions on People.position_id = Positions.id +WHERE People.position_id ISNULL; + +SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People FULL JOIN Positions on People.position_id = Positions.id +WHERE Positions.id ISNULL OR People.id ISNULL; + +SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People LEFT JOIN Positions on People.position_id = Positions.id +UNION +SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People RIGHT JOIN Positions on People.position_id = Positions.id +EXCEPT +SELECT People.id, People.name, Positions.id as pos_id, Positions.title FROM People JOIN Positions on People.position_id = Positions.id; + +SELECT People.id, name, position_id, title, salary_id, salary FROM People +JOIN Positions on People.position_id = Positions.id +JOIN Salary ON People.salary_id = Salary.id; \ No newline at end of file diff --git a/sql/task3.sql b/sql/task3.sql new file mode 100644 index 0000000..d001bd2 --- /dev/null +++ b/sql/task3.sql @@ -0,0 +1,154 @@ +DROP TABLE IF EXISTS product; +CREATE TABLE product( + maker varchar(10), + model varchar(50) PRIMARY KEY, + type varchar(50) +); + +INSERT INTO product VALUES +('A', '1001', 'pc'), +('A', '1002', 'pc'), +('A', '1003', 'pc'), +('A', '2004', 'laptop'), +('A', '2005', 'laptop'), +('A', '2006', 'laptop'), +('B', '1004', 'pc'), +('B', '1005', 'pc'), +('B', '1006', 'pc'), +('B', '2007', 'laptop'), +('C', '1007', 'pc'), +('D', '1008', 'pc'), +('D', '1009', 'pc'), +('D', '1010', 'pc'), +('D', '3004', 'printer'), +('D', '3005', 'printer'), +('E', '1011', 'pc'), +('E', '1012', 'pc'), +('E', '1013', 'pc'), +('E', '2001', 'laptop'), +('E', '2002', 'laptop'), +('E', '2003', 'laptop'), +('E', '3001', 'printer'), +('E', '3002', 'printer'), +('E', '3003', 'printer'), +('F', '2008', 'laptop'), +('F', '2009', 'laptop'), +('G', '2010', 'laptop'), +('H', '3006', 'printer'), +('H', '3007', 'printer'); + +DROP TABLE IF EXISTS pc; +CREATE TABLE pc( + code INT PRIMARY KEY, + model varchar(50), + speed real, + ram smallint, + hd real, + price real +); + +INSERT INTO pc VALUES +(1, '1001',2.66,1024,250,2114), +(2, '1002',2.10,512,250,995), +(3, '1003',1.42,512,80,478), +(4, '1004',2.80,1024,250,649), +(5, '1005',3.20,512,250,630), +(6, '1006',3.20,1024,320,1049), +(7, '1007',2.20,1024,200,510), +(8, '1008',2.20,2048,250,770), +(9, '1009',2.00,1024,250,650), +(10, '1010',2.80,2048,300,770), +(11, '1011',1.86,2048,160,959), +(12, '1012',2.80,1024,160,649), +(13, '1013',3.06,512,80,529); + +DROP TABLE IF EXISTS laptop; +CREATE TABLE laptop( + code int PRIMARY KEY, + model varchar(50), + speed real, + ram smallint, + hd real, + screen real, + price real +); + +INSERT INTO laptop VALUES +(1, '2001', 2.00, 2048, 240, 20.1, 3673), +(2, '2002', 1.73, 1024, 80, 17.0, 949), +(3, '2003', 1.80, 512, 60, 15.4, 549), +(4, '2004', 2.00, 512, 60, 13.3, 1150), +(5, '2005', 2.16, 1024, 120, 17.0, 2500), +(6, '2006', 2.0, 2048, 80, 15.4, 1700), +(7, '2007', 1.83, 1024, 120, 13.3, 1429), +(8, '2008', 1.60, 1024, 100, 15.4, 900), +(9, '2009', 1.60, 512, 80, 14.1, 680), +(10, '2010', 2.00, 2048, 160, 15.4, 2300); + +DROP TABLE IF EXISTS printer; +CREATE TABLE printer( + code int PRIMARY KEY, + model varchar(50), + color boolean, + type varchar(10), + price real +); + +INSERT INTO printer VALUES +(1, '3001', true, 'ink-jet', 99), +(2, '3002', false, 'laser', 239), +(3, '3003', true, 'laser', 899), +(4, '3004', true, 'ink-jet', 120), +(5, '3005', false, 'laser', 120), +(6, '3006', true, 'ink-jet', 100), +(7, '3007', true, 'laser', 200); + + +SELECT model, speed, hd FROM pc WHERE price < 700; +SELECT DISTINCT maker FROM product WHERE type = 'printer'; +SELECT model, hd, screen FROM laptop WHERE price > 1000; +SELECT * FROM printer WHERE color; + +SELECT maker, speed FROM product JOIN laptop ON product.model = laptop.model +WHERE hd >= 10; +(SELECT product.model, price FROM product JOIN pc ON product.model = pc.model WHERE maker = 'B' +UNION +SELECT product.model, price FROM product JOIN laptop ON product.model = laptop.model WHERE maker = 'B' +UNION +SELECT product.model, price FROM product JOIN printer ON product.model = printer.model WHERE maker = 'B') ORDER BY model; +SELECT DISTINCT maker FROM product WHERE type = 'pc' +EXCEPT +SELECT DISTINCT maker FROM product WHERE type = 'laptop'; + +SELECT model FROM printer WHERE price = (SELECT MAX(price) FROM printer); +SELECT AVG(speed) FROM pc; +SELECT AVG(speed) FROM laptop WHERE price > 100; +SELECT AVG(speed) FROM product JOIN pc ON product.model = pc.model WHERE maker = 'A'; +SELECT DISTINCT maker, type FROM product WHERE maker in +(SELECT maker FROM product GROUP BY maker HAVING COUNT(DISTINCT type) = 1); + +SELECT hd FROM pc GROUP BY hd HAVING COUNT(hd) >= 2 ORDER BY hd; +SELECT model, speed FROM laptop WHERE speed < (SELECT MIN(speed) FROM pc); +SELECT maker, price FROM printer JOIN product ON printer.model = product.model WHERE price = (SELECT MIN(price) FROM printer WHERE color) AND color; +SELECT maker, AVG(screen) FROM laptop JOIN product ON laptop.model = product.model GROUP BY maker ORDER BY maker; +SELECT maker FROM product WHERE type = 'pc' GROUP BY maker HAVING COUNT(type) >= 3; + +SELECT maker, MAX(price) FROM product JOIN pc ON pc.model = product.model GROUP BY maker ORDER BY maker; +WITH MAX_PRICES as ( + SELECT MAX(price) as price FROM laptop UNION SELECT MAX(price) as price FROM pc UNION SELECT MAX(price) as price FROM printer +) +SELECT model FROM laptop WHERE price = (SELECT MAX(price) FROM MAX_PRICES) +UNION +SELECT model FROM PC WHERE price = (SELECT MAX(price) FROM MAX_PRICES) +UNION +SELECT model FROM printer WHERE price = (SELECT MAX(price) FROM MAX_PRICES); +WITH LEAST_RAM as ( + SELECT MIN(ram) as ram FROM pc +) +SELECT DISTINCT maker FROM product JOIN pc on product.model = pc.model WHERE +ram = (SELECT ram FROM LEAST_RAM) AND speed = (SELECT MAX(speed) FROM pc WHERE ram = (SELECT ram FROM LEAST_RAM)) +INTERSECT +SELECT DISTINCT maker FROM product WHERE type='printer'; +SELECT AVG(price) FROM (SELECT price FROM pc JOIN product ON pc.model = product.model WHERE maker = 'A' + UNION + SELECT price FROM laptop JOIN product ON laptop.model = product.model WHERE maker = 'A') as foo; diff --git a/sql/values.py b/sql/values.py new file mode 100644 index 0000000..cab13e8 --- /dev/null +++ b/sql/values.py @@ -0,0 +1,25 @@ +(794, 'Kissee Mills', 'MO', 140, 73), +(824, 'Loma Mar', 'CA', 49, 131), +(603, 'Sandy Hook', 'CT', 72, 148), +(478, 'Tipton', 'IN', 34, 98), +(619, 'Arlington', 'CO', 75, 93), +(711, 'Turner', 'AR', 50, 101), +(839, 'Slidell', 'LA', 85, 152), +(411, 'Negreet', 'LA', 99, 105), +(588, 'Glencoe', 'KY', 46, 136), +(665, 'Chelsea', 'IA', 99, 60), +(342, 'Chignik Lagoon', 'AK', 103, 153), +(733, 'Pelahatchie', 'MS', 39, 28), +(441, 'Hanna City', 'IL', 51, 137), +(811, 'Dorrance', 'KS', 102, 122), +(698, 'Albany', 'CA', 50, 80), +(325, 'Monument', 'KS', 71, 142), +(414, 'Manchester', 'MD', 74, 37), +(113, 'Prescott', 'IA', 40, 66), +(971, 'Graettinger', 'IA', 95, 150), +(266, 'Cahone', 'CO', 116, 127), +(617, 'Sturgis', 'MS', 36, 126), +(495, 'Upperco', 'MD', 114, 30), +(473, 'Highwood', 'IL', 27, 151), +(756, 'Garden City', 'AL', 96, 105), +(225, 'Garden City', 'IA', 54, 119) \ No newline at end of file