--- 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 обман іменами