code concept of UiUa #2
концепция программирования на uiua
https://www.uiua.org/pad


概念
番組
2
code concept of UiUa
program 01: массив с удвоением нулей
-
массив = [1,0,2,3,0,4,5,0]
-
преобразовать = [1,0,0,2,3,0,0,4,5,0,0]
-
обрезать = [1,0,0,2,3,0,0,4]
-
ответ = [1,0,0,2,3,0,0,4]
-
время 20 минут
-
любой язык
note: write code as a function
input
output
def duplicate_zeros(arr):
result = []
for num in arr:
result.append(num)
if num == 0:
result.append(0)
if len(result) >= len(arr):
break
return result[:len(arr)]
arr = [1, 0, 2, 3, 0, 4, 5, 0]
result = duplicate_zeros(arr)
print(result)code concept of UiUa
program 01: массив с удвоением нулей
note: 144 байт в памяти
code concept of UiUa
program 01: массив с удвоением нулей

-
создать маску = [0 1 0 0 1 0 0 1]
-
изменить маску = [1 2 1 1 2 1 1 2]
-
изменить массив по маске
-
взять элементов сколько надо
code concept of UiUa
program 01: массив с удвоением нулей

создать маску


изменить маску

изменить массив по маске
взять элементов сколько надо
note: 92-192 байт в памяти
code concept of UiUa
program 01: массив с удвоением нулей



code concept of UiUa
program 02: проверка на x-массив
-
есть массив n на n элементов
-
проверка: на диагоналях != 0
-
проверка: на других местах = 0
-
время 20 минут
-
любой язык
note: write code as a function
code concept of UiUa
program 02: проверка на x-массив
-
создать маску размером как массив
-
у маски на диагоналях 1, остальное 0
-
массив преобразуем в 0 и 1
-
сравниваем массив и маску

code concept of UiUa
program 02: проверка на x-массив

копия массива, длина, массив

копия массива, применить = ко всем


code concept of UiUa
program 02: проверка на x-массив
копия, разворот, максимум



code concept of UiUa
program 02: проверка на x-массив

меняемся местами, на стек 1

единичка
исходный массив
маска
code concept of UiUa
program 02: проверка на x-массив

минимум из 1 и исходного массива

совпадение маски и массива?

code concept of UiUa
program 02: проверка на x-массив


code concept of UiUa
program 03: сумма квадратов
-
есть массив [2, 7, 1, 19, 19, 3]
-
длина массива = 6
-
возвести элементы в квадрат
-
найти их сумму
-
индекс*** делится на длину
-
делится 1,2,3,6
-
время 20 минут
-
любой язык
code concept of UiUa
program 03: сумма квадратов

-
создать массив индексов
-
оставить те, которые % длину
-
оставить элементы = им
-
возвести их в квадрат
-
сложить
code concept of UiUa
program 03: сумма квадратов

копия, длина, копия, массив

была копия
была копия

+1 к массиву

code concept of UiUa
program 03: сумма квадратов

если % 6, то 0, если =0, то 1



code concept of UiUa
program 03: сумма квадратов

умножаем два массива



в квадрат и сложить

code concept of UiUa
program 03: сумма квадратов


code concept of UiUa
program 04: теорема пифагора
-
дан треугольник с углом 90°
-
даны два катета (два числа)
-
найти гипотенузу
-
время 20 минут
-
любой язык
note: write code as a function
code concept of UiUa
program 04: теорема пифагора

variant #1


склеить два числа в массив

возвести в квадрат

сложить

извлечь корень
code concept of UiUa
program 04: теорема пифагора
variant #2

-
склеить два числа в массив
-
продублировать
-
умножить массив на массив
-
свернуть через +
-
извлечь корень
code concept of UiUa
program 04: теорема пифагора
variant #3


variant #4
code concept of UiUa
program 04: теорема пифагора

склеить в массив и работать с ним
вызвать 1 функцию для 2 наборов



code concept of UiUa
program 05: стандартное отклонение
-
массив чисел [1,2,3,4,5]
-
среднее значение = (1+2+3+4+5)/5=3
-
дисперсия = ((1-3)²+...(5-3)²)/5=2
-
отклонение = корень(2) = 1.42
-
время 20 минут
-
любой язык
note: write code as a function

code concept of UiUa
program 05: стандартное отклонение

-
копия, копия массива (3 массива)
-
свернуть один массив через + (15)
-
поменять местами значения в стеке
-
найти длину массива (5)
-
разделить свертку (15) на длину (5) = 3

code concept of UiUa
program 05: стандартное отклонение
-
добавили операцию "минус"
-
массив преобразовался
-
внутри значения ± от среднего (3)
-
для 1 это значение -2
-
для 4 это значение +1



code concept of UiUa
program 05: стандартное отклонение
-
добавили операцию "в квадрат"
-
массив преобразовался
-
внутри квадраты отклонений (3)
-
(они не сложены и не поделены на 5)



code concept of UiUa
program 05: стандартное отклонение
-
добавили операцию "свернуть +"
-
получили одно значение = 10
-
нам надо длину массива (5)


code concept of UiUa
program 05: стандартное отклонение
-
после мы сделали копию длины (5)
-
все, что в скобках будет
-
это временное изъятие со стека
-
в результате на стеке будет
-
применим % и корень





code concept of UiUa
program 05: стандартное отклонение

решение #1
Замечания
1. код слишком длинный (18 байт!!!)***
2. много копируем в стек (3 копии, 2 обмена)
3. длина массива всегда одна (5)
code concept of UiUa
program 05: стандартное отклонение
решение #2
Замечания
1. код слишком длинный (17 байт!!!)***
2. много копируем в стек (3 копии, 2 обмена)
3. заметны одинаковые участки кода (по 5 байт)

code concept of UiUa
program 05: стандартное отклонение

рассуждения
1. у нас есть два массива
2. 1-ый это исходный
3. 2-ой это с отклонениями
4. для 1 и 2 мы запускаем два действия
5. а) сложение, б) вычисление длины
code concept of UiUa
program 05: стандартное отклонение

решение #3

рассуждения
1. у нас два вызова двух функций для данных
2. два вызова делаются через
3. если функций две, то даже не нужны скобки
4. но, у нас два вызова одинаковых функций(!)
code concept of UiUa
program 05: стандартное отклонение
решение #4
перерыв
1. перепишите код руками справа налево
2. наблюдайте стек и его изменения
3. запускайте код блоками

code concept of UiUa
program 05: стандартное отклонение
решение #5

перерыв
1. размер программы 16 байт
2. если привязка=1 байт, то 12 байт
3. на стеке всего два массива
code concept of UiUa
program 05: стандартное отклонение




разделить длину массива на
сумму его элементов (3)

из второго массива вычитаем 3
и возводим его в квадрат

разделить длину массива на сумму элементов
(10%5=2) и извлечь корень (1.42)
code concept of UiUa
program 05: стандартное отклонение



code concept of UiUa
program 06: аббревиатура
-
дан текст из больших и малых букв
-
оставить только заглавные буквы
-
например
-
оставить
-
время 20 минут
-
любой язык


code concept of UiUa
program 06: аббревиатура

-
есть строка 1 (исходная)
-
делаем строку 2 (строчные)
-
делаем строку 3 (прописные)
-
находим отличия между 1 и 3
-
ответ на местах отличий
code concept of UiUa
program 06: аббревиатура

копия, копия, заглавные, анти


сравнить строки, взять на 1

code concept of UiUa
program 06: аббревиатура


идея
1. работают три массива
2. исходный, строчный, заглавный
3. строчный != исходный дает маску
code concept of UiUa
program 07: анаграмма
-
даны две строки текста
-
проверить есть ли анаграмма
-
например
-
да, эти строки анаграмма
-
время 20 минут
-
любой язык

code concept of UiUa
program 07: анаграмма

-
отсортировать 1 строку
-
отсортировать 2 строку
-
проверить строка 1 = строка 2
-
да, анаграмма
-
нет, не анАграмма
code concept of UiUa
program 07: анаграмма



code concept of UiUa
program 08: рыбки-фонарики
-
рыбки мечут икру 1 раз/7 дней
-
1 взрослая рыбка мечет 1 малька
-
малек растет 2 дня и готов метать
-
дана строка рыб и число дней
-
вычислить число рыбок через n дней
-
время 40 минут
-
любой язык
пояснения


code concept of UiUa
program 08: рыбки-фонарики












code concept of UiUa
program 08: рыбки-фонарики
замечания
1. 3 дня до метания икры: 3-2-1 метаем!!!
2. внутри стаи будут взрослые и дети
3. взрослые метают нон-стоп, каждые 7 дней
4. дети два дня растут и становятся взрослыми
5. в этом примере никто не умирает, все растут
6. при вводе "3,4,3,1,2" и 80 дней ответ = 5934
code concept of UiUa
program 08: рыбки-фонарики
-
надо сделать массив из 9 дней
-
дни массива будут 1,2,3,4,5,6,7,8,9
-
индексы массива будут 0,1,2,3,4,5,6,7,8
-
по каждому индексу=число рыб
-
для рыбки время=3 дня, индекс=3
-
пока надо расставить рыбок


code concept of UiUa
program 08: рыбки-фонарики
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | idx |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
day |
| 1 | 1 | 2 | 1 | fish |

рыбка мечет икринку
рыбка после родов
малек после родов
движение жизни

code concept of UiUa
program 08: рыбки-фонарики

копия, ",", выбираем != ","



парсим и группируем

code concept of UiUa
program 08: рыбки-фонарики

anti where


маска в список индексов



code concept of UiUa
program 08: рыбки-фонарики

список индексов в маску




берем 9, если нет=0

code concept of UiUa
program 08: рыбки-фонарики

-
надо организовать цикл движения
-
рыбки по индексу 0 мечут икринки
-
старая рыбка идет на индекс=6
-
новая рыбка идет на индекс=8
-
в целом массив двигается влево на 1
-
после конца цикла все рыбы +
code concept of UiUa
program 08: рыбки-фонарики



| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | idx |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
day |
| 0 | 1 | 1 | 2 | 1 | 0 | 0 | 0 | 0 | fish |
code concept of UiUa
program 08: рыбки-фонарики


1
2
code concept of UiUa
program 08: рыбки-фонарики



1
пояснения для функции 1
1. вызывает 2 функции с одинаковыми аргументами
2. переносит 1 слева направо и берет левый элемент (1)
а) отправляем мальков на 9-ый день (1), индекс=8
Б) оставляем наверху стека число матерей (1)

code concept of UiUa
program 08: рыбки-фонарики


2
пояснения для функции 2
1. изменяем массив с помощью 2 функций
2. берем число матерей (1) и выбираем индекс=6
3. складываем то, что там лежит и наше число (1)
4. так будет 80 раз (или сколько раз нам пришлют)

code concept of UiUa
program 08: рыбки-фонарики

общее замечание
1. fish = массив-маска для рыбок и их дней до родов
2. spawn = цикл из 2 функций (каждая на 2 действия)
3. в конце spawn'а после цикла идет суммирование
code concept of UiUa
program 08: рыбки-фонарики




code concept of UiUa
program 09: advent code 2024/1 pairs-pairs
1. есть два списка чисел [3,4,2,1,3,3] и [4,3,5,3,9,3]
2. задача 1: найти сумму расстояний между парами списка, которые упорядочены по возростанию
3. задача 2: сколько раз число из 1-го набора данных есть внутри 2-го набора данных (ответ = сумма таких повторов)



code concept of UiUa
program 09: advent code 2024/1

основная идея #1
1. отсортируем обе строки по возрастанию
2. найдем между элементами строк разность
3. найдем сумму этих разностей


code concept of UiUa
program 09: advent code 2024/1

основная идея #2
1. сохраним массив в стеке (для наблюдений)
2. разделим массив на два 1-мерных массива
3. сравним каждый элемент 1-го со всеми из 2-го
4. суммируем по строкам, чтобы получить повторы
5. суммируем 1-ый массив на число повторов
6. находим сумму = ответ
code concept of UiUa
program 09: advent code 2024/1



code concept of UiUa
program 10: advent code 2024/2 safe/unsafe
1. дано несколько одномерных массивов
2. массив safe, если числа в нем растут или убывают
3. массив safe, если числа отличаются на 1, 2 или 3
4. массив unsafe, если есть два равных числа (4=4)
5. массив unsafe, если есть перепад роста
6. массив unsafe, если числа отличаются на 4 и более

code concept of UiUa
program 10: advent code 2024/2 safe/unsafe


safe
safe
code concept of UiUa
program 10: advent code 2024/2 safe/unsafe
1. создадим набор данных

2. сделаем из данных строки ctrl + 4

3. выделим данные != новой строке (маска)

4. оставим данные и по маске сделаем массив


5. если массивы разной длины, то надо коробку
6. в реальности у нас массив из двух строк

code concept of UiUa
program 10: advent code 2024/2 safe/unsafe
6. в реальности у нас массив из двух строк


7. сделаем маску для символов != пробел

8. оставим, распарсим, объединяем

убираем \n
убираем \s
парсим

code concept of UiUa
program 10: advent code 2024/2 safe/unsafe
9. внутренний массив должен пройти 3 теста: возрастать или убывать, не иметь = элементов, не отличатся > 3

10. возьмем 1-ый массив
11. есть глиф window (окно)


12. мы можем создать массив из соседних пар


code concept of UiUa
program 10: advent code 2024/2 safe/unsafe
12. мы можем создать массив из соседних пар


13. найдем построчную разность между элементами


14. если минусы, то убывает; если плюсы, то возрастает
15. если только плюс или минус, то тест прошел (иначе нет)

16. берем sign(-1;+1;0) и убираем копии
code concept of UiUa
program 10: advent code 2024/2 safe/unsafe

16. как проверить, что нет одинаковых значений?
17. надо перемножить значения и найти sign (0 = был повтор)

18. как проверить, что разность между парами < 4?
19. надо взять abs, проверить <4 и перемножить результаты
code concept of UiUa
program 10: advent code 2024/2 safe/unsafe

20. все работает, но каждая проверка "съедает" массив

21. объединим проверки через fork и перемножим результат
22. проверки есть, надо запустить их для всех массивов
code concept of UiUa
program 10: advent code 2024/2 safe/unsafe


code concept of UiUa
program 10: advent code 2024/2 safe/unsafe

sefe (функция)
parse! (макрос)
ответ
train exercism
By Ivan Sedov
train exercism
- 199