---
tags: bcourse
---
# (завдання) Операційна семантика
## Переставити місцями вагони

## Переставити місцями жовтий і червоний
використовуючи тільки заливку та піпетку

## Переставити місцями іменa

## Алгоритм SWAP
Всі три перестановки вище записуються одним кодом:
```python=
temp = a
a = b
b = temp
```
Але всі вони *виконуються* по різному. Як саме?
## Заводські номери
У кожного об'єкта є заводський номер, який можна взнати через функцію `id()`.
І навпаки, все, що має заводський номер --- є об'єктом.
Всі заводські номери унікальні, не існує двох об'єктів з однаковими номерами.
## Яка операційна семантика SWAP в Пайтоні?
Треба експеримент!
## Чому цей алгоритм також міняє місцями числа?
```python=
### Алгоритм SWAP+
a = 10
b = 5
print(a, b) # 10 5
a = a + b
b = a - b
a = a - b
print(a, b) # 5 10
```
## Чи однакові це перестановки?
```python=
a, b = b, a
```
та
```python=
b, a = a, b
```
## Чи є це перестановкою?
```python=
a, b = a, b
```
## Чи однакові це перестановки?
```python=
b, a, c = a, b, c
```
та
```python=
a, c, b = c, b, a
```
## Скільки є різних перестановок для трьох імен?
Запиши їх всі.
## Питання для самоперевірки
:::info
1. Яка операційна семантика у алгоритму SWAP?
2. Чи відбуваються копіювання в алгоритмі SWAP?
3. Скільки створень, копіювань, імен та іменувань у цьому коді:
```python=
a = 10
b = a
a = 5
a = a + b
b = a - b
a = a - b
```
4. Скільки є різних перестановок серед двух імен? серед трьох імен?
5. Який буде результат виконання цього коду в трьох різних операційних семантиках?
```python=
a = [10, 20]
b = [1]
temp = a
a = b
b = temp
b.append(5)
b = a
a = temp
```
:::
## Завдання
Якщо щось не ясно по завданню, задавайте питання в чаті.
:::info
1. Створити Портфоліо на https://hackmd.io, зробити публічним та скинути посилання в чат.
2. Додати всі власні ідеї в розділ "Ідеї" в Портфоліо. Якщо є код, яким хочеш поділитись --- записати його в "Реалізації".
3. Записати відео, де коротко і по суті розповісти різницю між різними операційними семантиками та авторитетно пояснити яка з них використовується в Пайтоні. Додати відео в Портфоліо.
4. Встановити локально ipython (`pip install ipython`). Зробити запуск ipython по хоткею (через https://www.autohotkey.com/).
5. Вставновити локально Thonny (https://thonny.org/), для наступного уроку.
6. Скачати на телефон та пограти кілька рівнів гру **"Train Shunting Puzzle"**
- Android --- https://play.google.com/store/apps/details?id=com.dchistyakov.trainshunting&hl=en_US&gl=US
- iOS --- https://apps.apple.com/ua/app/train-shunting-puzzle/id1501306971
7. Вміти пояснити чому цей код також робить SWAP для чисел:
```python=
a = 10
b = 5
a = a ^ b
b = a ^ b
a = a ^ b
```
Якщо вмієш пояснити, додай це в Портфоліо --- бо це круто!
6. **(складно)** Написати код, який виведе на екран всі перестановки з N змінних
7. **(дуже складно)** Написати код, який методом перебору знайде всі можливі реалізації алгоритму SWAP. На вході він отримує:
- набір імен, які можна використовувати (`a`, `b`, `temp`)
- максимальна кількість кроків
- шаблони коду (`{} + {}`, `{} = {}`, `{} - {}`, `{}, {}`)
На виході --- список алгоритмів
:::