Knoledge_v0

This commit is contained in:
lambehorn
2025-12-19 13:39:24 +05:00
parent e97ecdf4dc
commit 422861cb0b
165 changed files with 2282 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
В [[curses]] есть возможность создавать специальный обьект для ввода текста.
Для ввода текста импортирутется специальный обьект textpad.
```python
from curses.textpad import Textbox
```

View File

@@ -0,0 +1,113 @@
В [[Curses]], существуют объекты, сразными параметрами, для разметки и ореинтации в консоли.
Ранее добавленный объект `stdscr`, является по сути объектом окна нашей консоли.
### Управление выводом текста
- `addch(y, x, ch[, attr])` – вывести символ.
- `addstr(y, x, str[, attr])` – вывести строку.
- `insstr([y, x,] str[, attr])` – вставить строку.
- `delch([y, x])` – удалить символ.
### Управление положением курсора
- `move(y, x)` – переместить курсор.
- `getyx()` – получить текущие координаты курсора.
- `getbegyx()` – координаты верхнего-левого угла окна.
- `getmyx()` – размеры окна (строки, колонки).
### Чтение ввода
- `getch([y, x])` – получить символ/код клавиши.
- `getkey([y, x])` – то же, но как строка (например `"KEY_LEFT"`).
- `getstr([y, x])` – считать строку.
- `nodelay(flag)` – включить/выключить неблокирующий ввод.
- `timeout(ms)` – задать таймаут ожидания ввода.
-
### Работа с экраном/окном
- `clear()` – очистить окно.
- `erase()` – стереть содержимое (похоже на `clear`, но без обновления).
- `refresh()` – обновить экран, показать изменения.
- `noutrefresh()` – отложенное обновление (для `doupdate()`).
- `redrawwin()` – перерисовать окно.
### Атрибуты и цвет
- `attron(attr)` – включить атрибут.
- `attroff(attr)` – выключить атрибут.
- `attrset(attr)` – установить атрибуты.
- `bkgd(ch[, attr])` – задать символ/атрибут фона.
- `bkgdset(ch[, attr])` – задать "фон по умолчанию".
- `color_pair(n)` – использовать цветовую пару.
### Управление окнами
- `subwin(nlines, ncols, begin_y, begin_x)` – создать подокно.
- `derwin(nlines, ncols, begin_y, begin_x)` – "деривативное" окно.
- `overlay(win)` – скопировать содержимое (не заменяя пробелы).
- `overwrite(win)` – полностью переписать.
- `box([vertch, horch])` – нарисовать рамку вокруг окна.
- `border([...])` – нарисовать рамку со своими символами.
### Прокрутка
- `scroll([n])` – прокрутить содержимое вверх.
- `scrollok(flag)` – разрешить/запретить автопрокрутку.
### Дополнительно
- `keypad(flag)` – включить/выключить поддержку функциональных клавиш.
- `idlok(flag)` – оптимизировать обновление при вставке/удалении строк.
- `leaveok(flag)` – разрешить оставлять курсор "где попало".
- `touchwin()` – пометить всё окно для перерисовки.
- `untouchwin()` – снять метки.
- `is_wintouched()` – проверить, есть ли изменения.
### Обьекты окон
В curses так же можно создавать окна отдельно от основного.
Вот несколько обьектов окон для разметки в curses:
#### newwin - обычное окно
- Создаётся функцией `curses.newwin(nlines, ncols, begin_y, begin_x)`.
- Можно сделать несколько таких окон в пределах `stdscr`.
- Каждый объект — независимый `_curses.window`.
Пример:
```python
win = curses.newwin()
```
#### subwin - подокно
- Создаётся как "срез" другого окна.
- Разделяет память с родительским окном: изменения в одном видны в другом.
- Удобно, если хочешь "разбить экран на части".
Пример:
```python
sub = stdscr.subwin(5, 20, 2, 5)
```
#### derwin - Дочернее окно
- Похоже на subwin, но привязано к координатам внутри родительского окна, а не всего экрана.
- Тоже разделяет буфер с родителем.
Пример:
```python
der = win.derwin(5, 20, 1, 1)
```
### newpad - Pad
- "Большое окно", которое может быть больше экрана.
- Сам не отображается, нужно явно указывать какую часть показывать через pad.refresh().
- Удобно для скроллинга длинных текстов, логов и т. п.
Пример:
```python
pad = curses.newpad(100, 100)
pad.refresh(pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)
```
где
- **`pminrow, pmincol`** — координаты внутри pad (откуда брать данные).
- **`sminrow, smincol`** — верхний левый угол области на экране, куда будет выведен кусок pad.
- **`smaxrow, smaxcol`** — нижний правый угол области на экране (включительно).

View File

@@ -0,0 +1,20 @@
Это библиотека написаная для языка [[Python]], которая позволяет писать консольные приложения.
# Начало
для того что бы консольное приложение запустилось необходимо импортировать библиотеку curses. Так же можно импортировать обьект wrapper, для удобства, который позволит обрабатывать ваше приложение, что по сути является оберткой.
```python
import curses
from curses import wrapper
```
Действия происходят внутри функции main, в котороую wrapper помещает объект - текущее окно консоли, с которым и происходит основное взаимодействие.
```python
def main(stdscr): # Созддаем функцию с объектом окна консоли stdscr
pass
wrapper(main) # Оборачиваем функцию в wrapper
```
# Возможности:
### [Оконные объекты](Curses%20-%20оконные%20объекты)

View File

@@ -0,0 +1,9 @@
Это алгоритм для упорядочивания элементов в массиве.
#### Виды алгоритмов сортировки
В [языках программирования](язык%20программирования) существует множество способов сортировки массива, у каждого своя область применения.
- [[Сортировка пузырьком]]
- [[Сортировка перемешиванием]]
- [[Сортировка вставками]]
- [[Блочная сортировка]]
- [[Быстрая сортировка]]
- [[Сортировка Шелла]]

View File

@@ -0,0 +1,2 @@
Это способ представления информации с помощью двух символов: 0 и 1.
Именно в таком виде компьютер хранит и обрабатывает любые данные: числа, текст, изображения, звук, программы. Двоичный код часто изпользуется в [языках программирования](Язык%20программирования).

View File

@@ -0,0 +1,32 @@
Это определение асимптотической сложности — того, как растут время или объём памяти при увеличении размера входных данных. Эта оценка используется для подсчета сложности выполнения функций в [языках программирования](Язык%20программирования).
Функция временной сложности в некоторых случаях может быть определена точно, но в большинстве своем это бессмысленно. Поэтому входные данные всегда $n\ ->\infty$.
## Время выполнение задачи
#### Полиномиальное время
Алгоритм типа: $O(n^k)$
Алгоритмы которые решаются за полиномиальное время. Практически решаемые задачи с реальными данным, сложность.
###### Характеристики:
- Рост времени - умеренный
- Предсказуемое и стабильное время работы
- Большинство классических алгоритмов работают за это время
- Не требуют перебора всех вариантов
- Можно применять оптимизации, динамическое программирование, жадные стратегии.
###### Примеры задач:
- Сортировка массива - $O(nlog(n))$
- Поиск кратчайшего пути - $O(n+m)$
- Умножение матриц - $O(n^3)$
- Проверка простаты - полиномиальный тест
#### Экспоненциальное время
Алгоритм типа $O(k^n),O(n!)$
Алгоритмы которые решаются за экспоненциальное время. Такие алгоритмы практически не решаемые с реальными данными.
###### Характеристики:
- Рост времени - взрывной
- Алгоритм часто основан на полном переборе вариантов
###### Примеры задач
- Перебор всех подмножеств $O(2^n)$
- Задача коммивояжера перебором - $O(n!)$
- Раскрытие графа brut force
- SAT полный перебор

View File

@@ -0,0 +1 @@
Это совокупность идей и понятий, которые определяют стиль написания программ на [языке программирования](Язык%20программирования). Стиль - это подход к решению задач, самые популярные это [императивный](Императивность) и [декларотивный](Декларотивность).

View File

@@ -0,0 +1,54 @@
Компьютер воспринимает все данные в виде [двоичного кода](двоичный%20код), в том числе из цифры
## Представление целых чисел
#### 1. Натуральные числа (unsignet)
Диапазон значений:
$N=\begin{cases}N\geqslant0\\ N<2^N\end{cases}$ - где N число бит. $2^N-1$ - Максимальное число
`Пример: 13 в 8 битной системе, это - 1101`
#### 2. Целые числа (signet)
Есть три системы представления отрицательных чисел:
1. Прямой код (sign-magnitude) - меняем последний бит числа в системе разрядности на 1, для отрицательных чисел, тем самым отмечая число как "отрицательное"
Данная система используется для обучения, но в компьютере числа так не хранятся
`Пример: 33 (16 bit) = 100001; -33 (16 bit) = 1000000000100001`
2. Обратный код (one\`s complement) - реверсивно записываем биты, для отрицательных чисел, меняя 0 на 1 и наоборот.
Данная система так же не используется в компьютере
`Пример: 33 (16 bit) = 100001; -33 (16 bit) = 1111111111011110`
3. Дополнительный код (two\`s compliment) - реверсивно записываем биты, для отрицательных чисел, меня 0 на 1 и наоборот, а так же сдвигаем все числа, увеличивая на 1 бит.
Такая система используется во всех современных компьютерах, она удобна для вычислений.
`Пример: 33 (16 bit) = 100001; -33 (16 bit) = 1111111111011111`
## Перевод чисел в двоичную систему счисления
1. Перевод из 10 в 2:
1. Раскладываем числа на сумму степеней двоек
$13=8+4+1=2^3+2^2+2^0$ (8 bit, из 2 в 10)
2. Каждой степени двойки приравниваем порядковый бит
$0_7 0_6 0_5 0_4 0_3 0_2 0_1 0_0$
$2^3+2^2+2^0 = 0_7 0_6 0_5 0_4 1_3 1_2 0_1 1_0$
2. Перевод из $2^N$ в 2:
1. Раскладываем число на составляющие цифры:
$123_{16}=1_2 2_1 3_0$ (16 bit, из 16 в 2)
2. Каждую цифру приравниваем к N битам в двоичном коде
$\begin{cases}1_2=0001\\ 2_1=0010\\ 3_0=0011\end{cases}=>1|0010|0011_2$
3. Перевод из N в 2:
1. Переводим число из N в 10
$123_7=1\cdot7^2+2\cdot7^1+3\cdot7^0=66_10$ (8bit, из 7 в 2)
2. Переводим из 10 в 2
$66_10=64+2=2^6+2^1=1000010_2$
## Перевод чисел из двоичной системы счисления
1. Перевод из 2 в 10:
1. Каждой степени двойки приравниваем порядковый бит
$0_7 0_6 0_5 0_4 0_3 0_2 0_1 0_0$
$0_7 0_6 0_5 0_4 1_3 1_2 0_1 1_0=2^3+2^2+2^0$ (8bit, из 2 в 10)
2. Раскладываем числа на сумму степеней двоек
$2^3+2^2+2^0=8+4+1=13$
2. Перевод из 2 в $2^N$:
1. Раскладываем число на составляющие N биты:
$1|0010|0011_2=>\begin{cases}1_2=0001\\ 2_1=0010\\ 3_0=0011\end{cases}$ - (16 bit, из 16 в 2)
2. Собираем из полученных цифр число
$1_2 2_1 3_0=123_{16}$
3. Перевод из 2 в N
1. Переводим из 2 в 10:
$1000010_2=64+2=2^6+2^1=66_10$ - (8bit, из 2 в 7)
2. Переводим число из N в 10
$66_10=1\cdot7^2+2\cdot7^1+3\cdot7^0=123_7$

View File

@@ -0,0 +1 @@
совокупность правил, определяющих смысл [синтаксически](Синтаксис) корректных конструкций [языка](Язык%20программирования).

View File

@@ -0,0 +1 @@
Совокупность правил, определяющих допустимые конструкции [языка](Язык%20программирования). В отличи от [семантики](Семантика)

View File

@@ -0,0 +1,2 @@
Это динамическая структура данных python информация в которой хранится в виде пары: "ключ": "значение"
значения повторяться могут, ключи - нет.

View File

@@ -0,0 +1,2 @@
Это алгоритм, в котором элементы входной последовательности просматриваются по одному, и каждый новый поступивший элемент размещается в подходящее место среди ранее упорядоченных элементов. [Сложность алгоритма](Оценка%20сложности%20алгоритма): $O(n^2)$.
#### Алгоритм

View File

@@ -0,0 +1,29 @@
Сортировка перемешиванием, или шейкерная сортировка, или двунаправленная - разновидность [Сортировки пузырьком](Сортировка%20пузырьком). [Сложность алгоритма](Оценка%20сложности%20алгоритма): $O(n^2)$.
#### Алгоритм
Анализируя метод пузырьковой сортировки, можно отметить два обстоятельства.
1. Во-первых, если при движении по части массива перестановки не происходят, то эта часть массива уже отсортирована и, следовательно, её можно исключить из рассмотрения.
2. Во-вторых, при движении от конца массива к началу минимальный элемент «всплывает» на первую позицию, а максимальный элемент сдвигается только на одну позицию вправо.
#### Пример
![[sort_shaker.gif]]
#### В виде кода
```python
def shaker_sort(a):
n = len(a)
left = 0
right = n - 1
while left < right:
# Проход слева направо
for i in range(left, right):
if a[i] > a[i + 1]:
a[i], a[i + 1] = a[i + 1], a[i]
right -= 1
# Проход справа налево
for i in range(right, left, -1):
if a[i] < a[i - 1]:
a[i], a[i - 1] = a[i - 1], a[i]
left += 1
```

View File

@@ -0,0 +1,19 @@
сортировка простыми обменами, метод сортировки обменами. По сравнению с другими алгоритмами считается простейшим для понимания и реализации. Эффективен для массивов небольшого размера. n - размер массива, количество элементов массива. [Сложность алгоритма](Оценка%20сложности%20алгоритма): $O(n^2)$.
#### Алгоритм
Выполняется некоторое количество проходов по массиву - начиная от начала массива, перебираются пары соседних элементов массива. Если 1-й элемент пары больше 2-го, элементы переставляются (выполняется обмен).
Пары элементов массива перебираются (проходы по массиву повторяются) либо $(n-1)$ раз, либо до тех пор, пока на очередном проходе не обнаружится, что более не требуется выполнять перестановки (обмены) (массив отсортирован).
При каждом проходе алгоритма по внутреннему циклу очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим «наибольшим элементом», а наименьший элемент перемещается на одну позицию к началу массива (как бы «всплывает» до нужной позиции, как пузырёк в воде - откуда и название алгоритма
#### Пример
![[sort_bubble.gif]]
#### В виде кода
```python
def bubble_sort(a):
n = len(a)
for i in range(n):
for j in range(0, n - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
```

View File

@@ -0,0 +1,34 @@
Это два разных подхода к тому, как [языки программирования](Язык%20программирования) работают с [типами данных](Типы%20данных.md) (числа, строки, списки и т.п.).
## Статическая типизация
Тип переменной известен на этапе компиляции, до запуска программы.
Примеры языков: C, C++, Java, Rust, Go, C#.
#### Особенности
- Типы переменных объявляются заранее.
- Ошибки несоответствия типов обнаруживаются **до запуска**.
- Код работает быстрее.
- Программист должен строго следить за типами.
### Плюсы
- Раннее обнаружение ошибок.
- Быстрая работа.
- Легче оптимизировать.
### Минусы
- Много “служебного” кода.
- Менее гибко.
## Динамическая типизация
**Тип переменной определяется во время выполнения программы**.
Примеры: **Python, JavaScript, Ruby, PHP, Lua**.
#### Особенности
- Можно присвоить переменной значение любого типа.
- Ошибки типов проявляются только во время выполнения.
- Код гибче и короче.
### Плюсы
- Гибкость.
- Быстрая разработка.
- Меньше кода.
### Минусы
- Ошибки типов могут проявиться поздно.
- Немного медленнее, потому что типы проверяются на ходу.

View File

@@ -0,0 +1,23 @@
Это способ хранения данных (тех же переменных) в памяти компьютера, который позволяет эффективно организовать работу функций с данными.
## Типы структур данных
1. Простые
- Числовые
- Символьные
- Логические
- Интервалы
- Указатели
2. Статические
- Векторы
- Массивы
- Множества
- Таблицы
3. Полустатические
- Стеки
- Деки
- Срезы
- Строки
4. Динамические
- Списки
- Графы
- Деревья

View File

@@ -0,0 +1,8 @@
Типы данных обеспечивают удобную работу в [языке](Язык%20программирования), помогая программисту писать код, а так же различать компилятору сколько памяти выделять под ту или иную переменную, какие операции с ней можно производить, какое значение может храниться.
## Примитивные типы данных
- Целые числа
- Вещественные числа
- Логические типы
- Символы
- Строки

View File

@@ -0,0 +1 @@
Язык программирования — это формальный язык, с помощью которого человек может давать компьютеру инструкции (алгоритмы) в виде программ. Он определяет [[синтаксис]] (как пишутся команды) и [семантику](Семантика) (как они выполняются). Так же стиль программирования называемый [[Парадигма программирования]]