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! (макрос)

ответ

Made with Slides.com