---
# System prepended metadata

title: Дуже багато коробочок
tags: [book]

---

---
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, .. .
- машини, коли припарковані біля дороги, стоять в порядку. Це --- список припаркованих машин
- клавіші на клавіатурі організовані в ряди, і кожен ряд --- це список клавіш. Та й ряди тоді --- список рядів клавіш
- пальці на руці ростуть в ряд. Це --- список пальців
- полоси на пішохідній "зебрі" малюються в певному порядку --- біла, червона, біла, червона,... (або біла і безколірна). Це список полос "зебри"
- години на циферблаті годинника з стрілочками розміщені по кругу, але в послідовності. Це --- список годин. По такому ж принципу є список місяців та список днів тижня
:::

&nbsp;
Це один з прикладів, як магія проявляється у реальному світі --- організованість у ряд. Але магія проявляється також у синтетичному світі, створеному людською думкою. І не менш часто.

Прочитай, запам'ятай. Можливо деякі з цих списків тобі доведеться використовувати в подальшому навчанні!

:::spoiler Синтетичні списки
- список контактів в телефоні
- різні списки чисел: послідовність випадкових чисел, список всіх парних чисел, список квдаратів чисел, послідовність Фібоначчі, ... мільйони їх
- список букв у слові (у будь-якому слові)
- послідовність символів при наборі на клавіатурі
- послідовність рядків символів при наборі на клавіатурі (це ті, які розділяються натисненням на Enter)
- список пунктів в цьому списку. Хоч цей список не нумерований, але тим не менш у його елементів є певний порядок представлення. І якщо переставити місцями два пункти, то це уже буде інший, але все-рівно список
- послідовність біт у байті
    - послідовність байт на флешці
    - послідовність файлових нод у файловій системі
    - послідовність байт у файлі
- послідовність акордів в пісні
    - послідовність тривалостей акордів в пісні
    - послідовність тривалостей пауз в пісні
- послідовність кроків алгоритму
- порядок, в якому створюються нові імена або коробочки
- список з одного елементу. Так, магія дозволяє перетворювати коробочку в список з однієї коробочки. Коробочка і список з однієї коробочки --- різні речі
- порожній список, список в якому немає елементів. Як його уявити? Ну, це як уявити дірку від бублика.
:::

&nbsp;

:::info
**Завдання**: тільки що було описано багато різних списків. Пора перевірити твою пам'ять! Згадай і запиши ті списки, що запам'яталися. Потім звірся і зроби собі помітки про які списки було забуто.
&nbsp;

Було би ідеально, якби ти придумав також інші приклади списків!
:::

### Список букв

Список чисел --- це цікаво, але поки-що не дуже. Давай спершу поговоримо про найпростіші списки букв --- слова та рядки. Отже, глянь на наступний [реальний код на Пайтон](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
        '''
```
Ось такий от "невидимий" символ!
:::
&nbsp;
:::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. &nbsp;
    ```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 обман іменами