---
tags: book
---
# Дуже багато коробочок
:::warning
Придумувати імена для коробочок цікаво, поки їх небагато. Але якщо коробочок 100, 1000, мільярд? Тоді потрібний інший спосіб управління великою кількістю коробочок.
:::
У розділі про магію SWAP я наводив приклад з 5-ма коробочками:
```
x5, x4, x3, x2, x1 = x1, x2, x3, x4, x5
```
Це --- перший приклад як непридумувати імена для коробочок, просто додавай порядковий номер до одного імені.
Але навіть це можна спростити, щоправда доведеться перевчитись рахувати. Магія потребує жертв.
### Рахувати з нуля
Нормальні люди рахують з одиниці. Один, два, три, чотири, .... Або, перший, другий, третій, четвертий, ...
Тобі доведеться навчитись рахувати з нуля. Нуль, один, два, три.... Або, нульовий, перший, другий, третій, ... Назвемо такий спосіб рахування *індексацією*. Індекс 0, індекс 1, індекс 2, індекс 3, ...
Тепер до справи. Ось список чисел:
```
4, 5, 0, 1, 6, 3, 2, 2, 9
```
:::info
**Питання**:
1. яке число знаходиться по індексу 0?
- ... по індексу 2?
- ... по індексу 5?
2. який індекс у числа 0?
- ... у числа 9?
- ... у числа 2?
3. яке число буде знаходитись по індексу 0, якщо вирізати з списку останній елемент?
- ... якщо вирізати нульовий індекс?
- ... якщо вирізати перший індекс?
4. якщо зробити одночасно два вирізання --- вирізати нульовий індекс і другий індекс --- яке число буде знаходитись по індексу 2?
- ... по індексу 1?
- ... по індексу 8?
5. якщо зробити ПОСЛІДОВНО, один за одним два вирізання --- вирізати нульовий індекс, а потім з результату вирізати другий індекс --- яке число буде знаходитись по індексу 2?
- ... по індексу 1?
- ... по індексу 6?
6. назви індекси, які треба одночасно вирізати, щоб по індексу 3 стало знаходитись число 3.
7. назви індекси, які треба ПОСЛІДОВНО, один за одним вирізати, щоб по індексу 1 стало знаходитсь число 9.
:::
:::spoiler Перевір себе
1. 4, бо 0-ий індекс --- це перший в нормальному підрахунку
- 0, бо 2-ий індекс --- це третій по нормальному
- 3, бо 5-ий індекс --- це шостий елемент по нормальному
2. 2, бо нуль --- третій елемент, а отже індекс другий
- 8, це останній, дев'ятий елемент, а отже індекс восьмий
- в списку два таких числа, тому відповідь --- індекси 6 та 7
3. 4, вирізання останнього елементу не змінює позиції інших елементів
- 5, бо позиції елементів зміняться, все зсунеться на 1 індекс вліво
- 4, бо хоч позиції зміняться, але для всіх елементів окрім нульового
4. 6, бо після вирізання у нас вийде список `5, 1, 6, 3, 2, 2, 9`
- 1
- такого індексу уже не буде. Оскільки ми вирізаємо 2 елементи, то всього елементів стає 7, а отже максимальний індекс --- 6
5. 6, бо після першого вирізання ми отримаємо список `5, 0, 1, 6, 3, 2, 2, 9`, а після другого --- `5, 0, 6, 3, 2, 2, 9`
- 0
- 9
6. тут є багато варіантів, один з них --- вирізати індекси 3 та 4 (числа 1 та 6), або вирізати індекси 0 та 1, короче будь-які 2 індекси які менше 5
7. тут також є багато варіантів, один з них --- послідовно вирізати нульовий індекс, зробити так 7 разів; інший варіант послідовно вирізати індекси 7, 6, 5, 4, 3, 2, 1 --- тоді число 9 буде зсуватись вліво на місце вирізаного доки не дійде до індексу 1.
:::
### Натуральний та синтетичний список
Тепер, коли ти розумієш що таке рахувати "з нуля", поринемо у реальний світ. Багато об'єктів *в ряд* утворюють список. Ключове слово тут --- "в ряд", бо просто багато об'єктів --- це не список. Зовсім не обов'язково, щоб об'єкти були різними, але обов'язково щоб вони були в чіткому порядку.
Особисто я бачу списки повсюди в реальному світі. Їх так багато, що я сховав їх під спойлер. Відкрий його і прочитай, думаю, багато з цього тобі знайомо.
:::spoiler Натуральні списки
- діти в садочку, коли збираються в колону, стають по двоє. В цьому випадку діти шикуються у список пар, і кожна пара --- це також маленький список з двох елементів
- РНК коронавірусу, в якій записано генетичний код цього вірусу, містить нуклеотиди в певній послідовності. Цих нуклеотидів є 4 різних, і якщо їх записати буквами ATGC, то цей код починається так: `ATTAAAGGTTTATACCTTCCCAGG...`. Це --- список нуклеотидів.
- сторінки в книзі склеєні в певному порядку. Це --- список сторінок
- роки йдуть один за одним. Це --- список років. Цікаво, що ми не знаємо який рік був перший, тому люди роблять такий хак: розділили всі роки на дві частини, одну назвали "до різдва Христового", іншу назвали "після різдва Христового", і так з одного списку зробили 2. Перший список починається з років -1, -2, -3, -4, ..., а другий --- починається з років 1, 2, 3, .. .
- машини, коли припарковані біля дороги, стоять в порядку. Це --- список припаркованих машин
- клавіші на клавіатурі організовані в ряди, і кожен ряд --- це список клавіш. Та й ряди тоді --- список рядів клавіш
- пальці на руці ростуть в ряд. Це --- список пальців
- полоси на пішохідній "зебрі" малюються в певному порядку --- біла, червона, біла, червона,... (або біла і безколірна). Це список полос "зебри"
- години на циферблаті годинника з стрілочками розміщені по кругу, але в послідовності. Це --- список годин. По такому ж принципу є список місяців та список днів тижня
:::
Це один з прикладів, як магія проявляється у реальному світі --- організованість у ряд. Але магія проявляється також у синтетичному світі, створеному людською думкою. І не менш часто.
Прочитай, запам'ятай. Можливо деякі з цих списків тобі доведеться використовувати в подальшому навчанні!
:::spoiler Синтетичні списки
- список контактів в телефоні
- різні списки чисел: послідовність випадкових чисел, список всіх парних чисел, список квдаратів чисел, послідовність Фібоначчі, ... мільйони їх
- список букв у слові (у будь-якому слові)
- послідовність символів при наборі на клавіатурі
- послідовність рядків символів при наборі на клавіатурі (це ті, які розділяються натисненням на Enter)
- список пунктів в цьому списку. Хоч цей список не нумерований, але тим не менш у його елементів є певний порядок представлення. І якщо переставити місцями два пункти, то це уже буде інший, але все-рівно список
- послідовність біт у байті
- послідовність байт на флешці
- послідовність файлових нод у файловій системі
- послідовність байт у файлі
- послідовність акордів в пісні
- послідовність тривалостей акордів в пісні
- послідовність тривалостей пауз в пісні
- послідовність кроків алгоритму
- порядок, в якому створюються нові імена або коробочки
- список з одного елементу. Так, магія дозволяє перетворювати коробочку в список з однієї коробочки. Коробочка і список з однієї коробочки --- різні речі
- порожній список, список в якому немає елементів. Як його уявити? Ну, це як уявити дірку від бублика.
:::
:::info
**Завдання**: тільки що було описано багато різних списків. Пора перевірити твою пам'ять! Згадай і запиши ті списки, що запам'яталися. Потім звірся і зроби собі помітки про які списки було забуто.
Було би ідеально, якби ти придумав також інші приклади списків!
:::
### Список букв
Список чисел --- це цікаво, але поки-що не дуже. Давай спершу поговоримо про найпростіші списки букв --- слова та рядки. Отже, глянь на наступний [реальний код на Пайтон](https://github.com/Manisso/fsociety/blob/56ab0443c2ee79a30681c3c3f27d011e1c66044f/fsociety.py#L87-L94):
```python=
fsocietylogo = '''
d88888b .d8888. .d88b. .o88b. d888888b d88888b d888888b db db
88' 88' YP .8P Y8. d8P Y8 `88' 88 88 `8b d8'
88ooo `8bo. 88 88 8P 88 88ooooo 88 `8bd8'
88 `Y8b. 88 88 8b 88 88 88 88
88 db 8D `8b d8' Y8b d8 .88. 88. 88 88
YP `8888Y' `Y88P' `Y88P' Y888888P Y88888P YP YP
'''
```
Що ти бачиш?
По-перше, добре видно англійські букви F, S, O, C, I, E, T, Y, які утворюють слово "FSOCIETY". Порядок букв важливий, бо, наприклад, "CITY*FOES*" має ті самі букви, але читається по іншому. В словах важливий **порядок** букв, і це <ins>основна</ins> властивість списку.
По-друге, видно що великі букви складені з менших символів. Наприклад, перший рядок виглядає так:
```
d88888b .d8888. .d88b. .o88b. d888888b d88888b d888888b db db
...........................................................................
```
Я проставив крапки під символами, щоб було добре видно --- де символи є, а де порожні місця. Порожні місця (пробіли), хоч і не читаються, але несуть інформацію. Без пробілів неможливо було би зробити великі букв ичитаємими. Це в людській мові між словами один пробіл, а в мові магії кожен пробіл може нести інформацію. Ось що буде, якщо ставити пробіли по правилам української мови:
```
d88888b .d8888. .d88b. .o88b. d888888b d88888b d888888b db db
88' 88' YP .8P Y8. d8P Y8 `88' 88 88 `8b d8'
88ooo `8bo. 88 88 8P 88 88ooooo 88 `8bd8'
88 `Y8b. 88 88 8b 88 88 88 88
88 db 8D `8b d8' Y8b d8 .88. 88. 88 88
YP `8888Y' `Y88P' `Y88P' Y888888P Y88888P YP YP
```
Символи ті ж, порядок той же, але забули про "лишні" пробіли. Інформація втрачена!
Але вернемося до рядку
```
d88888b .d8888. .d88b. .o88b. d888888b d88888b d888888b db db
...........................................................................
```
:::info
**Питання**:
- якщо рахувати з нуля, то який індекс першої букви першого "слова" (першого непробілу)?
- як простіше всього порахувати довжину цього рядка? ... Ну якщо ти знаєш простий спосіб, то скажи скільки нарахував
- тепер, коли знаєш довжину рядка, який індекс у останнього символа?
:::
Тепер, зауваж що існує ще один "невидимий" символ. Він називається "перевід каретки", "новий рядок", "line carriage", "newline". Без цього невидимого символу FSOCIETY приклад виглядав би так:
```
d88888b .d8888. .d88b. .o88b. d888888b d88888b d888888b db db 88' 88' YP .8P Y8. d8P Y8 `88' 88 88 `8b d8' 88ooo `8bo. 88 88 8P 88 88ooooo 88 `8bd8' 88 `Y8b. 88 88 8b 88 88 88 88 88 db 8D `8b d8' Y8b d8 .88. 88. 88 88 YP `8888Y' `Y88P' `Y88P' Y888888P Y88888P YP YP
```
Ну як, можна розпізнати оригінальний ASCII-арт? Не можна! Інформація втрачена, хоча було видалено всього лиш... А зачекай, це цікаве завдання!
:::info
**Питання**: скільки я видалив переводів каретки з FSOCIETY прикладу?
:::
:::spoiler Перевір себе
Видалив 7 штук. Щоб це було помітно, я повторю приклад але поставлю комбінацію символів `\n` в кінці кожного рядка, щоб було видно де є перевід рядка:
```python=
fsocietylogo = '''\n
d88888b .d8888. .d88b. .o88b. d888888b d88888b d888888b db db\n
88' 88' YP .8P Y8. d8P Y8 `88' 88 88 `8b d8'\n
88ooo `8bo. 88 88 8P 88 88ooooo 88 `8bd8'\n
88 `Y8b. 88 88 8b 88 88 88 88\n
88 db 8D `8b d8' Y8b d8 .88. 88. 88 88\n
YP `8888Y' `Y88P' `Y88P' Y888888P Y88888P YP YP\n
'''
```
Ось такий от "невидимий" символ!
:::
:::warning
**Мораль: будь уважним!** Якщо чогось не видно очима, це не означає що цього немає.
І хоч в цьому курсі я не буду розповідати, що таке **інформація**, обов'язково в майбутньому взнай, що це таке. Її можна виміряти, її можна зберігати, нею можна керувати, вона є реальним ресурсом у світі конструктивної магії.
:::
### Магія невидимих символів
Символи [` `] (пробіл) та [`\n`] (новий рядок) записуються в коді як вказано в квадратних дужках, але відображаються на екрані як записано в круглих дужках. Це створює два нових феномени:
- показати як рядок буде виглядати на екрані
- перетворити вигляд на екрані в один рядок
І хоч комп'ютер може справитись з обома завданнями, він не може "придумати" гарний рядок. "Придумати" --- це завдання людини, тобто твоє (сподіваюсь штучний інтелект не образиться, що я для нього книжки не пишу). Перед тим придумувати, давай спробуємо зрозуміти як ці феномени відбуваються.
**Приклад 1**. Цей рядок записано мовою Пайтон:
```python=
plus = " ▉▉ \n▉▉▉▉▉▉\n ▉▉"
```
В ньому є 2 символи `\n`, це означає що в двух місцях буде перевід на новий рядок. На екрані це буде виглядати так:
```
▉▉
▉▉▉▉▉▉
▉▉
```
(якщо цікаво де знайти схожі символи, то я знайшов їх в Вікіпедії --- [Box-drawing characters](https://en.wikipedia.org/wiki/Box-drawing_character).)
**Приклал 2**. Цей рядок записано мовою Пайтон:
```python=
tri = "*****\n ****\n ***\n **\n *"
```
Буде виглядати так:
```
*****
****
***
**
*
```
:::info
**Завдання**: як будуть виглядати ці рядки на екрані?
1.
```python
box = "╭┬┬┬┬╮\n├ ┼ ┤\n╰┴┴┴┴╯"
```
2. `asd`
3. `asda`
:::
### TODO список контактів
Натуральний та синтетичний списки
### TODO: Список родичів
### TODO: зміна елементу списку
### TODO: зміна тентакля-елемента списку
### TODO: виделка -- об'єкт два рази в списку
## Потоки магії
### TODO: Прямий детектив
### TODO: Зворотній детектив
### життя імені, життя коробочки
### read only after write, not otherwise
Тут проблема
```python=
b = c
c = 2
```
### TODO: візуалізація потоку
### TODO: візуалізація значень біля їх нотацій
### Питання по коробочкам
1. уточнити в 3 свапі числа в коробочках
2. можливо завдання на уяву чисел
3. 5 разів --- важливий момент
4. дублює переміщення
5. None i Temp -- перемістити вище по списку
6. неймінг для темп
7. свап --- це
8. заводські номера --- неясно що це адреси памяті
9. перенести алгоритм з свапом в розділ нижче
10. не запускала id
11. підказка з 1000 коробочками є цікавою, але не поясненою
12. кращий друг --- забагато нових слів
## TODO функції
Вибери, які з нище наведених прикладів ти хотів би знати як вони робляться в коді.
## TODO SWAP
Чи однаковий це код?
```python=
c, a, b = a, b, c
```
та
```python=
c = a
a = b
b = c
```
?
## TODO обман іменами