---
# System prepended metadata

title: (завдання) Операційна семантика
tags: [bcourse]

---

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

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

![](https://i.imgur.com/dIAqRWc.jpg)

## Переставити місцями жовтий і червоний

використовуючи тільки заливку та піпетку

![](https://i.imgur.com/CaFlANZ.png)

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

![](https://i.imgur.com/tEw2H5Z.png)

## Алгоритм 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`)
    - максимальна кількість кроків
    - шаблони коду (`{} + {}`, `{} = {}`, `{} - {}`, `{}, {}`)
      На виході --- список алгоритмів
:::