Summary Files Commits Branches @commit @diff @stats
path: root / src
diff options
context:
space:
mode:
Commit093725dd08292619225946d1277cddf878f0ae31 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-11-20 08:05:20 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-11-20 08:05:20 +0200
Files5b8802dd6b920e864f92b08cbc6cfe4f7e3b3aee /src
syndamia.com-093725dd08292619225946d1277cddf878f0ae31.tar
syndamia.com-093725dd08292619225946d1277cddf878f0ae31.tar.gz
syndamia.com-093725dd08292619225946d1277cddf878f0ae31.zip
Parent121359cad6c98892e13583ecc29a283c30dac200 (diff)
feat(teaching/upp-2025/w08): Add exercises
diff --git a/src/teaching/upp-2025/index.du b/src/teaching/upp-2025/index.du
index af84eb8..a4a811a 100644
--- a/src/teaching/upp-2025/index.du
+++ b/src/teaching/upp-2025/index.du
@@ -107,3 +107,13 @@
[url ./week07 Задачи]
|| [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week07 Решения]
|| [url https://classroom.github.com/a/clYBilXQ GitHub Classroom]
+
+|: 8
+|: 20.11.2025
+|: Двумерни масиви
+
+|:
+|:
+|:
+[url ./week08 Задачи]
+|| [url https://classroom.github.com/a/rhpKbNmH GitHub Classroom]
diff --git a/src/teaching/upp-2025/week08/img/line_interpolation.png b/src/teaching/upp-2025/week08/img/line_interpolation.png
new file mode 100644
index 0000000..f771472
--- /dev/null
+++ b/src/teaching/upp-2025/week08/img/line_interpolation.png
Binary files differ
diff --git a/src/teaching/upp-2025/week08/index.du b/src/teaching/upp-2025/week08/index.du
new file mode 100644
index 0000000..55ba150
--- /dev/null
+++ b/src/teaching/upp-2025/week08/index.du
@@ -0,0 +1,1141 @@
+# Задачи - УПП, Седмица 8, 20.11.2025
+
+'define expected-reading 34 min
+'define created 15 November 2025
+'define edited 20 November 2025
+[$pagenav]
+
+GitHub Classroom: [url https://classroom.github.com/a/rhpKbNmH]
+
+## За решаване
+
+### Задача 1
+
+От входа получавате матрица 5 на 5 от цели числа.
+Трябва да върнете дали е разредена матрица: дали има *[повече]* нули отколкото други числа.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+1 2 3 0 4
+5 0 6 0 7
+9 1 2 0 3
+4 5 5 6 0
+7 7 8 1 0
+
+|:
+```
+Not sparse
+
+|:
+```
+1 2 0 0 0
+0 3 4 0 0
+0 0 5 6 0
+0 0 0 7 8
+0 0 0 0 9
+
+|:
+```
+Sparse
+
+
+### Задача 2
+
+Напишете функция, която получава матрица с произволен размер и масив, чиято дължина е същата като на един ред в матрицата.
+
+Намерете сумата на всички редове и я запазете в подадения масив.
+
+От входа получавате матрица 7 на 3 от цели неотрицателни числа.
+Изкарайте сумата на всички редове и я изкарайте.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+79 23 76
+71 50 41
+ 3 54 8
+97 24 2
+19 47 50
+28 53 80
+63 81 25
+
+|:
+```
+360 332 282
+
+|:
+```
+11 42 94
+27 14 94
+49 37 66
+58 23 55
+44 11 23
+ 3 77 31
+12 4 16
+
+|:
+```
+204 208 379
+
+
+### Задача 3
+
+Напишете функция, която получава две матрици с произволни размери, съствени от реални числа.
+Може да допуснете, че размера на втората матрица е по-малък от тази на първата.
+
+Трябва да запишете във втората матрица, всички елементи от "горния ляв квадрат" на първата матрица.
+
+От входа получавате матрица 6 на 6 от реални числа.
+След това получавате 4 реални числа: първите две са координат в матрицата (където горния ляв ъгъл е `[0, 0]`), вторите две са нейни размери.
+
+Използвайки вашата функция, трябва да изкарате подматрицата с начало подадения координат и размери подадените размери =[използвайки]= вашата функция.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+-10.181 15.910 0 78.309 192 59.743
+ 22.273 50.230 -82 -95.077 3 4
+ 10 45.834 -1 -0.02 5.5 18.2
+ 82.439 0.133 100 64 46.204 30812
+ 551 1.2 1.1 94.022 6.818 77
+ 8.608 10010 3 50.94 100.2 0.3333
+0 0
+6 6
+
+|:
+```
+-10.181 15.910 0 78.309 192 59.743
+22.273 50.230 -82 -95.077 3 4
+10 45.834 -1 -0.02 5.5 18.2
+82.439 0.133 100 64 46.204 30812
+551 1.2 1.1 94.022 6.818 77
+8.608 10010 3 50.94 100.2 0.3333
+
+|:
+```
+-10.181 15.910 0 78.309 192 59.743
+ 22.273 50.230 -82 -95.077 3 4
+ 10 45.834 -1 -0.02 5.5 18.2
+ 82.439 0.133 100 64 46.204 30812
+ 551 1.2 1.1 94.022 6.818 77
+ 8.608 10010 3 50.94 100.2 0.3333
+1 1
+2 2
+
+|:
+```
+50.230 -82
+45.834 -1
+
+|:
+```
+-10.181 15.910 0 78.309 192 59.743
+ 22.273 50.230 -82 -95.077 3 4
+ 10 45.834 -1 -0.02 5.5 18.2
+ 82.439 0.133 100 64 46.204 30812
+ 551 1.2 1.1 94.022 6.818 77
+ 8.608 10010 3 50.94 100.2 0.3333
+2 1
+4 3
+
+|:
+```
+-82 -95.077 3 4
+-1 -0.02 5.5 18.2
+100 64 46.204 30812
+
+|:
+```
+-10.181 15.910 0 78.309 192 59.743
+ 22.273 50.230 -82 -95.077 3 4
+ 10 45.834 -1 -0.02 5.5 18.2
+ 82.439 0.133 100 64 46.204 30812
+ 551 1.2 1.1 94.022 6.818 77
+ 8.608 10010 3 50.94 100.2 0.3333
+4 5
+1 1
+
+|:
+```
+100.2
+
+
+### Задача 4
+
+City Bloxx е известна мобилна игра за строене на сгради.
+В нейния "Build city" режим, целта е построените сгради да се подредят в матрица 5 на 5.
+
+Нека да разгледаме следните правила за сгради (в самата игра има някои разлики):
+.numbered
+1. *[Жилищните сгради]* може да се поставят навсякъде.
+2. *[Търговските сгради]* трябва да бъдат поставени до поне една жилищна сграда.
+3. *[Офис сградите]* трябва да бъдат поставени до поне една жилищна и една търговска.
+4. *[Луксозните сгради]* трябва да бъдат поставени до поне една жилищна, една търговска и една офис сграда.
+
+От входа получавате масив 5 на 5 с цели числа, където с 1 до 4 се обозначават сградите, от жилищни до луксозни.
+Изкарайте дали подредбата на сградите е позволена (следва горните правила).
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+1 1 1 1 1
+1 1 1 1 1
+1 1 1 1 1
+1 1 1 1 1
+1 1 1 1 1
+
+|: Valid
+
+|:
+```
+1 2 1 1 1
+1 2 1 2 1
+2 1 2 1 2
+2 2 1 2 2
+2 1 2 1 1
+
+|: Invalid
+
+|:
+```
+1 2 1 1 1
+1 2 1 2 1
+2 3 2 1 2
+3 2 1 2 2
+2 1 2 1 1
+
+|: Invalid
+
+|:
+```
+1 2 1 1 1
+1 2 1 2 1
+2 3 4 1 2
+3 4 1 2 2
+1 2 2 1 1
+
+|: Invalid
+
+|:
+```
+1 2 1 1 1
+1 1 2 2 1
+2 3 4 1 2
+3 4 1 3 2
+1 2 2 1 1
+
+|: Valid
+
+
+### Задача 5
+
+От входа получавате матрица 3 на 3, съствена от цели числа.
+Трябва да я транспонирате: да смените елементите над и под главния диагонал, и да изкарате резултата.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+1 2 3
+4 5 6
+7 8 9
+
+|:
+```
+1 4 7
+2 5 8
+3 6 9
+
+|:
+```
+ 8 13 0
+-4 1 2
+ 0 0 5
+
+|:
+```
+ 8 -4 0
+13 1 0
+ 0 2 5
+
+
+### Задача 6
+
+Напишете функция, която приема матрица с произволни размери, съствена от реални числа, заедно с два индекса.
+Разменете колоните на подадените индекси, ако това е възможно.
+
+От входа получавате матрица 3 на 5, съствена от реални числа.
+След това получавате два индекса на колони.
+
+Трябва да размените двете колони, използвайки вашата функция, и да изкарате резултата.
+
+*[Вашия изход не е нужно да бъде подравнен.]*
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+ -16.01 -60.69 51 7.64 18.33
+-100.41 22.16 17.07 9 30.07
+ 16.84 53.84 23.22 -21.11 0
+0 3
+
+|:
+```
+ 7.64 -60.69 51 -16.01 18.33
+ 9 22.16 17.07 -100.41 30.07
+-21.11 53.84 23.22 16.84 0
+
+|:
+```
+ -16.01 -60.69 51 7.64 18.33
+-100.41 22.16 17.07 9 30.07
+ 16.84 53.84 23.22 -21.11 0
+0 0
+
+|:
+```
+ -16.01 -60.69 51 7.64 18.33
+-100.41 22.16 17.07 9 30.07
+ 16.84 53.84 23.22 -21.11 0
+
+|:
+```
+ -16.01 -60.69 51 7.64 18.33
+-100.41 22.16 17.07 9 30.07
+ 16.84 53.84 23.22 -21.11 0
+4 2
+
+|:
+```
+ -16.01 -60.69 18.33 7.64 51
+-100.41 22.16 30.07 9 17.07
+ 16.84 53.84 0 -21.11 23.22
+
+
+### Задача 7
+
+От входа получавате матрица от букви 3 на 3.
+Тя определя шаблон, където буквата `[*]` означава, че всяка стойност е позволена.
+
+След това от входа получавате матрица 6 на 6, съствена от букви.
+Трябва да намерите всички срещания на шаблона в тази матрица, като срещанията може да се застъпват!
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+1 2 3
+4 5 6
+7 8 9
+1 2 3 1 2 3
+4 5 6 4 5 6
+7 8 9 7 8 9
+1 2 3 1 2 3
+4 5 6 4 5 6
+7 8 9 7 8 9
+
+|: 4
+
+|:
+```
+= = =
+. . .
+= = =
+= = = = = =
+= = = = = =
+. . . . . .
+= = = = = =
+. . . . . .
+= = = = = =
+
+|: 8
+
+|:
+```
+1 2 3
+4 * 5
+6 7 8
+1 2 3 1 2 3
+4 a 5 4 b 5
+6 7 8 6 7 8
+1 2 3 1 2 3
+4 c 5 4 d 5
+6 7 8 6 7 8
+
+|: 4
+
+|:
+```
+* * *
+* * *
+* * *
+1 2 3 1 2 3
+4 5 6 4 5 6
+7 8 9 7 8 9
+1 2 3 1 2 3
+4 5 6 4 5 6
+7 8 9 7 8 9
+
+|: 16
+
+
+### Задача 8
+
+От входа получавате две матрици 3 на 3, съствени от цели неотрицателни числа.
+Пресметнете умножението на матриците (ред по стълб) и изкарайте резултата.
+
+Умножение на матрици
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+2 1 3
+3 4 1
+5 2 3
+1 2 0
+4 1 2
+3 2 1
+
+|:
+```
+15 11 5
+22 12 9
+22 18 7
+
+|:
+```
+2 1 3
+3 4 1
+5 2 3
+1 2 0
+4 1 2
+3 2 1
+
+|:
+```
+8 9 5
+21 12 19
+17 13 14
+
+
+### Задача 9
+
+При изграждането на устройства като клавиатури, често се използва "бутонна матрица".
+Всички бутони са свързани в електрическа матрица, така че на всяка колона "входовете" им са споделени и на всеки ред "изходите" им са споделени.
+
+Няма да навлизаме в електрониката, но идеята е че когато натиснеш бутон, определена колона и ред са "свързани"/активни.
+=[Тоест, когато активни ред и колона се пресичат, значи този бутон е натиснат.]=
+
+Това означава, че се нуждаем да погледнем само състоянията на всеки ред и колона, и ще знаем всички натиснати бутони (вместо да свързваме всеки бутон поотделно).
+
+'footnote keypad_image_attrib Изображение от Sakurambo - създадено чрез Adobe Illustrator CS2, Публичен домейн, [url https://commons.wikimedia.org/w/index.php?curid=2048341]
+
+Нека да разглеждаме стандартна 4 на 3 телефонна клавиатура[$keypad_image_attrib]:
+
+[image https://upload.wikimedia.org/wikipedia/commons/thumb/7/73/Telephone-keypad2.svg/330px-Telephone-keypad2.svg.png]
+
+От входа първо получавате 4 булеви стойности: дали реда е активен (като започваме отгоре надолу).
+След това получавате още 3 булеви стойности: дали колоната е активна (като започваме отляво надясно).
+
+Изкарайте кои бутони са натиснати, използвайки цифровите знаци, звезда (`[*]`) и диез (`[#]`).
+Ако няма натиснати, изкарайте съответно съобщение.
+
+:table_2
+|= Вход
+|= Изход
+
+|: 0 1 0 0 0 0 1
+|: 6
+
+|: 0 0 0 1 1 0 1
+|: * #
+
+|: 1 0 0 1 1 0 1
+|: 1 3 * #
+
+|: 0 1 0 1 0 1 0
+|: 5 0
+
+|: 1 1 1 1 1 1 1
+|: 1 2 3 4 5 6 7 8 9 * 0 #
+
+|: 0 0 0 0 0 0 0
+|: Nothing pressed
+
+
+### Задача 10
+
+Триъгълника на Паскал е изчисление, при което се конструира триъгълник от числа.
+По двете "рамене" има единици, и всяко вътрешно число е сумата на горните две.
+
+'footnote pascal_animation_attrib Анимация от Hersfold - собствен труд, Публичен домейн, [url https://commons.wikimedia.org/w/index.php?curid=3902538]
+
+Пояснителна анимация[$pascal_animation_attrib]:
+
+[image https://upload.wikimedia.org/wikipedia/commons/0/0d/PascalTriangleAnimated2.gif]
+
+=[Генерирайте]= и изкарайте триъгълника на паскал в матрица 11 на 11, където двете страни на триъгълника са първата колона и главния диагонал.
+
+Нека стойностите извън триъгълника да са нули.
+
+=[Изход:]= *[(не е нужно да бъде подравнен)]*
+
+.comment https://www.fcfung2000.com/ufcfiles/ufcmatrk.htm
+
+```
+=[1]= 0 0 0 0 0 0 0 0 0 0
+=[1]= =[1]= 0 0 0 0 0 0 0 0 0
+=[1]= 2 =[1]= 0 0 0 0 0 0 0 0
+=[1]= 3 3 =[1]= 0 0 0 0 0 0 0
+=[1]= 4 6 4 =[1]= 0 0 0 0 0 0
+=[1]= 5 10 10 5 =[1]= 0 0 0 0 0
+=[1]= 6 15 20 15 6 =[1]= 0 0 0 0
+=[1]= 7 21 35 35 21 7 =[1]= 0 0 0
+=[1]= 8 28 56 70 56 28 8 =[1]= 0 0
+=[1]= 9 36 84 126 126 84 36 9 =[1]= 0
+=[1]= 10 45 120 210 252 210 120 45 10 =[1]=
+
+### Задача 11
+
+От входа получавате матрица 10 на 10 от цели неотрицателни числа.
+След това получавате размер между 0 и 10.
+
+Трябва да имплементирате "размазване", където всяка нова стойност на една клетка е равна на средната стойност на всички съседни клетки в "радиус" от подадения размер.
+
+Тоест, ако размера е 2, тогава се взема средно аритметично на всяка клетка, която е на максимум две позиции разтояние, вертикално и хоризонтално (и диагонално).
+
+Ако размера е 0, тогава всяка клетка е средно аритметично на "себе си", т.е. не се променя.
+Игнорирайте ако клетки не съществуват (например, няма нито една клетка над клетките на първи ред).
+
+*[(Вашия изход не е нужно да бъде подравнен.)]*
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+0 0 0 0 0 0 0 0 0 0
+0 1 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 9 0 0
+0 0 0 0 0 0 0 0 0 0
+0 0 0 0 5 0 0 0 0 0
+0 0 0 0 6 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0
+0 3 0 0 0 0 0 0 4 0
+0 0 0 0 0 0 2 0 0 0
+1
+
+|:
+```
+0.25 0.167 0.167 0 0 0 0 0 0 0
+0.167 0.111 0.111 0 0 0 1 1 1 0
+0.167 0.111 0.111 0 0 0 1 1 1 0
+0 0 0 0.556 0.556 0.556 1 1 1 0
+0 0 0 1.222 1.222 1.222 0 0 0 0
+0 0 0 1.222 1.222 1.222 0 0 0 0
+0 0 0 0.667 0.667 0.667 0 0 0 0
+0.5 0.333 0.333 0 0 0 0 0.444 0.444 0.667
+0.5 0.333 0.333 0 0 0.222 0.222 0.667 0.444 0.667
+0.75 0.5 0.5 0 0 0.333 0.333 1 0.667 1.000
+
+
+### Задача 12
+
+От входа получавате два реални координата, между (0,0) и (10,10).
+
+Трябва да върнете матрица 10 на 10 от знаци, която се съставя единствено от шпации (spaces) и хиксове (`[x]`).
+Зачитаме, че координатите директно съответстват на матрицата, като (0,0) се намира в горния ляв ъгъл и (10,10) в долния десен.
+
+В тази матрица, по подразбиране стоят само шпации.
+Хиксовете се намират там, където начертаната отсечка между входните точки би застъпила матрицата.
+Примерна диаграма:
+
+[image ./img/line_interpolation.png]
+
+Тази операция се нарича интерполация.
+
+.warn
+Да се има впредвид, че спрямо използваната прецизност, някои стойности може да са шпации, когато трябва да са хиксове.
+Сравнявайте дали повечето стойности са коректни.
+
+:table_2
+|= Вход
+|= Изход
+
+|: 1 8.5 8.5 2.5
+|:
+```
+'include ./text/output_interpolation_1.txt
+
+
+## За самоподготовка
+
+### Задача 13
+
+От входа получавате матрица 8 на 8, съставена от символите точка и плюс.
+Трябва да върнете височината и ширината на най-големия правоъгълник, който застъпва всички плюсове.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+. . . . . . . .
+. . . . . . . .
+. + + . + . . .
+. . + . . . . .
+. . + . . . + .
+. . . . . . + .
+. . + . . . . .
+. . . . . . . .
+
+|: 5 6
+
+|:
+```
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+
+|: 0 0
+
+|:
+```
++ . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . .
+. . . . . . . +
+
+|: 8 8
+
+
+### Задача 14
+
+От входа приемате масив от 6 елемента и матрица с 6 реда и 3 колони, всички съставени от реални числа.
+Трябва да реализирате умножение на вектор по матрица (където масива е вектора).
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+1 2 3 4 5 6
+1 7 13
+2 8 14
+3 9 15
+4 10 16
+5 11 17
+6 12 18
+
+|: 91 217 343
+
+|:
+```
+1 2 1 0 2 1
+3 1 8.8
+0 1 2
+5 1 15
+5 1 0.1
+0 1 7
+0 1 0
+
+|: 8 7 41.8
+
+
+### Задача 15
+
+От входа получавате матрица 9 на 7 с реални числа.
+След това получавате още едно реално число: максимална разлика.
+
+Проверете дали данните са гладки: стойността във всяка една клетка да се различава с най-много максималната разлика от всички свои съседни клетки (включително по диагонал).
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+1 2 3 4 5 6 7
+2 2 3 4 5 6 7
+3 3 3 4 5 6 7
+4 4 4 4 5 6 7
+5 5 5 5 5 6 7
+6 6 6 6 6 6 7
+7 7 7 7 7 7 7
+8 8 8 8 8 8 8
+9 9 9 9 9 9 9
+2
+
+|: Smooth
+
+|:
+```
+0 0 0 0 0 0 0
+0 0 0 0 0 0 0
+0 0 0 0 0 0 0
+0 0 0 0 0 0 0
+0 0 0 0 0 0 0
+0 0 0 0 0 0 0
+0 0 0 0 0 0 0
+0 0 0 0 0 0 0
+0 0 0 0 0 0 0
+0.1
+
+|: Smooth
+
+|:
+```
+1 0 0 0 1 0 0
+0 1 0 1 0 1 0
+0 0 1 0 0 0 1
+0 1 0 1 0 0 0
+1 0 0 0 1 0 0
+0 1 0 0 0 1 0
+0 0 1 0 0 0 1
+0 0 0 1 0 1 0
+0 0 0 0 1 0 0
+0.5
+
+|: Not smooth
+
+|:
+```
+1 3 0 0 0 0 0
+0 5 0 0 0 0 0
+6 0 4 0 0 0 0
+0 1 4 2 0 0 0
+1 0 1 0 0 0 0
+0 1 0 0 0 0 0
+0 0 0 0 0 0 0
+0 0 0 0 8 0 0
+0 0 0 0 0 0 0
+2
+
+|: Not smooth
+
+
+### Задача 16
+
+Напишете функция която приема матрица с произволни размери и "връща" матрица, която е като входната матрица, но всички елементи са "завъртяни" на дясно с 90 градуса.
+
+Тоест, горния ляв елемент става горния десен, горния десен става долния десен и так. нат.
+
+Не забравяйте да проверите дали можете да попълните завъртяната матрица в тазия която "връщате".
+Ако не можете, не записвайте нищо във върнатата.
+
+От входа получавате матрица 4 на 8, съставена от цели числа.
+=[Използвайки вашата функция]=, завъртете матрицата и изкарайте резултата.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+ 1 2 3 4 5 6 7 8
+ 9 10 11 12 13 14 15 16
+17 18 19 20 21 22 23 24
+25 26 27 28 29 30 31 32
+
+|:
+```
+25 17 9 1
+26 18 10 2
+27 19 11 3
+28 20 12 4
+29 21 13 5
+30 22 14 6
+31 23 15 7
+32 24 16 8
+
+
+### Задача 17
+
+Трябва да реализирате (опростен вариант на) "pixel binning": спрямо подаден коефициент, стойностите в клетки се смесват.
+
+Тоест, ако имаме binning от 2, тогава ще пресметнем средната стойност за всеки квадрат 2 на 2 и ще заменим всяка стойност от квадрата със средната.
+
+От входа получавате матрица 12 на 12 с цели неотрицателни числа и неотрицателен binning коефициент.
+Трябва да върнете матрицата след приложен binning.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+0 0 0 0 7 7 7 0 0 0 0 0
+0 1 0 0 0 0 0 0 0 0 0 0
+0 1 0 0 0 0 0 0 0 20 0 0
+0 5 0 0 0 0 0 0 0 0 9 9
+0 0 7 0 0 0 3 0 0 0 9 9
+0 0 0 0 0 3 4 3 0 0 0 8
+0 0 0 0 0 3 4 3 0 0 0 0
+0 0 0 0 0 0 3 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 5 0 0
+2 2 0 0 0 0 0 0 0 0 0 0
+2 2 0 0 0 0 0 0 0 0 10 13
+2 2 0 0 0 0 0 0 0 0 11 14
+2
+
+|:
+```
+0.25 0.25 0 0 3.5 3.5 1.75 1.75 0 0 0 0
+0.25 0.25 0 0 3.5 3.5 1.75 1.75 0 0 0 0
+1.5 1.5 0 0 0 0 0 0 5 5 4.5 4.5
+1.5 1.5 0 0 0 0 0 0 5 5 4.5 4.5
+0 0 1.75 1.75 0.75 0.75 2.5 2.5 0 0 6.5 6.5
+0 0 1.75 1.75 0.75 0.75 2.5 2.5 0 0 6.5 6.5
+0 0 0 0 0.75 0.75 2.5 2.5 0 0 0 0
+0 0 0 0 0.75 0.75 2.5 2.5 0 0 0 0
+1 1 0 0 0 0 0 0 1.25 1.25 0 0
+1 1 0 0 0 0 0 0 1.25 1.25 0 0
+2 2 0 0 0 0 0 0 0 0 12 12
+2 2 0 0 0 0 0 0 0 0 12 12
+
+
+### Задача 18
+
+От входа получавате матрица 10 на 10 с цели неотрицателни числа.
+Трябва да върнете най-голямата подматрица, съставена само от единици.
+
+Сравнявайте матриците по техния размер, тоест броя елементи.
+Ако има няколко еднакво големи подматрици, може да изкарате която и да е от тях.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+0 0 0 0 0 0 1 1 1 1
+0 0 0 0 0 0 1 1 1 1
+0 0 0 0 0 0 1 2 1 1
+0 1 1 1 0 0 1 1 1 1
+0 1 1 1 0 0 1 1 1 1
+0 1 1 1 0 0 0 0 0 0
+0 1 1 1 0 0 0 0 0 0
+0 0 0 0 0 0 0 0 0 0
+0 0 0 0 0 0 2 3 4 5
+0 0 0 0 0 0 6 7 8 9
+
+|:
+```
+1 1 1
+1 1 1
+1 1 1
+1 1 1
+
+
+### Задача 19
+
+От входа получавате матрица 8 на 8 от реални числа.
+Реализирайте нещо, което ще наречем "сгъване" на матрицата, докато не остане само едно число.
+
+Дефинираме сгъването така:
+.bulleted
+- сумираме горната половина на матрицата в долната половина, след това
+- в долната половина, сумираме дясната половина в лявата (дясната една четвърт в лявата), след това
+- в долната лява една четвърт, сумираме долната половина в горната,
+- и така нататък
+
+Накрая изкарате резултатното число.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+1 2 3 4 5 6 7 8
+9 1 2 3 4 5 6 7
+8 9 1 2 3 4 5 6
+7 8 9 1 2 3 4 5
+6 7 8 9 1 2 3 4
+5 6 7 8 9 1 2 3
+4 5 6 7 8 9 1 2
+3 4 5 6 7 8 9 0
+
+|: 315
+.comment
+7 9 11 13 6 8 10 12
+14 7 9 11 13 6 8 10
+12 14 7 9 11 13 6 8
+10 12 14 7 9 11 13 5
+---
+13 17 21 25
+27 13 17 21
+23 27 13 17
+19 23 27 12
+---
+36 44 34 42
+46 36 44 33
+---
+70 86
+90 69
+---
+160 155
+
+
+### Задача 20
+
+=[Генерирайте]= и изкарайте [url https://en.wikipedia.org/wiki/Bell_triangle триъгълника на Бел] в долния ляв ъгъл на матрица 11 на 11.
+Това означава, че страните на триъгълника включват първата колона и главния диагонал.
+
+.bulleted
+- Започва се с единица.
+- На всеки следващ ред, първия елемент е последния (ненулев) елемент на предходния ред.
+- Всеки следващ елемент е сумата на предходния елемент в текущия ред и предходния елемент в горния ред.
+- Спираме да сумираме, докато един от предходните ни елементи не бъде 0 (т.е. ако ще сумираме нещо с 0).
+
+'footnote bell_animation_attrib Анимация от Xanthoxyl - собствен труд, CC BY-SA 3.0, [url https://commons.wikimedia.org/w/index.php?curid=5832904]
+
+Пояснителна анимация[$bell_animation_attrib]:
+
+[image https://upload.wikimedia.org/wikipedia/commons/a/ab/BellNumberAnimated.gif]
+
+Тази задача е подобна на [url #-10 Задача 10].
+
+=[Изход:]= *[(не е нужно да бъде подравнен)]*
+
+.comment https://oeis.org/A011971
+
+```
+ 1 0 0 0 0 0 0 0 0 0 0
+ 1 2 0 0 0 0 0 0 0 0 0
+ 2 3 5 0 0 0 0 0 0 0 0
+ 5 7 10 15 0 0 0 0 0 0 0
+ 15 20 27 37 52 0 0 0 0 0 0
+ 52 67 87 114 151 203 0 0 0 0 0
+ 203 255 322 409 523 674 877 0 0 0 0
+ 877 1080 1335 1657 2066 2589 3263 4140 0 0 0
+ 4140 5017 6097 7432 9089 11155 13744 17007 21147 0 0
+ 21147 25287 30304 36401 43833 52922 64077 77821 94828 115975 0
+115975 137122 162409 192713 229114 272947 325869 389946 467767 562595 678570
+
+### Задача 21
+
+.comment
+https://www.apcomputersciencetutoring.com/2d-array-practice-exercises/#grow-method
+
+От входа получавате матрица 3 на 4 от реални числа и след това височина и дължина на изходната матрица.
+
+Трябва да "реоразмерите" матрицата, като запазите последователността на елементи отляво надясно, отгоре надолу.
+Височината и дължаната няма да са повече от 10.
+
+Ако изходната матрица е по-голяма, попълнете празните позиции с нули.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+1 2 3 4
+5 6 7 8
+9 10 11 12
+4 5
+
+|:
+```
+ 1 2 3 4 5
+ 6 7 8 9 10
+11 12 0 0 0
+ 0 0 0 0 0
+
+|:
+```
+1 2 3 4
+5 6 7 8
+9 10 11 12
+4 2
+
+|:
+```
+1 2
+3 4
+5 6
+7 8
+
+
+### Задача 22
+
+От входа получавате матрица 3 на 3 със знаци.
+След това получавате число "режим", което е 1, 2 или 3.
+
+Трябва да изкарате матрица със знаци 9 на 9, в която е попълнено изображението спрямо режима.
+.numbered
+1. =[Режим 1]= обозначава повтаряне, където изображението се повтаря последователно
+2. =[Режим 2]= обозначава "border", където изображението се слага в центъра и останалта част се попълва със знак диес `[#]`.
+3. =[Режим 3]= обозначава "clamp", изображението се слага в центъра и останалата част се попълва като се повтаря последната буква. Тоест, дясното 3 на 3 се попълва с повторение на десния знак.
+
+:table_2
+|= Вход
+|= Изход
+
+|:
+```
+a b c
+d * e
+f g h
+1
+
+|:
+```
+a b c a b c a b c
+d * e d * e d * e
+f g h f g h f g h
+a b c a b c a b c
+d * e d * e d * e
+f g h f g h f g h
+a b c a b c a b c
+d * e d * e d * e
+f g h f g h f g h
+
+|:
+```
+a b c
+d * e
+f g h
+2
+
+|:
+```
+# # # # # # # # #
+# # # # # # # # #
+# # # # # # # # #
+# # # a b c # # #
+# # # d * e # # #
+# # # f g h # # #
+# # # # # # # # #
+# # # # # # # # #
+# # # # # # # # #
+
+|:
+```
+a b c
+d * e
+f g h
+3
+
+|:
+```
+a a a b b b c c c
+a a a b b b c c c
+a a a b b b c c c
+d d d a b c e e e
+d d d d * e e e e
+d d d f g h e e e
+f f f g g g h h h
+f f f g g g h h h
+f f f g g g h h h
+
+
+### Задача 23
+
+От входа получавате цяло неотрицателно число, по-малко от 50.
+Трябва да изкарате спирала от това число към нула (включително), която се движи от началното число до нула обратно на часовниковата стрелка, като 1цата е в дясно от нулата.
+
+Зачитайте, че 0 винаги е в центъра на спиралата и се въртите първо с една позиция разстояние, после с две и так. нат.
+
+*[(Вашия изход не е нужно да бъде подравнен.)]*
+
+:table_2
+|= Вход
+|= Изход
+
+|: 4
+|:
+```
+ 0 1
+4 3 2
+
+|: 5
+|:
+```
+5 0 1
+4 3 2
+
+|: 10
+|:
+```
+6 7 8 9
+5 0 1 10
+4 3 2
+
+|: 15
+|:
+```
+ 6 7 8 9
+ 5 0 1 10
+ 4 3 2 11
+15 14 13 12
+
+
+## За любознателни
+
+### Задача 24
+
+Реализирайте матричен калкулатор.
+От входа получавате матрица 4 на 4 с реални числа и след това получавате редица операции.
+
+Всяка операция започва с буква, като буквата `[$]` сигнализира край на програмата.
+След всеки знак има няколко аргумента, т.е. допълнителни стойности които трябва да се въведат, преди операцията да се изпълни.
+
+.bulleted
+- Операцията `[*]` обозначава умножение на ред, и след знака има цяло неотрицателно число за индекс на ред и след него е реално число (коефициент с който да умножим реда).
+- Операцията `[+]` обозначава сума на редове, след знака се очакват два неотрицателни индекса на редове, първия ред се сумира в втория
+- Операцията `[^]` обозначава размяна на редове, след знака се очакват два неотрицателни индекса на редове и стойностите им се разменят.
+
+След всяка операция (освен `[$]`) трябва да изкарате състоянието на матрицата.
+
+### Задача 25
+
+Трябва да реализирате [url https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life Играта "Живот"].
+
+От входа получавате матрица 10 на 10 с булеви стойности.
+След това получавате неотрицателно число: брой генерации (ходове).
+
+Всяка клетка наричаме жива или мъртва (съответно на `[true]` или `[false]`).
+В една генерация (ход) на играта, всяка клетка променя своя статус (стойност) по следните правила:
+.bulleted
+- всяка жива клетка с по-малко от два живи съседа (вертикално, хоризонтално и диагонално) умира
+- всяка жива клетка с два или три живи съседа остава жива
+- всяка жива клетка с повече от три живи съседа умира
+- всяка мъртва клетка с точно три живи съседа оживява
diff --git a/src/teaching/upp-2025/week08/tex/line_interpolation.tex b/src/teaching/upp-2025/week08/tex/line_interpolation.tex
new file mode 100644
index 0000000..ab6f95c
--- /dev/null
+++ b/src/teaching/upp-2025/week08/tex/line_interpolation.tex
@@ -0,0 +1,21 @@
+% https://alfurka.github.io/quick-tikz/
+\begin{tikzpicture}[background rectangle/.style={fill=white}, show background rectangle]
+ % Axis
+ \draw[step=1,gray,very thin] (-5,-5) grid (5,5);
+
+ % Pixels
+ \draw[fill=lightgray,ultra thin] (-4,-4) rectangle ++(1,1);
+
+ \foreach \y in {-3,-2}
+ \foreach \x in {\y-1,\y}
+ \draw[fill=lightgray,ultra thin] (\x,\y) rectangle ++(1,1);
+
+ \draw[fill=lightgray,ultra thin] (-1,-2) rectangle ++(1,1);
+
+ \foreach \y in {-1,0,1,2}
+ \foreach \x in {\y,\y+1}
+ \draw[fill=lightgray,ultra thin] (\x,\y) rectangle ++(1,1);
+
+ % Main shape
+ \draw[blue] (-4,-3.5) -- (3.5,2.5);
+\end{tikzpicture}
diff --git a/src/teaching/upp-2025/week08/text/output_interpolation_1.txt b/src/teaching/upp-2025/week08/text/output_interpolation_1.txt
new file mode 100644
index 0000000..1e4abf8
--- /dev/null
+++ b/src/teaching/upp-2025/week08/text/output_interpolation_1.txt
@@ -0,0 +1,10 @@
+
+
+ xx
+ xx
+ xx
+ xx
+ xxx
+ xx
+ x
+