Summary Files Commits Branches @commit @diff @stats
path: root / src
diff options
context:
space:
mode:
Commit996110806ba5df44c63e64d34510036670a64765 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-08-17 20:31:07 +0300
Committer
 Syndamia <kamen@syndamia.com>
2025-08-17 20:31:07 +0300
Filesb6c68f320e07bebb6053032882b75f3427c71bf9 /src
syndamia.com-996110806ba5df44c63e64d34510036670a64765.tar
syndamia.com-996110806ba5df44c63e64d34510036670a64765.tar.gz
syndamia.com-996110806ba5df44c63e64d34510036670a64765.zip
Parent173c41e6f2e4f3ce750c33769b2e5a14f0cacbb7 (diff)
feat(teaching/upp-2023): Converted to dunbar
26 files changed, 1646 insertions, 1784 deletions
-rw-r--r--src/teaching/upp-2023/additional1/index.du (renamed from src/teaching/upp-2023/additional1/index.md)229
-rw-r--r--src/teaching/upp-2023/additional2/index.du (renamed from src/teaching/upp-2023/additional2/index.md)161
-rw-r--r--src/teaching/upp-2023/index.du37
-rw-r--r--src/teaching/upp-2023/index.md35
-rw-r--r--src/teaching/upp-2023/week1/index.du (renamed from src/teaching/upp-2023/week1/index.md)33
-rw-r--r--src/teaching/upp-2023/week1/setup.du (renamed from src/teaching/upp-2023/week1/setup.md)345
-rw-r--r--src/teaching/upp-2023/week1/welcome.du (renamed from src/teaching/upp-2023/week1/welcome.md)303
-rw-r--r--src/teaching/upp-2023/week10/index.du91
-rw-r--r--src/teaching/upp-2023/week10/index.md90
-rw-r--r--src/teaching/upp-2023/week11/index.du129
-rw-r--r--src/teaching/upp-2023/week11/index.md127
-rw-r--r--src/teaching/upp-2023/week12/index.du (renamed from src/teaching/upp-2023/week12/index.md)93
-rw-r--r--src/teaching/upp-2023/week13/index.du (renamed from src/teaching/upp-2023/week13/index.md)72
-rw-r--r--src/teaching/upp-2023/week14/index.du (renamed from src/teaching/upp-2023/week14/index.md)33
-rw-r--r--src/teaching/upp-2023/week2/index.du (renamed from src/teaching/upp-2023/week2/index.md)183
-rw-r--r--src/teaching/upp-2023/week2/revision.du (renamed from src/teaching/upp-2023/week2/revision.md)207
-rw-r--r--src/teaching/upp-2023/week3/index.du (renamed from src/teaching/upp-2023/week3/index.md)255
-rw-r--r--src/teaching/upp-2023/week3/revision.du (renamed from src/teaching/upp-2023/week3/revision.md)196
-rw-r--r--src/teaching/upp-2023/week4/index.du (renamed from src/teaching/upp-2023/week4/index.md)96
-rw-r--r--src/teaching/upp-2023/week4/revision.du (renamed from src/teaching/upp-2023/week4/revision.md)106
-rw-r--r--src/teaching/upp-2023/week5/index.du (renamed from src/teaching/upp-2023/week5/index.md)99
-rw-r--r--src/teaching/upp-2023/week5/revision.du (renamed from src/teaching/upp-2023/week5/revision.md)24
-rw-r--r--src/teaching/upp-2023/week6/index.du (renamed from src/teaching/upp-2023/week6/index.md)139
-rw-r--r--src/teaching/upp-2023/week7/index.du (renamed from src/teaching/upp-2023/week7/index.md)146
-rw-r--r--src/teaching/upp-2023/week8/index.du (renamed from src/teaching/upp-2023/week8/index.md)100
-rw-r--r--src/teaching/upp-2023/week9/index.du (renamed from src/teaching/upp-2023/week9/index.md)101
diff --git a/src/teaching/upp-2023/additional1/index.md b/src/teaching/upp-2023/additional1/index.du
index f366858..3cb8140 100644
--- a/src/teaching/upp-2023/additional1/index.md
+++ b/src/teaching/upp-2023/additional1/index.du
@@ -1,24 +1,26 @@
# Допълнително упражнение 1 - УПП, 04.11.2023
-GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com/a/nlFuKALw)
+\n
-При изображението ![](/img/dialog-question.png) трябва да спрете, да помислите и да си отговорите на дадения въпрос.
+GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.com/a/nlFuKALw]
+
+При изображението [image /img/dialog-question.png трябва да спрете, да помислите и да си отговорите на дадения въпрос.
Почти винаги ако не може да отговорите, ще имате проблеми в бъдеще с решаването.
Понякога ще ви спираме и ще ви питаме за тези въпроси.
## Задача - База гаднни
-&:warn **Нямате** право да използвате каквито и да е функции, които вие не сте написали, както и неизучаван материал като двуизмерни масиви или динамична памет.
-**Не** употребявайте търсачки, ако ви трябва информация за нещо, ще може да си я изкарате с една проста тестова програма или калкулатор.
+.warn =[Нямате]= право да използвате каквито и да е функции, които вие не сте написали, както и неизучаван материал като двуизмерни масиви или динамична памет.
+=[Не]= употребявайте търсачки, ако ви трябва информация за нещо, ще може да си я изкарате с една проста тестова програма или калкулатор.
-<br>
+\n
Ще работим върху нещо като база данни, може да си го представете като един файл на Excel.
Имаме две таблици, за удобство първата ще я наричаме "Таблица А", а втората "Таблица Б".
Таблица А има максимум 8 реда, като всеки ред е едно цяло число с 9 цифри.
Таблица Б има максимум 8 реда, като всеки ред е число между 1 и 4294967295.
-&:question В какъв тип ще запазим всяка таблица?
+.question В какъв тип ще запазим всяка таблица?
В задачата винаги номерираме редовете (числата) на всяка таблица, започвайки от индекс 1.
Чрез различни комбинации на ред в таблица А и ред в таблица Б получаваме различни стойности.
@@ -39,142 +41,142 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com
Стойностите от таблица А са винаги ограничени отгоре с най-големия брой битове, които комфортно може да поберем в 7 цифри.
Тоест 9999999 не е валидна стойност от таблица А, докато 8388608 e.
-&:question Колко най-много *битове* можем със сигурност да поберем в 7 цифри?
+.question Колко най-много *[битове]* можем със сигурност да поберем в 7 цифри?
Понеже редовете са от 1 до 9, ако в таблица А имаме ред 0 правим нещо специално, но това ще видите в бъдеще.
-&:question Разбрахте ли как таблиците "изглеждат"?
+.question Разбрахте ли как таблиците "изглеждат"?
### a) разделяне на реда от таблица А
Преди да започнем, трябва да имплементираме функция, която разделя дадения ред от таблица А на трите му компонента (ред, тип и стойност):
-`getRow` - приема ред от таблица А и указатели към променливи за ред, тип и стойност; не връща нищо
+`[getRow]` - приема ред от таблица А и указатели към променливи за ред, тип и стойност; не връща нищо\n
В подадените указатели пази съответните стойности от реда
-&:question Защо приемаме указатели към променливи? Каква е "сигнатурата" на функцията?
+.question Защо приемаме указатели към променливи? Каква е "сигнатурата" на функцията?
-<br>
-**Примери:**
+\n
+=[Примери:]=
-|Извикване|Резултат|
-|---------|--------|
-|getRow(1234567, &row, &type, &value)|row = 0, type = 0, value = 1234567|
-|getRow(12345678, &row, &type, &value)|row = 0, type = 1, value = 2345678|
-|getRow(123456789, &row, &type, &value)|row = 1, type = 2, value = 3456789|
+.table
+|=Извикване=||=Резултат=|
+|:getRow(1234567, &row, &type, &value):||:row = 0, type = 0, value = 1234567:|
+|:getRow(12345678, &row, &type, &value):||:row = 0, type = 1, value = 2345678:|
+|:getRow(123456789, &row, &type, &value):||:row = 1, type = 2, value = 3456789:|
### б) обикновенно число
Ако типа е цифрата "0", тогава стойността в базата данни е някакво число с плаваща запетая.
Самото число е разделено на две части: цифрите преди запетаята се намират в стойността от таблица А, докато цифрите след запетаята са в реда от таблица Б.
-&:question В какъв тип данни трябва да запазим числото? Как ще "слепим" двете му части.
+.question В какъв тип данни трябва да запазим числото? Как ще "слепим" двете му части.
Имплементирайте функция:
-`parseNumber` - приема стойност от таблица А и ред от таблица Б; връща полученото число от тези стойности
+`[parseNumber]` - приема стойност от таблица А и ред от таблица Б; връща полученото число от тези стойности
-<br>
-**Примери:**
-*Възможно е отклонението на последния пример да бъде повече от 2 единици*
+\n
+=[Примери:]=
+*[Възможно е отклонението на последния пример да бъде повече от 2 единици]*
-|Извикване|Резултат|
-|---------|--------|
-|a = parseNumber(1, 5)|a = 1.5|
-|a = parseNumber(0, 37)|a = 0.37|
-|a = parseNumber(913, 0)|a = 913.0|
-|a = parseNumber(8388607, 18446744073709551615)|a = 8388607.18446744073709551615|
+.table
+|=Извикване=||=Резултат=|
+|:a = parseNumber(1, 5):||:a = 1.5:|
+|:a = parseNumber(0, 37):||:a = 0.37:|
+|:a = parseNumber(913, 0):||:a = 913.0:|
+|:a = parseNumber(8388607, 18446744073709551615):||:a = 8388607.18446744073709551615:|
### в) числов текст (част едно)
Ако типа е "1", тогава стойността в базата данни е някакъв низ (последователност от букви), която е кодирана в числата.
Всеки 5 бита в реда (от дясно на ляво) от таблица Б определя буква, като:
-|Битове|Десетично число|Буква|
-|------|---------------|-----|
-|00000 |0 |A |
-|00001 |1 |B |
-|00010 |2 |C |
-|...|||
-|11001 |25 |Z |
-|11010 |26 |*шпация*|
-|11011 |27 |. |
-|11100 |28 |, |
-|11101 |29 |: |
-|11110 |30 |? |
-|11111 |31 |! |
+.table
+|:Битове:||:Десетично число:||:Буква:|
+|:00000 :||:0 :||:A :|
+|:00001 :||:1 :||:B :|
+|:00010 :||:2 :||:C :|
+|:... :||: :||: :|
+|:11001 :||:25 :||:Z :|
+|:11010 :||:26 :||:*[шпация]*:|
+|:11011 :||:27 :||:. :|
+|:11100 :||:28 :||:, :|
+|:11101 :||:29 :||:: :|
+|:11110 :||:30 :||:? :|
+|:11111 :||:31 :||:! :|
-Тоест ако в нашия тип данни запазваме само 10 бита, тогава числото "2" ще бъде `0000000010` и имаме низа "AC".
+Тоест ако в нашия тип данни запазваме само 10 бита, тогава числото "2" ще бъде `[0000000010]` и имаме низа "AC".
Игнорирайте старшите битове, които остават като "остатък" (по-малко от 5 бита ширина).
-&:question Колко бита наистина запазваме в нашия тип данни? Колко бита ще трябва да игнорираме? Колко най-много букви може да поберем?
+.question Колко бита наистина запазваме в нашия тип данни? Колко бита ще трябва да игнорираме? Колко най-много букви може да поберем?
Имплементирайте функция:
-`decodeNumberText` - приема ред от таблица Б и указател към "низ"; не връща нищо
+`[decodeNumberText]` - приема ред от таблица Б и указател към "низ"; не връща нищо\n
Записва декодиран текстът от реда в указателя
-&:question Нарочно има кавички около думата "низ", какъв трябва наистина да е типа на указателя?
+.question Нарочно има кавички около думата "низ", какъв трябва наистина да е типа на указателя?
-<br>
-**Примери:**
+\n
+=[Примери:]=
-|Извикване|Резултат|
-|---------|--------|
-|decodeNumberText(2, decodedText)|decodedText = "AAAAAAAAAAAC"|
-|decodeNumberText(257104811188071551, decodedText)|decodedText = "HELLO WORLD!"|
-|decodeNumberText(1148238614786569150, decodedText)|decodedText = "!. ,:?!. ,:?"|
+.table
+|=Извикване=||=Резултат=|
+|:decodeNumberText(2, decodedText):||:decodedText = "AAAAAAAAAAAC":|
+|:decodeNumberText(257104811188071551, decodedText):||:decodedText = "HELLO WORLD!":|
+|:decodeNumberText(1148238614786569150, decodedText):||:decodedText = "!. ,:?!. ,:?":|
### г) числов текст (част две)
Дотук добре, обаче не сме свършили съвсем.
-От гледна точка на сигурност, искаме дори някой да получи достъп до таблица Б, да не може да разбере текста дори след като е използвал `decodeNumberText`.
+От гледна точка на сигурност, искаме дори някой да получи достъп до таблица Б, да не може да разбере текста дори след като е използвал `[decodeNumberText]`.
-Ще използваме [шифъра на Цезар](https://en.wikipedia.org/wiki/Caesar_cipher): един много прост шифър, където отместваме позицията на всяка буква с няколко места "напред".
+Ще използваме [url https://en.wikipedia.org/wiki/Caesar_cipher шифъра на Цезар]: един много прост шифър, където отместваме позицията на всяка буква с няколко места "напред".
Тоест, при отместаване 3, буквата A става D, B става E, и так. нат.
Как декодираме?
Отместваме буквите назад, тоест ако имаме текста "KHOOR" и ви кажа, че съм го кодирал като съм отместил всяка буква напред с 3 позиции, тогава при декодиране от K става на H, от H става на E, от О става на L и от R става на O.
-&:question Какво става със знака "!"? Има ли лесен (математически) начин да дешифрираме всяка буква?
+.question Какво става със знака "!"? Има ли лесен (математически) начин да дешифрираме всяка буква?
Текстът, преди да е въведен в нашата база данни, ще бъде кодиран с шифъра на Цезар, като броя позиции с които сме отместили буквите се намира в стойността в таблица А.
Промененте функцията:
-`decodeNumberText` - приема ред от таблица Б, стойност от таблица А и указател към "низ"; не връща нищо
+`[decodeNumberText]` - приема ред от таблица Б, стойност от таблица А и указател към "низ"; не връща нищо\n
След като декодира текста от реда от Б, дешифрира го със стойността от таблица А
-<br>
-**Примери:**
+\n
+=[Примери:]=
-|Извикване|Резултат|
-|---------|--------|
-|decodeNumberText(0, 2, decodedText)|decodedText = "AAAAAAAAAAAC"|
-|decodeNumberText(0, 257104811188071551, decodedText)|decodedText = "HELLO WORLD!"|
-|decodeNumberText(0, 1148238614786569150, decodedText)|decodedText = "!. ,:?!., :?"|
-|decodeNumberText(17, 632247276719883827, decodedText)|decodedText = "AAAAAAAAAAAC"|
-|decodeNumberText(3, 368677860020992194, decodedText)|decodedText = "HELLO WORLD!"|
-|decodeNumberText(30, 1073856582231288700, decodedText)|decodedText = "!. ,:?!., :?"|
-|decodeNumberText(32, 1148238614786569150, decodedText)|decodedText = "!. ,:?!., :?"|
+.table
+|=Извикване=||=Резултат=|
+|:decodeNumberText(0, 2, decodedText):||:decodedText = "AAAAAAAAAAAC":|
+|:decodeNumberText(0, 257104811188071551, decodedText):||:decodedText = "HELLO WORLD!":|
+|:decodeNumberText(0, 1148238614786569150, decodedText):||:decodedText = "!. ,:?!., :?":|
+|:decodeNumberText(17, 632247276719883827, decodedText):||:decodedText = "AAAAAAAAAAAC":|
+|:decodeNumberText(3, 368677860020992194, decodedText):||:decodedText = "HELLO WORLD!":|
+|:decodeNumberText(30, 1073856582231288700, decodedText):||:decodedText = "!. ,:?!., :?":|
+|:decodeNumberText(32, 1148238614786569150, decodedText):||:decodedText = "!. ,:?!., :?":|
### д) масив (част едно)
Ако типа е "2", тогава в реда от Б сме вложили масив от стойности (числа).
Всеки 4 бита определят една стойност, като първия елемент е старшите (най-левите) битове, докато последния е младшите (най-десните) битове.
-&:question Коколо на брой елемента пазим в реда от Б?
+.question Коколо на брой елемента пазим в реда от Б?
Имплементирайте функцията:
-`decodeArray` - приема ред от таблица Б и указател към масив; не връща нищо
+`[decodeArray]` - приема ред от таблица Б и указател към масив; не връща нищо\n
Декодира елементите от реда и ги запазва в указателя
-<br>
-**Пример:**
+\n
+=[Пример:]=
-|Извикване|Резултат|
-|---------|--------|
-|decodeArray(846406911526255600, arr)|arr = { 0, 11, 11, 15, 0, 10, 9, 10, 0, 0, 15, 5, 3, 11, 15, 0 }|
+.table
+|=Извикване=||=Резултат=|
+|:decodeArray(846406911526255600, arr):||:arr = { 0, 11, 11, 15, 0, 10, 9, 10, 0, 0, 15, 5, 3, 11, 15, 0 }:|
### е) масив (част две)
@@ -183,61 +185,68 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com
В старшите 20 бита от стойността в таблица А ще пазим общо 5 възможни валидни стойности, а в останалите (младши) 3 бита ще пазим индекс към тези стойности, който индекс (започвайки от 1) определя стойността по подразбиране.
-Пример: ако имаме побитово `1111100000100011101101010101`, тогава:
-
-- валидните числа са `11111, 00000, 10001, 11011 и 01010`
-- числото по подразбиране е 5-тото (`101 = 5`), което е числото `01010`
-- ако от реда в Б изкараме `11011`, тогава го запазваме, обаче ако изкараме примерно `11000` тогава го превръщаме в стойността по подразбиране, а именно `01010`
+Пример: ако имаме побитово `[1111100000100011101101010101]`, тогава:
+.bulleted
+- валидните числа са `[11111, 00000, 10001, 11011 и 01010]`
+- числото по подразбиране е 5-тото (`[101 = 5]`), което е числото `[01010]`
+- ако от реда в Б изкараме `[11011]`, тогава го запазваме, обаче ако изкараме примерно `[11000]` тогава го превръщаме в стойността по подразбиране, а именно `[01010]`
Разширете функцията:
-`decodeArray` - приема стойност от таблица А, ред от таблица Б и указател към масив; не връща нищо
+`[decodeArray]` - приема стойност от таблица А, ред от таблица Б и указател към масив; не връща нищо\n
Декодира елементите от реда, като всички невалидни стойност се превръщат в стойността по подразбиране, и ги запазва в указателя
-<br>
-**Примери:**
+\n
+=[Примери:]=
-|Извикване|Резултат|
-|---------|--------|
-|decodeArray(360537, 846406911526255600, arr)|arr = { 0, 11, 11, 11, 0, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 0 }|
-|decodeArray(3119812, 846406911526255600, arr)|arr = { 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 15, 5, 3, 8, 15, 8 }|
+.table
+|=Извикване=||=Резултат=|
+|:decodeArray(360537, 846406911526255600, arr):||:arr = { 0, 11, 11, 11, 0, 11, 11, 11, 0, 0, 11, 11, 11, 11, 11, 0 }:|
+|:decodeArray(3119812, 846406911526255600, arr):||:arr = { 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 15, 5, 3, 8, 15, 8 }:|
### ж) компресирани стойности
Ако редът в таблица А е 0, тогава цялата стойност в базата данни е побрана в стойността на таблица А.
Очевидно само в стойност на таблица А имаме по-малко битове, отколкото в стойност на таблица А плюс ред в таблица Б, затова се налага по някакъв начин да "компресираме" информацията, така че да се побере.
-&:question Колко бита побираме в стойност на таблица А? Колко бита ни трябват общо, за да обработим една стойност в базата данни?
+.question Колко бита побираме в стойност на таблица А? Колко бита ни трябват общо, за да обработим една стойност в базата данни?
Ще го направим така: в стойността от таблица А ще пазим индекси, и всеки индекс ще съответства на някакво по-голямо число, което се съдържа в друг масив, който ще наричаме криптографски ред.
Пример (всички числа са представени двоично; стойностите не са напълно валидни за базата данни, но са логически коректни):
-<!-- 000 001 010 011 100 101 -->
-- Kриптографски ред е `00000, 10101, 11011, 10001, 01101, 10100`
+.comment 000 001 010 011 100 101
+
+:bulleted
+- Kриптографски ред е `[00000, 10101, 11011, 10001, 01101, 10100]`
+ .bulleted
- Индексираме от 0 до 5, което побитово е от 000 до 101
-- Стойност в таблицата А е `011001000001101101`
- - Разделяйки го на индекси, това са `011, 001, 000, 001, 101, 101`
-- Слепвайки от криптографския ред на тези индекси получаваме `100011010100000101011010010100`
+
+- Стойност в таблицата А е `[011001000001101101]`
+ .bulleted
+ - Разделяйки го на индекси, това са `[011, 001, 000, 001, 101, 101]`
+
+- Слепвайки от криптографския ред на тези индекси получаваме `[100011010100000101011010010100]`
+
Във вашата програма ще се наложи да направите още една променлива, в която пазите криптографския ред.
Всяка стойност в реда ще съдържа 21 бита.
Първите (най-левите) три бита от стойността в таблица А не са индекси, а трябва да се копират дословно.
След тях има 4 индекса, всеки с по 5 бита.
-&:question Как е разделена побитово една стойност от таблица А? Кои индекси за кои стойности ще се ползват? Достатъчно ли е всеки индекс към криптографския ред да бъде само 5 бита (тоест може ли да има повече от 2&#8309; числа в реда)? Защо имаме само 4 индекса?
+.question Как е разделена побитово една стойност от таблица А? Кои индекси за кои стойности ще се ползват? Достатъчно ли е всеки индекс към криптографския ред да бъде само 5 бита (тоест може ли да има повече от 2&#8309; числа в реда)? Защо имаме само 4 индекса?
Напишете функция:
-`decompress` - приема стойност от таблица А, криптографски ред, указател за запазване на декомпресираната стойност от таблица А и указател за запазване на декомпресирания ред от таблица Б; не връща нищо
+`[decompress]` - приема стойност от таблица А, криптографски ред, указател за запазване на декомпресираната стойност от таблица А и указател за запазване на декомпресирания ред от таблица Б; не връща нищо
-<br>
-**Примери:**
+\n
+=[Примери:]=
-|Извикване|Резултат|
-|---------|--------|
-|crypt = { 0, 2, 5 }<br>decompress(32770, crypt, &decompA, &decompB)|decompA = 1, decompB = 5|
-|crypt = { 2097151 }<br>decompress(7340032, crypt, &decompA, &decompB)|decompA = 8388607, decompB = 18446744073709551615|
+.table
+|=Извикване=||=Резултат=|
+|:crypt = { 0, 2, 5 }\ndecompress(32770, crypt, &decompA, &decompB):||:decompA = 1, decompB = 5:|
+|:crypt = { 2097151 }\ndecompress(7340032, crypt, &decompA, &decompB):||:decompA = 8388607, decompB = 18446744073709551615:|
### з) входни данни
@@ -248,22 +257,24 @@ GitHub classroom: [classroom.github.com/a/nlFuKALw](https://classroom.github.com
### и) четене от базата данни
След това получавате команди (знак):
-
-- `g X`: изкарвате на екрана стойността в базата данни, започвайки с ред X от таблица А
-- `i`: Връщате информация за базата данни
-- `q`: спиране на програмата
+.bulleted
+- `[g X]`: изкарвате на екрана стойността в базата данни, започвайки с ред X от таблица А
+- `[i]`: Връщате информация за базата данни
+- `[q]`: спиране на програмата
### й) заявки
-- `t X`: връщате броя и след това всички редове от таблица А с тип X
-- `r X`: връщате броя и всички редове от таблица А, които използват реда Х
+.bulleted
+- `[t X]`: връщате броя и след това всички редове от таблица А с тип X
+- `[r X]`: връщате броя и всички редове от таблица А, които използват реда Х\n
Ако реда е 0, тогава трябва да върнете и размера на криптографския ред
### к) презаписване в базата данни
-- `w T R V`: запазвате (презаписвате) стойност V в таблица Т (може да бъде `A` или `B`) на ред R
-- `s T V`: запазвате стойност V от тип Т в базата данни
+.bulleted
+- `[w T R V]`: запазвате (презаписвате) стойност V в таблица Т (може да бъде `[A]` или `[B]`) на ред R
+- `[s T V]`: запазвате стойност V от тип Т в базата данни\n
Пробвате се да я запазите, използвайки и двете таблици, но ако Б вече е запълнена, добавяте я като компресирана стойност в таблица А.
Ако и А е запълнена, изкарвате съобщение за запълнена база данни и не запазвате стойността.
-&:question Какво трябва да направите, ако получите компресирана стойност за таблица А?
+.question Какво трябва да направите, ако получите компресирана стойност за таблица А?
diff --git a/src/teaching/upp-2023/additional2/index.md b/src/teaching/upp-2023/additional2/index.du
index d4e07b4..d562120 100644
--- a/src/teaching/upp-2023/additional2/index.md
+++ b/src/teaching/upp-2023/additional2/index.du
@@ -1,15 +1,18 @@
# Допълнително упражнение 2 - УПП, 04.12.2023
-GitHub classroom: [classroom.github.com/a/CrerXpf6](https://classroom.github.com/a/CrerXpf6)
+\n
-&:important Следете внимателно дали триете всичката си динамична памет коректно на всяка подточка!
- Случвало се е на контролни да се пишат двойки ако всичко друго е коректно, но има неизтрита памет!
+GitHub classroom: [url https://classroom.github.com/a/CrerXpf6 classroom.github.com/a/CrerXpf6]
+
+.important
+Следете внимателно дали триете всичката си динамична памет коректно на всяка подточка!
+Случвало се е на контролни да се пишат двойки ако всичко друго е коректно, но има неизтрита памет!
## Задача - текстов редактор
Ще направим един прост текстов редактор.
От входа ще получавате редове текст, в общия случай редовете ще бъдат някакво текстово съдъражение, което ще трябва да запазите в паметта.
-Определени редове ще имат команди, чрез които ще *редактирате* вече въведения текст.
+Определени редове ще имат команди, чрез които ще *[редактирате]* вече въведения текст.
Задачата е сравнително голяма, затова е разделена на подточки, като всяка надгражда предходната.
@@ -18,14 +21,15 @@ GitHub classroom: [classroom.github.com/a/CrerXpf6](https://classroom.github.com
Като за начало, нека да имплементираме запазването на текст.
От конзолата ще получавате редове текст, всеки ред ще е с максимална дължина от 1024 знака, след това трябва да го запазите.
-&:important Може да използвате масив със статична дължина за буфер, обаче трябва да използвате възможно най-малко памет за "перманентното" запазване на реда текст във вашата програма.
- Използвайте многомерен масив за запазване на редовете, вместо всичко да се запазва в един голям низ.
- Това е нужно за бъдещи подточки.
+.important
+Може да използвате масив със статична дължина за буфер, обаче трябва да използвате възможно най-малко памет за "перманентното" запазване на реда текст във вашата програма.
+Използвайте многомерен масив за запазване на редовете, вместо всичко да се запазва в един голям низ.
+Това е нужно за бъдещи подточки.
-*Само за тестване*, набързо имплементирайте проверка, ако първата буква от реда е `Q`, тогава програмата да спре да приема вход, да изкара въведения текст до сега и да приключи.
+*[Само за тестване]*, набързо имплементирайте проверка, ако първата буква от реда е `[Q]`, тогава програмата да спре да приема вход, да изкара въведения текст до сега и да приключи.
-**Пример:**
-*Смесен вход/изход*
+=[Пример:]=
+*[Смесен вход/изход]*
```terminal
DAY HAD DAWNED COLD AND GRAY WHEN
@@ -37,37 +41,35 @@ DAY HAD DAWNED COLD AND GRAY WHEN
the man turned aside from the main Yukon trail. He climbed the high
earth-bank where a little-traveled trail led east through the pine for-
est. It was a high bank, and he paused to breathe at the top.
-```
### б) функция за извеждане на команди
-Команда е един ред текст, като първата буква, различна от шпация, е `:`.
+Команда е един ред текст, като първата буква, различна от шпация, е `[:]`.
След нея има нула или повече шпации и още една буква, тази буква определя коя команда искаме да използваме.
В зависимост от командата, може да имаме параметри, поставени след буквата за командата.
Параметрите не съдържат шпации и параметрите са разделени помежду си с поне една шпация.
Тоест, един команден ред ще бъде в този формат (като нещата в квадратните скоби са описания, какво има на конкретното място):
-```
[≥0 шпации]:[≥0 шпации][буква][≥0 шпации][параметър 1][≥1 шпации][параметър 2]...[≥1 шпации][последен параметър]
-```
Командите не се запазват като част от текста.
-Имплементирайте функция `extractCommand`, която приема низ.
+Имплементирайте функция `[extractCommand]`, която приема низ.
Ако низът е команда, тогава връща масив от низове, първия от които съдържа буквата, определяща командата, докато останалите низове са параметрите.
Ако низът не е команда, тогава връща празен масив.
-&:warn Какво означава празен масив зависи от имплементацията ви.
- За предпочитане е да не заделяте памет, когато не е нужно.
+.warn
+Какво означава празен масив зависи от имплементацията ви.
+За предпочитане е да не заделяте памет, когато не е нужно.
-&:question Как ще върнем масив? Нужно ли е да връщаме бройката елементи?
+.question Как ще върнем масив? Нужно ли е да връщаме бройката елементи?
-*Само за тестване*, след всеки въведен ред, ако е команда, изкарайте извлечените стойности от `extractCommand`, със запетайки след всяка.
-Като при [подточка a)](#section), ако редът започва с `Q`, спирате приемане на вход и изкарвате запазения текст.
+*[Само за тестване]*, след всеки въведен ред, ако е команда, изкарайте извлечените стойности от `[extractCommand]`, със запетайки след всяка.
+Като при [url #section подточка a)], ако редът започва с `[Q]`, спирате приемане на вход и изкарвате запазения текст.
-**Пример:**
-*Смесен вход/изход*
+=[Пример:]=
+*[Смесен вход/изход]*
```terminal
DAY HAD DAWNED COLD AND GRAY WHEN
@@ -89,21 +91,19 @@ DAY HAD DAWNED COLD AND GRAY WHEN
the man turned aside from the main Yukon trail. He climbed the high
earth-bank where a little-traveled trail led east through the pine for-
est. It was a high bank, and he paused to breathe at the top.
-```
### в) команда print
-Имплементирайте функция `print`, която приема масив, съдържащ целия запазен текст, и го изкарва на екрана, като преди всеки ред изкарва неговия номер (първи ред има номер 1, втори има номер 2, так. нат.) с **вмъкнати водещи нули** (така че всяко число да бъде съставено от един и същ брой знаци).
+Имплементирайте функция `[print]`, която приема масив, съдържащ целия запазен текст, и го изкарва на екрана, като преди всеки ред изкарва неговия номер (първи ред има номер 1, втори има номер 2, так. нат.) с =[вмъкнати водещи нули]= (така че всяко число да бъде съставено от един и същ брой знаци).
Ако текстът е празен, не изкарва нищо.
-Тоест, ако сме въвели текст от 7 реда, `print` ще изкара:
+Тоест, ако сме въвели текст от 7 реда, `[print]` ще изкара:
```terminal
1 First line
2 Second line
...
7 Last line
-```
Ако сме въвели 23 реда:
@@ -116,7 +116,6 @@ est. It was a high bank, and he paused to breathe at the top.
11 Eleventh line
...
23 Last line
-```
Ако сме въвели 130 реда:
@@ -130,18 +129,17 @@ est. It was a high bank, and he paused to breathe at the top.
100 100th line
...
130 Last line
-```
-
-Командата, която използва тази функция, се определя с главната буква `P` и няма параметри.
-За всички команди (за момента само `P`):
+Командата, която използва тази функция, се определя с главната буква `[P]` и няма параметри.
+За всички команди (за момента само `[P]`):
+.bulleted
- Обновете програмата, така че при валидна команда, да изпълни съответната и функция и да продължи изпълнение.
- Ако срещнете недефинирана команда, трябва да изкарате на екрана "; Not an editor command" и изпълнението на програмата да продължи.
- Ако срещнете допълнителни/излишни параметри, трябва да изкарате "; Excess parameters", но функцията да се изпълни с коректния брой параметри.
-**Пример:**
-*Смесен вход/изход*
+=[Пример:]=
+*[Смесен вход/изход]*
```terminal
DAY HAD DAWNED COLD AND GRAY WHEN
@@ -162,16 +160,15 @@ DAY HAD DAWNED COLD AND GRAY WHEN
the man turned aside from the main Yukon trail. He climbed the high
earth-bank where a little-traveled trail led east through the pine for-
est. It was a high bank, and he paused to breathe at the top.
-```
### г) команда quit
-Вече може да премахнете временната функционалност, където ако реда започва с `Q` програмата спира и изкарва целия текст.
-Добавете командата `Q`, която изкарва на екрана целия текст (без номера на редове) и спира програмата.
+Вече може да премахнете временната функционалност, където ако реда започва с `[Q]` програмата спира и изкарва целия текст.
+Добавете командата `[Q]`, която изкарва на екрана целия текст (без номера на редове) и спира програмата.
-**Примери:**
-*Смесен вход/изход*
+=[Примери:]=
+*[Смесен вход/изход]*
```terminal
DAY HAD DAWNED COLD AND GRAY WHEN
@@ -179,7 +176,6 @@ the man turned aside from the main Yukon trail. He climbed the high
:Q
DAY HAD DAWNED COLD AND GRAY WHEN
the man turned aside from the main Yukon trail. He climbed the high
-```
```terminal
DAY HAD DAWNED COLD AND GRAY WHEN
@@ -188,28 +184,27 @@ the man turned aside from the main Yukon trail. He climbed the high
; Excess parameters
DAY HAD DAWNED COLD AND GRAY WHEN
the man turned aside from the main Yukon trail. He climbed the high
-```
### д) команда delete
-Имплементирайте функцията `deleteRow`, която получава целия текст, въведен до сега, и номер на реда (редовете се индексират от 1 до N).
+Имплементирайте функцията `[deleteRow]`, която получава целия текст, въведен до сега, и номер на реда (редовете се индексират от 1 до N).
Тя променя текста, като премахва реда на дадения номер.
-&:important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на `nullptr`, не искаме да използваме излишна памет.
+.important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на `[nullptr]`, не искаме да използваме излишна памет.
-&:question Какъв ще бъде типа на аргумента, който приема целия текст?
+.question Какъв ще бъде типа на аргумента, който приема целия текст?
-Добавете командата `D`, която приема един параметър - цяло положително число, и го прилага върху функцията `deleteRow`.
+Добавете командата `[D]`, която приема един параметър - цяло положително число, и го прилага върху функцията `[deleteRow]`.
Ако номера на реда е невалиден, трябва да изкарате съобщение "; Invalid row number".
Имплементирайте следните функционалности за всички команди:
-
+.bulleted
- Ако срещнете команда, на която не са и подадени нужния брой параметри, изкарайте съобщението "; Not enough parameters" и продължете изпълнение.
- Ако даден параметър на команда е от невалиден тип (подадени букви, когато се иска число, примерно), изкарайте "; Invalid parameter type".
Единствените типове на параметри са цели числа и произволни низове (без шпации).
-**Пример:**
-*Смесен вход/изход*
+=[Пример:]=
+*[Смесен вход/изход]*
```terminal
dAY HAD DAWNED COLD AND GRAY WHEN
@@ -242,20 +237,19 @@ est. It was a high bank, and he paused to breathe at the top.
DAY HAD DAWNED COLD AND GRAY WHEN
the man turned aside from the main Yukon trail. He climbed the high
earth-bank where a little-traveled trail led east through the pine for-
-```
### e) команда insert
-Имплементирайте функция `insertRow`, която приема целия текст, низ и номер на реда.
-Функцията вмъква низа в целия текст като ред **над** този на подадения номер.
+Имплементирайте функция `[insertRow]`, която приема целия текст, низ и номер на реда.
+Функцията вмъква низа в целия текст като ред =[над]= този на подадения номер.
Ако номерът е над броя въведени редове до сега, редът се вмъква като последен.
-Добавете команда `O`, която приема един параметър - неотрицателен ред.
-Следващия написан ред ще се вмъкне преди реда на дадения номер, използвайки функцията `insertRow`.
+Добавете команда `[O]`, която приема един параметър - неотрицателен ред.
+Следващия написан ред ще се вмъкне преди реда на дадения номер, използвайки функцията `[insertRow]`.
Ако номера е невалиден изкарва "; Invalid row number".
-**Пример:**
-*Смесен вход/изход*
+=[Пример:]=
+*[Смесен вход/изход]*
```terminal
the man turned aside from the main Yukon trail. He climbed the high
@@ -288,23 +282,22 @@ He excused
3 earth-bank where a little-traveled trail led east through the pine for-
4 est. It was a high bank, and he paused to breathe at the top.
5 He excused
-```
### ж) команда join
-Имплементирайте функция `joinRows`, която приема текстът, въведен до сега, и номер на ред N.
+Имплементирайте функция `[joinRows]`, която приема текстът, въведен до сега, и номер на ред N.
Функцията вмъква текста от ред N+1 в края на ред N, като ги разделя с една шпация.
Ред N+1 се изтрива.
Ако N е 0 или номера на последния ред, не прави нищо.
-&:important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на `nullptr`, не искаме да използваме излишна памет.
+.important Не забравяйте да промените размера на масива с низове! Не е решение просто да промените указателя към дадения ред на `[nullptr]`, не искаме да използваме излишна памет.
-Добавете команда `J`, която приема номер на ред - положително число.
-Следващия ред ще се вмъкне в края на сегашния, с една шпация между тях, използвайки функцията `joinRows`.
+Добавете команда `[J]`, която приема номер на ред - положително число.
+Следващия ред ще се вмъкне в края на сегашния, с една шпация между тях, използвайки функцията `[joinRows]`.
При подаден невалиден ред изкарвате "; Invalid row number".
-**Пример:**
-*Смесен вход/изход*
+=[Пример:]=
+*[Смесен вход/изход]*
```terminal
DAY HAD DAWNED
@@ -332,20 +325,19 @@ the man turned aside from the main Yukon trail. He climbed the high
:Q
DAY HAD DAWNED COLD AND GRAY WHEN
the man turned aside from the main Yukon trail. He climbed the high
-```
### з) команда word info
-Имплементирайте функция `wordOccurrences`, която приема целия текст и дума (низ без шпации).
+Имплементирайте функция `[wordOccurrences]`, която приема целия текст и дума (низ без шпации).
Тя изкарва на екрана броя на срещания на дадената дума в целия текст, като изхода е във формата "; N occurrences" (където N е броя на срещания).
-*Подсказвам, че за следващата подточка ще е полезно ако първо имплементирате функция, която връща броя срещания на дума в един ред.*
+*[Подсказвам, че за следващата подточка ще е полезно ако първо имплементирате функция, която връща броя срещания на дума в един ред.]*
-Добавете команда `n`, която приема един аргумент - низ беш шпации.
-Използвайки `wordOccurrences` изкарва броя срещания на дадена дума в целия текст.
+Добавете команда `[n]`, която приема един аргумент - низ беш шпации.
+Използвайки `[wordOccurrences]` изкарва броя срещания на дадена дума в целия текст.
-**Пример:**
-*Смесен вход/изход*
+=[Пример:]=
+*[Смесен вход/изход]*
```terminal
DAY HAD DAWNED COLD AND GRAY WHEN
@@ -365,17 +357,16 @@ DAY HAD DAWNED COLD AND GRAY WHEN
the man turned aside from the main Yukon trail. He climbed the high
earth-bank where a little-traveled trail led east through the pine for-
est. It was a high bank, and he paused to breathe at the top.
-```
### и) команда word substitute
-Имплементирайте функция `substituteWord`, която приема целия текст и две думи (низове без шпации).
+Имплементирайте функция `[substituteWord]`, която приема целия текст и две думи (низове без шпации).
В текстът, всяко срещане на първата дума е заменено с втората дума.
-&:question Какво ще стане с размера на един ред, ако някоя дума/някои думи трябва да се заменят?
+.question Какво ще стане с размера на един ред, ако някоя дума/някои думи трябва да се заменят?
-Добавете команда `s`, която приема две думи - низове без шпации.
-Използвайки функцията `substituteWord` замества всяко срещане на първата дума с втората.
+Добавете команда `[s]`, която приема две думи - низове без шпации.
+Използвайки функцията `[substituteWord]` замества всяко срещане на първата дума с втората.
```terminal
DAY HAD DAWNED COLD AND GRAY WHEN
@@ -403,25 +394,24 @@ DAY HAD DAWNED COLD AND GRAY WHEN
the man turned aside from the main Yukon trail. He climbed the high
earth-bank where a little-traveled trail led east through the pine for-
est. It was a high bank, and he paused to breathe at the top.
-```
### й) команда word delete
-Имплементирайте функция `deleteWord`, която приема целия текст и дума (низ без шпации).
-В текстът, всяко срещане на думата, заедно с *излишните* шпации около нея, са премахнати.
+Имплементирайте функция `[deleteWord]`, която приема целия текст и дума (низ без шпации).
+В текстът, всяко срещане на думата, заедно с *[излишните]* шпации около нея, са премахнати.
Ето в кои случаи шпации са излишни (където "WORD" е подадената дума, която ще изтрием, а "\_" е някаква буква, която не е шпация):
-
-- `WORD _` (WORD е в началото на реда или има знаци преди нея) - шпацията след думата е излишна, трябва да стане `_`.
- Отбелязвам, че шпациите в ляво се запазват: ` WORD _` става ` _`.
-- `_ WORD` (WORD е в края на реда или има знаци след нея) - шпацията преди думата е излишна, трябва да стане `_`.
-- `_ WORD _` - шпацията, която следва думата, е излишна, тоест трябва да стане `_ _`.
- Трябва да отбележа, че шпациите в ляво се запазват така както са: `_ WORD _` става `_ _`.
+.bulleted
+- `[WORD _]` (WORD е в началото на реда или има знаци преди нея) - шпацията след думата е излишна, трябва да стане `[_]`.
+ Отбелязвам, че шпациите в ляво се запазват: `[ WORD _]` става `[ _]`.
+- `[_ WORD]` (WORD е в края на реда или има знаци след нея) - шпацията преди думата е излишна, трябва да стане `[_]`.
+- `[_ WORD _]` - шпацията, която следва думата, е излишна, тоест трябва да стане `[_ _]`.
+ Трябва да отбележа, че шпациите в ляво се запазват така както са: `[_ WORD _]` става `[_ _]`.
Във всичките случаи, като имам предвид "шпацията е излишна", означава че тази шпация, заедно с всички съседни.
-Тоест, `WORD _` трябва да стане `_`, а не ` _`.
+Тоест, `[WORD _]` трябва да стане `[_]`, а не `[ _]`.
-Добавете команда `d`, която приема един параметър - дума, низ без шпации.
-Използвайки функцията `deleteWord` премахва самата дума и излишните шпации.
+Добавете команда `[d]`, която приема един параметър - дума, низ без шпации.
+Използвайки функцията `[deleteWord]` премахва самата дума и излишните шпации.
```terminal
DAY HAD DAWNED COLD AND GRAY WHEN
@@ -434,4 +424,3 @@ DAY HAD DAWNED COLD AND GRAY WHEN
man turned aside from main Yukon trail. He climbed high
earth-bank where a little-traveled trail led east through pine for-
est. It was a high bank, and he paused to brea at top.
-```
diff --git a/src/teaching/upp-2023/index.du b/src/teaching/upp-2023/index.du
new file mode 100644
index 0000000..3dc2808
--- /dev/null
+++ b/src/teaching/upp-2023/index.du
@@ -0,0 +1,37 @@
+# Увод в програмирането - практикум, Компютърни науки, 8 група
+
+Материали на проведените през 2023/2024 практикуми по Увод в програмирането на Компютърни науки (2 поток), 8 група.
+
+.warn
+От сега нататък ще може да продължите да предавате решения след крайния срок в classroom.
+Не мога да гарантирам кога ще погледна предадени решения след срока, но ще ги погледна!
+
+=[Зала:]= ФМИ 309 ||
+=[Време:]= 10:15 - 12:00 ||
+=[Ден:]= Петък
+\n
+=[Директни връзки:]=
+[url ./week1/welcome.html?a#section-4 Контакт с мен] |
+[url https://github.com/Syndamia/upp-2023-solutions Решения на задачи] |
+[url https://github.com/ivanahristova/introduction-to-programming-2023-2024 Материали от семинари] |
+[url https://learn.fmi.uni-sofia.bg/course/view.php?id=9567 Курс в мудъл]
+
+:table
+|=&#8470;=||=Дата=||=Материали=|
+
+|:1 :||:06.10.2023:||:[url ./week1/welcome.html Добре дошли] \|\| [url ./week1/setup.html?a Конфигуриране на GitHub classroom и Visual Studio] \|\| [url ./week1/?a Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week01 Решения]:|
+|:2 :||:13.10.2023:||:[url ./week2/revision.html?a Преговор] \|\| [url ./week2 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week02 Решения]:|
+|:3 :||:20.10.2023:||:[url ./week3/revision.html?a Преговор] \|\| [url ./week3 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week03 Решения]:|
+|:4 :||:27.10.2023:||:[url ./week4/revision.html?a Преговор] \|\| [url ./week4 Задачи] \|\| [url https://classroom.github.com/a/jqKaO1ny GitHub classroom] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week04 Решения (само 1ва)]:|
+|:5 :||:03.11.2023:||:[url ./week5/revision.html Преговор] \|\| [url ./week5 Задачи] \|\| [url https://classroom.github.com/a/3KoIQ71H GitHub classroom] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week05 Решения]:|
+|: :||:04.11.2023:||:[url ./additional1/ Допълнително упражнение 1] \|\| [url https://classroom.github.com/a/nlFuKALw GitHub classroom] \|\| [url https://github.com/Syndamia/upp-2023-solutions/blob/main/additional1/exercise.cpp Решение]:|
+|:6 :||:10.11.2023:||:[url ./week6 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week06 Решения] \|\| [url https://classroom.github.com/a/BBLlWMOy GitHub classroom]:|
+|:7 :||:17.11.2023:||:[url ./week7 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week07 Решения] \|\| [url https://classroom.github.com/a/m5M2_CWD GitHub classroom]:|
+|:8 :||:24.11.2023:||:[url ./week8 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week08 Решения] \|\| [url https://classroom.github.com/a/Big7FRUG GitHub classroom]:|
+|:9 :||:01.12.2023:||:[url ./week9 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week09 Решения] \|\| [url https://classroom.github.com/a/lGXxCRZO GitHub classroom]:|
+|: :||:04.12.2023:||:[url ./additional2/ Допълнително упражнение 2] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/additional2 Решения] \|\| [url https://classroom.github.com/a/CrerXpf6 GitHub classroom]:|
+|:10:||:15.12.2023:||:[url ./week10 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week10 Решения] \|\| [url https://classroom.github.com/a/EJcTQRz4 GitHub classroom]:|
+|:11:||:22.12.2023:||:[url ./week11 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week11 Решения] \|\| [url https://classroom.github.com/a/cZRnZj9y GitHub classroom]:|
+|:12:||:05.01.2024:||:[url ./week12 Задачи] \|\| [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week12 Решения] \|\| [url https://classroom.github.com/a/KEDSxDjl GitHub classroom]:|
+|:13:||:12.01.2024:||:[url ./week13 Задачи] \|\| [url https://classroom.github.com/a/bgiFD6SB GitHub classroom]:|
+|:14:||:19.01.2024:||:[url ./week14 Задачи] \|\| [url https://classroom.github.com/a/B08TtnnW GitHub classroom]:|
diff --git a/src/teaching/upp-2023/index.md b/src/teaching/upp-2023/index.md
deleted file mode 100644
index 624a312..0000000
--- a/src/teaching/upp-2023/index.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# Увод в програмирането - практикум, Компютърни науки, 8 група
-
-Материали на проведените през 2023/2024 практикуми по Увод в програмирането на Компютърни науки (2 поток), 8 група.
-
-&:warn От сега нататък ще може да продължите да предавате решения след крайния срок в classroom.
- Не мога да гарантирам кога ще погледна предадени решения след срока, но ще ги погледна!
-
-**Зала:** ФМИ 309 ||
-**Време:** 10:15 - 12:00 ||
-**Ден:** Петък
-<br>
-**Директни връзки:**
-[Контакт с мен](./week1/welcome.html?a#section-4) |
-[Решения на задачи](https://github.com/Syndamia/upp-2023-solutions) |
-[Материали от семинари](https://github.com/ivanahristova/introduction-to-programming-2023-2024) |
-[Курс в мудъл](https://learn.fmi.uni-sofia.bg/course/view.php?id=9567)
-
-|&#8470;|Дата|Материали|
-|-------|----|---------|
-|1 |06.10.2023|[Добре дошли](./week1/welcome.html) \|\| [Конфигуриране на GitHub classroom и Visual Studio](./week1/setup.html?a) \|\| [Задачи](./week1/?a) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week01)|
-|2 |13.10.2023|[Преговор](./week2/revision.html?a) \|\| [Задачи](./week2) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week02)|
-|3 |20.10.2023|[Преговор](./week3/revision.html?a) \|\| [Задачи](./week3) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week03)|
-|4 |27.10.2023|[Преговор](./week4/revision.html?a) \|\| [Задачи](./week4) \|\| [GitHub classroom](https://classroom.github.com/a/jqKaO1ny) \|\| [Решения (само 1ва)](https://github.com/Syndamia/upp-2023-solutions/tree/main/week04)|
-|5 |03.11.2023|[Преговор](./week5/revision.html) \|\| [Задачи](./week5) \|\| [GitHub classroom](https://classroom.github.com/a/3KoIQ71H) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week05)|
-||04.11.2023|[Допълнително упражнение 1](./additional1/) \|\| [GitHub classroom](https://classroom.github.com/a/nlFuKALw) \|\| [Решение](https://github.com/Syndamia/upp-2023-solutions/blob/main/additional1/exercise.cpp)|
-|6 |10.11.2023|[Задачи](./week6) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week06) \|\| [GitHub classroom](https://classroom.github.com/a/BBLlWMOy)|
-|7 |17.11.2023|[Задачи](./week7) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week07) \|\| [GitHub classroom](https://classroom.github.com/a/m5M2_CWD)|
-|8 |24.11.2023|[Задачи](./week8) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week08) \|\| [GitHub classroom](https://classroom.github.com/a/Big7FRUG)|
-|9 |01.12.2023|[Задачи](./week9) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week09) \|\| [GitHub classroom](https://classroom.github.com/a/lGXxCRZO)|
-| |04.12.2023|[Допълнително упражнение 2](./additional2/) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/additional2) \|\| [GitHub classroom](https://classroom.github.com/a/CrerXpf6)|
-|10|15.12.2023|[Задачи](./week10) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week10) \|\| [GitHub classroom](https://classroom.github.com/a/EJcTQRz4)|
-|11|22.12.2023|[Задачи](./week11) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week11) \|\| [GitHub classroom](https://classroom.github.com/a/cZRnZj9y)|
-|12|05.01.2024|[Задачи](./week12) \|\| [Решения](https://github.com/Syndamia/upp-2023-solutions/tree/main/week12) \|\| [GitHub classroom](https://classroom.github.com/a/KEDSxDjl)|
-|13|12.01.2024|[Задачи](./week13) \|\| [GitHub classroom](https://classroom.github.com/a/bgiFD6SB)|
-|14|19.01.2024|[Задачи](./week14) \|\| [GitHub classroom](https://classroom.github.com/a/B08TtnnW)|
diff --git a/src/teaching/upp-2023/week1/index.md b/src/teaching/upp-2023/week1/index.du
index 314a8ab..2bdf99d 100644
--- a/src/teaching/upp-2023/week1/index.md
+++ b/src/teaching/upp-2023/week1/index.du
@@ -1,14 +1,16 @@
# Задачи - УПП, Седмица 1, 06.10.2023
-GitHub classroom: [classroom.github.com/a/W7hZDMgC](https://classroom.github.com/a/W7hZDMgC)
+\n
-Решения: [GitHub](https://github.com/Syndamia/upp-2023-solutions/tree/main/week01)
+GitHub classroom: [url https://classroom.github.com/a/W7hZDMgC classroom.github.com/a/W7hZDMgC]
+
+Решения: [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week01 GitHub]
### 1 задача - Hello, World!
Още от "древни" времена програмистите са си измисляли малки програмки, с които да тестват дали всичко работи.
-Традиция в модерното време е да изкараш на екрана съобщението ["Hello, World!"](https://en.wikipedia.org/wiki/%22Hello,_World!%22_program#History).
-Това е главно популяризирано от книгата [The C Programming Language](https://en.wikipedia.org/wiki/The_C_Programming_Language), централния материал върху езика С (един от най-значимите езици за програмиране някога).
+Традиция в модерното време е да изкараш на екрана съобщението [url https://en.wikipedia.org/wiki/%22Hello,_World!%22_program#History "Hello, World!"].
+Това е главно популяризирано от книгата [url https://en.wikipedia.org/wiki/The_C_Programming_Language The C Programming Language], централния материал върху езика С (един от най-значимите езици за програмиране някога).
Изкарайте на екрана съобщението "Hello, World!".
@@ -16,14 +18,14 @@ GitHub classroom: [classroom.github.com/a/W7hZDMgC](https://classroom.github.com
Във входа получавате цифра, трябва да върнете нейната числена стойност, умножена по две.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|2 |4 |
-|8 |16 |
+.table
+|=Вход=||=Изход=|
+|:2 :||:4 :|
+|:8 :||:16 :|
-**Упътване:**
+=[Упътване:]=
Цифрата е просто знак, и за да извършите коректно умножението трябва да превърнете знака в число.
### 3 задача - От Фаренхайт в Целзий
@@ -34,11 +36,10 @@ GitHub classroom: [classroom.github.com/a/W7hZDMgC](https://classroom.github.com
```
C = (F - 32) * 5/9
-```
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|32 |0 |
-|107 |41 |
+.table
+|=Вход=||=Изход=|
+|:32 :||:0 :|
+|:107 :||:41 :|
diff --git a/src/teaching/upp-2023/week1/setup.md b/src/teaching/upp-2023/week1/setup.du
index 9327b2b..9865737 100644
--- a/src/teaching/upp-2023/week1/setup.md
+++ b/src/teaching/upp-2023/week1/setup.du
@@ -1,455 +1,444 @@
# Конфигуриране на GitHub classroom и Visual Studio - УПП, Седмица 1, 06.10.2023
-&.presentation
+\n
-&[title
+[$presentation-controller]
-# Конфигуриране на GitHub classroom и Visual Studiо
-
-&]
+:title_slide
+# Конфигуриране на GitHub classroom и Visual Studiо
-&[slide
+:slide
## Теория относно GitHub classroom
+.p
Ще използваме активно GitHub classroom за упражненията.
Едва ли знаете какво е, затова ще трябва да поясня някои неща.
### Проблемът със синхронизиране на работа
+.unordered
- Системи като Dropbox, Google Drive, etc. ти позволяват да качиш файл в сървър и след това да го споделиш
-
- Върху една програма ще работят много хора, затова се налага всички разработчици да споделят своят код
-
- Различни хора могат да правят различни промени в едно и също място
-
- Обединението на труда на всички, особено в огромни екипи, става супер трудно
-&]
-
-
-&[slide
+:slide
### Git
-&.br1
+[$br1]
-git е програма (система) за [контрол на версиите](https://en.wikipedia.org/wiki/Distributed_version_control).
-В един проект, git пази **списък от всички commit-и**.
-Един commit в себе си **съдържа какви са точно промените**, кой ги е направил, кога са направени, защо са направени и так. нат.
-Този списък, заедно с още неща за които не е нужно да мислите, се нарича **repository**.
+.p
+git е програма (система) за [url https://en.wikipedia.org/wiki/Distributed_version_control контрол на версиите].
+В един проект, git пази =[списък от всички commit-и]=.
+Един commit в себе си =[съдържа какви са точно промените]=, кой ги е направил, кога са направени, защо са направени и так. нат.
+Този списък, заедно с още неща за които не е нужно да мислите, се нарича =[repository]=.
-Обаче, **commit-ове не се правят автоматично**, не е като историята с промени в един Word файл.
-**Commit се прави от разработчика**, и то за предпочитане на всеки няколко (свързани) промени.
+.p
+Обаче, =[commit-ове не се правят автоматично]=, не е като историята с промени в един Word файл.
+=[Commit се прави от разработчика]=, и то за предпочитане на всеки няколко (свързани) промени.
-Така, когато смесваме кода от многото разработчици, ще можем да засечем **какви точно са различията** между работата на двама човека.
+.p
+Така, когато смесваме кода от многото разработчици, ще можем да засечем =[какви точно са различията]= между работата на двама човека.\n
Често промените не си "противоречат" и могат да бъдат смесени директно, понякога се налага ръчно да решим какво точно да се случи с тези парчета код.
-&]
-
-
-&[slide
+:slide
### GitHub
-&.br5
+[$br5]
+.p
Всички repository-та трябва да се пазят някъде и да може лесно да се споделят и гледат.
-Има много сайтове за тази цел, най-популярния се нарича [GitHub](https://github.com).
+Има много сайтове за тази цел, най-популярния се нарича [url https://github.com GitHub].
+.p
Напомням, че git и GitHub са напълно отделни неща, направени от различни хора с различни функционалности.
Свързаността с имената е както свързаността между думите "чар" и "чаршаф".
-&]
-
-
-&[slide
+:slide
## Сега всички трябва да си направят GitHub акаунти
-Отивате на [github.com/signup](https://github.com/signup), въвеждате си данните една по една и се регистрирате
-
-![](./img/github-signup.gif)
-
-&]
+.p
+Отивате на [url https://github.com/signup github.com/signup], въвеждате си данните една по една и се регистрирате
+.p [image ./img/github-signup.gif]
-&[middle
+:middle_slide
+.p
След това, като влезете в акаунтите си (което става автоматично след регистрация), на заглавната страница ще имате нещо такова:
-&(width75% ![](./img/github-index.gif) &)
+.width75% [image ./img/github-index.gif]
+.p
В горния десен ъгъл, където е иконката с квадрати на бял фон, след натискане получавате sidebar.
От него, може да достъпите профила си, repository-та които имате, и так. нат.
-&]
-
-
-&[slide
+:slide
### Проверете дали сте маркирани!
+.p
Понякога при създаване на нов акаунт, GitHub го маркира (като "проблемен").
В такава ситуация, няма да можете сами да го изтриете и няма да можете да го ползвате за GitHub classroom.
-Най-простия начин, който намерих, е да отворите
-[support.github.com/contact/reinstatement](https://support.github.com/contact/reinstatement)
+.p
+Най-простия начин, който намерих, е да отворите
+[url https://support.github.com/contact/reinstatement support.github.com/contact/reinstatement]\n
Ако отгоре пише "Your account has been flagged", тогава имаме проблем.
-![](./img/github-support-flagged.gif)
-
-&]
-
+.p
+[image ./img/github-support-flagged.gif]
-&[slide
+:slide
## GitHub classroom
-&.br3
+[$br3]
+.p
За всеки практикум ще ви направя линк, чрез който след малко кликане ще се създаде ново лично repository за всеки от вас.
-До 12:20 трябва да сте качили работата си **по време** на упражнението в това repository.
+.p
+До 12:20 трябва да сте качили работата си =[по време]= на упражнението в това repository.
GitHub предоставя лесни начини да правите промени по файлове директно чрез браузъра, така че за незаинтересуваните, може да го ползвате като усложнен Google Drive.
+.p
След това аз ще направя отзиви върху вашата работа.
Те ще се намират в таба "Pull Requests" на конкретното repository.
Четете ги, отговаряйте, целта е да дискутираме какво сте направили.
-&]
-
-
-&[slide
+:slide
### Как ползваме GitHub classroom
-За всяко упражнение ще има отделен линк.
-Този за днеска е: [classroom.github.com/a/W7hZDMgC](https://classroom.github.com/a/W7hZDMgC)
-
-&.br1
+.p
+За всяко упражнение ще има отделен линк.\n
+Този за днеска е: [url https://classroom.github.com/a/W7hZDMgC classroom.github.com/a/W7hZDMgC]
-&{row
+[$br1]
-След като го отворите, ще видите съобщение за разрешение, авторизирайте го.
+:row
+.p След като го отворите, ще видите съобщение за разрешение, авторизирайте го.
-![](./img/github-classroom-authorize.gif)
+.p [image ./img/github-classroom-authorize.gif]
-&}
-&]
+:middle_slide
-&[middle
+:row
-&{row
+.width60% [image ./img/join-the-classroom.gif]
-&(width60% ![](./img/join-the-classroom.gif) &)
+:column
-&{column
+.p При първо влизане ще получите страница с имената и факултетните имена на всички студенти от групата.
-При първо влизане ще получите страница с имената и факултетните имена на всички студенти от групата.
+.p Изберете своето.
-Изберете своето.
+.p Това се прави само веднъж, и след това никога пак.
-Това се прави само веднъж, и след това никога пак.
-&}
-&}
-&]
+:slide
+.p След това, би трябвало да видите страницата за "Приемане на заданието".
-&[slide
+.width40% [image ./img/accept-assignment.gif]
-След това, би трябвало да видите страницата за "Приемане на заданието".
-
-&(width40% ![](./img/accept-assignment.gif) &)
-
-След като го приемете, на новата страница, изчакайте няколко секунди и презаредете.
+.p След като го приемете, на новата страница, изчакайте няколко секунди и презаредете.
Трябва да видите това:
-&(width40% ![](./img/ready-to-go.gif) &)
-
-&]
+.width40% [image ./img/ready-to-go.gif]
+:middle_slide
-&[middle
+.p Сега сте готови, кликнете върху синия линк и ще стигнете във вашето GitHub repository.
-Сега сте готови, кликнете върху синия линк и ще стигнете във вашето GitHub repository.
-
-Вътре в това конкретно repository очаквам да качвате работата ви през упражнението.
+.p Вътре в това конкретно repository очаквам да качвате работата ви през упражнението.
Повтарям, дори да е недовършено, дори да има някакви празни файлове и такива, трябва да го качите.
-Който иска спокойно може да прави няколко commit-и, да им прави съобщения и так. нат., ама към този етап, това не е нужно.
-
-В края на презентация показвам как точно е най-лесно да качите работата си.
-
-&]
+.p Който иска спокойно може да прави няколко commit-и, да им прави съобщения и так. нат., ама към този етап, това не е нужно.
+.p В края на презентация показвам как точно е най-лесно да качите работата си.
-&[slide
+:slide
+.p
В таба "Pull requests", още от началото, ще имате едно "Feedback".
В него ще ви връщам отзиви относно работата ви, и вие също можете да пишете неща и да ми отговаряте.
+.p
Целта е да видя какво правите и да ви помогна, моля проверявайте какво съм ви писал, по подразбиране би трябвало да получавате известия на имейл-а.
-&(centered &(width80% ![](./img/feedback.gif) &) &)
+.centered
+.width80% [image ./img/feedback.gif]
-&]
-
-
-&[slide
+:slide
## Къде пишем код?
-&.br2
+[$br2]
-**Кодът е чисто и просто текст**, компилаторът е специалната програма, която превръща този текст в нещо, което може компютъра да изпълни.
+.p
+=[Кодът е чисто и просто текст]=, компилаторът е специалната програма, която превръща този текст в нещо, което може компютъра да изпълни.
-За писане и редактиране на текст ползваме **текстови редактори**.
+.p
+За писане и редактиране на текст ползваме =[текстови редактори]=.
Програмистите са искали да улеснят работата си, затова модерните текстови редактори поддържат много помощни функционалности: показване на грешки на точния ред, автоматично форматиране, ...
-За някои и това не е било достатъчно удобно, затова са създадени **Integrated Development Environment** (IDE), програми които съдържат в себе си всичко нужно за разработка на код.
+.p
+За някои и това не е било достатъчно удобно, затова са създадени =[Integrated Development Environment]= (IDE), програми които съдържат в себе си всичко нужно за разработка на код.
Тоест, те са текстови редактори, но "вградено" могат да компилират код, да менижират сегашното repository, ...
-&]
-
-
-&[middle
+:middle_slide
+.p
Главно очакваме да пишете на IDE-то наречено Visual Studio.
Разработено е от Microsoft и е едно от най-използваните и развитите IDE-та на пазара.
+.p
Разбира се, може да ползвате и текстови редактори като Visual Studio Code, vim, emacs, ...
-
+.bulleted
- Главния проблем с тях е, че ще се налага повече конфигурация, но пък ще са по-леки и по-флексибилни
- Главния плюс е, че те са налични за операционни системи извън Microsoft Windows, за разлика от Visual Studio
+.p
Ивана ви говори за Visual Studio Code, аз ще ви говоря за Visual Studio.
+.p
Извън това, по лично желание, с мен може да говорите за vim, а за neovim може би ще мога да ви насоча към някой с опит.
-&]
-
-
-&[slide
+:slide
### Инсталация
-&.br1
+[$br1]
+.p
Намираме се в компютърна зала, така че всички предоставени компютри би трябвало вече да са налични на предоставените компютри.
За ваши лични машини, ще минем набързо през информацията тук.
-За Visual Studio Code, отивате на [code.visualstudio.com/Download](https://code.visualstudio.com/Download), избирате своята операционна система (за Уиндоус, ако не сте сигурни, изберете "System Installer x64") и инсталирате.
+.p
+За Visual Studio Code, отивате на [url https://code.visualstudio.com/Download code.visualstudio.com/Download], избирате своята операционна система (за Уиндоус, ако не сте сигурни, изберете "System Installer x64") и инсталирате.
-За Visual Studio, отивате на [visualstudio.microsoft.com](https://visualstudio.microsoft.com/), скролвате малко надолу, избирате "Download Visual Studio" и след това "Community 2022".
+.p
+За Visual Studio, отивате на [url https://visualstudio.microsoft.com/ visualstudio.microsoft.com], скролвате малко надолу, избирате "Download Visual Studio" и след това "Community 2022".
+.bulleted
+'footnote vs-2022-old-win Може би има трикове с които да инсталирате 2022 версията, но те не са официални и затова няма да го преподам
+- Ако искате да ползвате по-стара ОС, като Windows 8.1 или Windows 7 ще трябва да използвате "Community 2019"[$vs-2022-old-win], разликата между версиите не е съществена, затова не се притеснявайте.
-- Ако искате да ползвате по-стара ОС, като Windows 8.1 или Windows 7 ще трябва да използвате "Community 2019"[^vs-2022-old-win], разликата между версиите не е съществена, затова не се притеснявайте.
-&]
-
-
-
-&[slide
+:slide
+.p
След като изтеглите инсталатора за Visual Studio и след като изчакате да заредят работи, би трябвало да имате прозорец на име "Installing - Visual Studio Community 2022".
+.p
Единствено избирате "Desktop development with C++" в таба Worloads, и натискате "Install".
Би трябвало да заема към 11 GB памет и в моето тестване се инсталира за 10тина минути.
-&(centered &(width80% ![](./img/vs-install.gif) &) &)
-
-&]
+.centered
+.width80% [image ./img/vs-install.gif]
+:slide
-&[slide
-
+.p
Когато е готово, би трябвало да се включи автоматично и да имате прозорец с име "Sign in to Visual Studio".
За сега това не е нужно, спокойно изберете "Not now, maybe later."
+.p
След това, на "Start with a familiar environment", отново, не е нужно да променяте нищо, просто натиснете "Start Visual Studio".
-&(centered &(width75% &{row
+:centered
+:width75%
+:row
-![](./img/vs-signin.gif)
+.p [image ./img/vs-signin.gif]
-![](./img/vs-start-env.gif)
+.p [image ./img/vs-start-env.gif]
-&} &) &)
-&]
-&[slide
+:slide
### Как да създадем проект с Visual Studio
+.p
Това е първия прозорец, който се отваря.
В лявата колона имате скорошни проекти, в дясната имате начини да създадете нов проект.
-&(centered &(width80% ![](./img/vs-open-recent.gif) &) &)
+:centered
+:width80% [image ./img/vs-open-recent.gif]
-&]
-&[slide
+:slide
+.p
Нека да направим нов проект, кликнете "Create a new project".
В този прозорец избирате началната "конфигурация" на проекта.
В този курс ще работим само и единствено с "Console App", затова изберете него и кликнете "Next".
-&(centered &(width75% ![](./img/vs-create-project.gif) &) &)
+:centered
+:width75% [image ./img/vs-create-project.gif]
-&]
-&[slide
+:slide
+.p
Последния прозорец преди писането на код е за конфигурация на проекта.
Тук единствено може да искате да промените Project Name и Location, другото не е важно.
-&(centered &(width80% ![](./img/vs-configure-project.gif) &) &)
+:centered
+:width80% [image ./img/vs-configure-project.gif]
-&]
-&[slide
+:slide
#### Бърза вметка, какво и защо конзолата?
+.p
През 19ти век са изобретени teleprinters: пишещи машини с възможности да печат текст от електрически сигнал.
Използвали са се в телеграфията: пишеш като на пишеща машина съобщението и отговора се напечатва на същия лист хартия.
В ранните години на компютрите, точно тези teleprinters са били използвани, все пак са били съществуваща технология, която "изпраща" текст като ел. сигнали и може да принтира ел. сигнали като текст.
+.p
Имало е неудобства, използвало се е много хартия, и механиката на бутоните е била сложна.
С времето компаниите са разработвали такива устройства, който обаче ползват електронно-лъчева тръба и "нормални" бутони за клавиши.
+.p
Чисто практически, ние това знаем като конзолата: устройство (или в модерно време, програма) което може да получи входен текст и да изкара текст.
-&]
-
-
-&[slide
+:slide
### Как да компилираме с Visual Studio
+.p
След малко чакане, най-после ще се намираме в средата за писане на код.
-&(centered &(width60% ![](./img/vs-general.gif) &) &)
+:centered
+:width60%
+.p [image ./img/vs-general.gif]
-В Solution Explorer имате всички файлове от проекта (Visual Studio позволява да групирате няколко проекта в едно, наречено Solution, не е нужно да се занимавате).
-Тук **единственото важно за вас се намира в папката "Source Files"**.
-В нея ще се намира вашия код, всичко останало са допълнителни неща, които са релевантни за по-големи проекти.
-&]
+.p
+В Solution Explorer имате всички файлове от проекта (Visual Studio позволява да групирате няколко проекта в едно, наречено Solution, не е нужно да се занимавате).
+.p
+Тук =[единственото важно за вас се намира в папката "Source Files"]=.
+В нея ще се намира вашия код, всичко останало са допълнителни неща, които са релевантни за по-големи проекти.
-&[slide
+:slide
-&{row
+:row
+.p
Компилирането на код става от менюто "Debug" най-отгоре, и след това избиране на "Start Without Debugging".
-&(width50% &(fright ![](./img/vs-debug-menu.gif) &) &)
+:width50%
+:fright
+.p [image ./img/vs-debug-menu.gif]
-&}
-След малко чакане, би трябвало да излезе един прозорец, който изглежда горе-долу така:
-![](./img/vs-console.gif)
-&]
+.p
+След малко чакане, би трябвало да излезе един прозорец, който изглежда горе-долу така:
+.p [image ./img/vs-console.gif]
-&[slide
+:slide
### Как да дебъгваме с Visual Studio
-&.br1
+[$br1]
+.p
Bug е когато нещо непланирано се случи в кода.
Debuging е глаголът за откриване на причината за един bug.
Visual Studio предоставя много функционалности, които да ускорят debugging.
+.p
Нека да въведем една грешка, в реда на който изкараме "Hello, World!", нека да махнем последната ";".
+.p
При компилиране, ще получим съобщение за грешки по време на компилирането.
-![](./img/vs-build-errors.gif)
-
-&]
+.p [image ./img/vs-build-errors.gif]
+:slide
-&[slide
-
+.p
Нека да натиснем "No" и да погледнем Visual Studio.
+.p
Грешките, или поне където то си мисли че са, ще бъдат подчертани с червена зигзагообразна линия.
Ако сложим мишката върху тях, ще получим popup, в който ще пише каква е грешката на това място.
Грешки също се виждат в така наречения "Error List", който се намира директно под кода.
Той се появява когато при компилиране получим грешки и изчезва когато няма.
-&(centered &(width70% ![](./img/vs-errors.gif) &) &)
+:centered
+:width70% [image ./img/vs-errors.gif]
-&]
-&[slide
+:slide
### Качване на решенията
+.p
След като сте решили една задача, имате два варианта за писане на следващата: или да създадете нов проект, или да презапишете кода.
Второто е най-лесно.
+.p
Във всеки случай, ще се наложи сегашния файл с код да го качите.
Най-елементарния начин: копирате всичко, след това отивате на вашето GitHub repository, кликвате "Add", после "Create new file".
-Отгоре на "Name your file..." пишете някакво име, което **моля да завърша на `.cpp`!**
+.p
+Отгоре на "Name your file..." пишете някакво име, което =[моля да завърша на `[.cpp]`!]=
Това показва, че файла съдържа код на C++.
-Също, когато решавате много задачи и създавате много такива файлове, **напомням че имената на файловете трябва да са различни.**
+Също, когато решавате много задачи и създавате много такива файлове, =[напомням че имената на файловете трябва да са различни.]=
+.p
В "Enter file contents here" пействате копирания код.
Горе в дясно натискате "Commit changes...", в pop-up-a после пак натискате "Commit changes" (ако искате, променяйте "Commit message" и "Extended description", но не е нужно) и сте готови с този файл/задача.
-&]
-
-
-
-&[middle
-
-## Вече имате достатъчно информация да пишете код сами, [време е за задачи](./)
-
-&]
+:middle_slide
-[^vs-2022-old-win]: Може би има трикове с които да инсталирате 2022 версията, но те не са официални и затова няма да го преподам
+## Вече имате достатъчно информация да пишете код сами, [url ./ време е за задачи]
diff --git a/src/teaching/upp-2023/week1/welcome.md b/src/teaching/upp-2023/week1/welcome.du
index a1cb6a0..e1690a2 100644
--- a/src/teaching/upp-2023/week1/welcome.md
+++ b/src/teaching/upp-2023/week1/welcome.du
@@ -1,370 +1,352 @@
# Добре дошли - УПП, Седмица 1, 06.10.2023
-&.presentation
+\n
-&[title35
+[$presentation-controller]
-# Добре дошли
+:title_slide35
-&(width65%
-[![](https://upload.wikimedia.org/wikipedia/commons/3/3c/Chimpanzee_seated_at_typewriter.jpg)](https://en.wikipedia.org/wiki/Infinite_monkey_theorem)
-&)
+# Добре дошли
-&]
+:width65%
+[image_url https://upload.wikimedia.org/wikipedia/commons/3/3c/Chimpanzee_seated_at_typewriter.jpg https://en.wikipedia.org/wiki/Infinite_monkey_theorem]
-&[slide
+:slide
## Кой съм аз
-&.br2
+[$br2]
-&(font35
+:font35
-Казвам се Камен (моля не ми говорете на Вие), в момента съм третокурсник в КН2.
+Казвам се Камен (моля не ми говорете на Вие), в момента съм третокурсник в КН2.\n
-&.br1
+[$br1]
-Ще водя практикуми - давам ви задачи, вие ги решавате и на живо оправяме проблеми.
+Ще водя практикуми - давам ви задачи, вие ги решавате и на живо оправяме проблеми.\n
-&.br1
+[$br1]
Също ще проверявам част от домашните и контролните през семестъра.
-&)
-
-&]
-
-&[slide
+:slide
## Кои сте вие
Айде сега, ред по ред:
-&.br3
-
-&(font35
+[$br3]
+:font35
+:bulleted
- Име
+ .bulleted
- Едва ли ще го запомня сега, не ми се сърдете :)
+
- Коя операционна система ползвате
- Писали ли сте код преди? Ако да:
+ .bulleted
- на кои езици?
- в какво IDE/текстов редактор?
- как сте се научили (чрез интернет, курсове, ...)? Ходили ли сте на курсове? Къде?
-&)
-
-&]
-&[slide
+:slide
## Чисто организационно
-&.br3
+[$br3]
+
+:centered35
+Задачи, презентации, ...\n
+[url /teaching/upp-2023 syndamia.com/teaching/upp-2023]
-&(centered35
-Задачи, презентации, ...
-[syndamia.com/teaching/upp-2023](/teaching/upp-2023)
-&)
-&.br3
+[$br3]
+:unordered
- Не сме в училище, ако трябва да излезете за разговор или до тоалетна, просто си излезте (за предпочитане по-тихичко).
- Ако ви се наложи да пропуснете някой практикум, пропускайте.
+ .bulleted
- Само ако решите за постоянно да ходите при някой друг, кажете за да се организираме екипа.
- Оценяване: ще разберете на първата лекция
-&]
-
-&[slide
+:slide
## Как можете да се свържете
+:unordered
- Facebook messenger: <img class="file-type-icon" src="/files/ephemeral/facebook.png">
- Discord: <img class="file-type-icon" src="/files/ephemeral/discord.png">
- Имейл:
+ .bulleted
- <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#107;&#97;&#109;&#101;&#110;&#46;&#100;&#46;&#109;&#108;&#97;&#100;&#101;&#110;&#111;&#118;&#64;&#112;&#114;&#111;&#116;&#111;&#110;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">&#107;&#97;&#109;&#101;&#110;&#46;&#100;&#46;&#109;&#108;&#97;&#100;&#101;&#110;&#111;&#118;&#64;&#112;&#114;&#111;&#116;&#111;&#110;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;</a> <a class="borderless" href="/files/publickey-&#107;&#97;&#109;&#101;&#110;&#46;&#100;&#46;&#109;&#108;&#97;&#100;&#101;&#110;&#111;&#118;&#64;&#112;&#114;&#111;&#116;&#111;&#110;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;-62ca52e87475c874b9e6ebf3c4c9f716b6ce4c9d.asc"><img class="borderless unzoomable" src="/img/pgpkey.gif" alt="PGP key"></a>
- - <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#107;&#097;&#109;&#101;&#110;&#064;&#115;&#121;&#110;&#100;&#097;&#109;&#105;&#097;&#046;&#099;&#111;&#109;">&#107;&#097;&#109;&#101;&#110;&#064;&#115;&#121;&#110;&#100;&#097;&#109;&#105;&#097;&#046;&#099;&#111;&#109;</a> <a class="borderless" href="/files/publickey-&#107;&#097;&#109;&#101;&#110;&#064;&#115;&#121;&#110;&#100;&#097;&#109;&#105;&#097;&#046;&#099;&#111;&#109;-0x354C5F95.asc"><img class="borderless unzoomable" src="/img/pgpkey.gif" alt="PGP key"></a> **(гледайте си спама!)**
- - [kdmladenov@uni-sofia.bg](mailto:kdmladenov@uni-sofia.bg)
+ - <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#107;&#097;&#109;&#101;&#110;&#064;&#115;&#121;&#110;&#100;&#097;&#109;&#105;&#097;&#046;&#099;&#111;&#109;">&#107;&#097;&#109;&#101;&#110;&#064;&#115;&#121;&#110;&#100;&#097;&#109;&#105;&#097;&#046;&#099;&#111;&#109;</a> <a class="borderless" href="/files/publickey-&#107;&#097;&#109;&#101;&#110;&#064;&#115;&#121;&#110;&#100;&#097;&#109;&#105;&#097;&#046;&#099;&#111;&#109;-0x354C5F95.asc"><img class="borderless unzoomable" src="/img/pgpkey.gif" alt="PGP key"></a> =[(гледайте си спама!)]=
+ - [url mailto:kdmladenov@uni-sofia.bg kdmladenov@uni-sofia.bg]
-Директни линкове към Facebook и Discord има на [профила ми в мудъл](https://learn.fmi.uni-sofia.bg/user/profile.php?id=23229).
-&]
+Директни линкове към Facebook и Discord има на [url https://learn.fmi.uni-sofia.bg/user/profile.php?id=23229 профила ми в мудъл].\n
-&[slide
+:slide
## Как ще протичат практикумите
-- Ще започнем всяко упражнение с 5 минутки преговор, какво ново трябва да приложим
+:unordered
+- Ще започнем всяко упражнение с 5 минутки преговор, какво ново трябва да приложим\n
и ще го завършим с 15-20 минути (ако има желание/смисъл) обяснение на задача
- Ще гледам винаги да има задачи с връзка към реален софтуер.
За любителите, където е възможно, ще добавям външни препратки.
-- Давам ви *много* повече задачи, отколкото очаквам да решите на живо!
+- Давам ви *[много]* повече задачи, отколкото очаквам да решите на живо!\n
Хубаво е да имате с какво още да се упражните след практикума, 2 часа писане на код седмично е малко!
-- Ще качвам решения на задачите, заедно с подробно коментари върху тях, тук: [github.com/Syndamia/upp-2023-solutions](https://github.com/Syndamia/upp-2023-solutions).
+- Ще качвам решения на задачите, заедно с подробно коментари върху тях, тук: [url https://github.com/Syndamia/upp-2023-solutions github.com/Syndamia/upp-2023-solutions].
Това ще се случва в началото на следващия практикум, тоест ще имате една седмица, от деня в който ви давам задачите, през която няма да имате решения.
-&]
-
-&[middle
-
+:middle_slide
+:unordered
- Ще използваме GitHub classroom, където ще трябва да качите работата си през упражнението.
Целта е да видя какво сте правили и да връщам обратна връзка на всеки.
Дори нещо да е недовършено, да не работи, так. нат. качвайте!
-
+ .bulleted
- Това ще играе роля върху оценката ви, но колко ще допринесе зависи изцяло от преценката ми
- Обратна връзка със сигурност ще правя за нещата, предадени по време на практикума.
Окуражавам ви да си решите всички задачи и след упражнението, обаче все пак имам лимитирано време, ако искате можете да се свържете с мен за работата ви по някоя от тях, но не гарантирам кога ще мога да го видя.
-&]
-
-&[slide
+:slide
## Оплаквайте се!
+.bulleted
- За първи път водя практикум (и никога не съм преподавал формално)
- Задачите сам си ги измислям
Ако задачите са трудни, зле направени, ако нещо не обяснявам като хората, изобщо ако нещо не е ок, свържете се с мен, ще го обсъдим.
-&.br3
+[$br3]
## Помагайте си!
+.bulleted
- Аз съм един, вие сте >20
-<br>
+\n
Със сигурност няма да успея да помогна на всеки по всяко време от практикума, не се страхувайте да питате съседите си за помощ.
-&]
-
-
-&[slide
+:slide
## Няколко съвета в позицията ми на третокурсник
-&.br2
+[$br2]
-&(font35
-
-- **НЕ плагиатствайте!**
- **НЕ си качвайте решенията на контролни или домашни онлайн!**
+:font35
+:unordered
+- =[НЕ плагиатствайте!]=
+ =[НЕ си качвайте решенията на контролни или домашни онлайн!]=
Формално плагиатството е незаконно, ако някой Ви направи доклад, възможно е да бъдете изключени.
-- **Следвайте материала, който ви се преподава!**
+- =[Следвайте материала, който ви се преподава!]=
За хората с опит, ще дойде време когато ще искате да приложите лични знания и практики.
Ако не е казано някъде, не го правите и не го обмисляте!
-&) &]
-&[title
+:title_slide
# Въпроси ?
-&]
-
-
-&[title
+:title_slide
# ФМИ в контекста на програмирането
Или защо учим толкова много математика
-&.br2
+[$br2]
-&(font22
-Ще си позволя едно отклонение.
-Искам да обясня как **аз лично** виждам
+:font22
+Ще си позволя едно отклонение.\n
+Искам да обясня как =[аз лично]= виждам\n
математиката в компютърния свят.
-&)
-
-&]
-&[slide
+:slide
## В КН2 има много и трудна математика
-&{row
+:row
-&(width35%
-![](./img/u4-mat-hard.gif)
-&)
+.width35% [image ./img/u4-mat-hard.gif]
-&{column
-
-- Жълто - математически предмет
+:column
+.bulleted
+- Жълто - математически предмет\n
- Червено - проблемни предмети
-<br>
+\n
+.bulleted
- Всички проблемни предмети също са математики
- Към половината предмети са математики
- Почти всички проблемни са наблъскани в 1ви курс
-&}
-&}
-&]
-&[slide
+:slide
## Защо учим толкова много математика?
+.p
Има добра причина, има директни и основни приложения в компютрите, и без тях до никъде нямаше да сме стигнали.
Нека обясня защо:
### Дискретни структури
+.p
Смесица на уводите в няколко предмета:
-&{row
+:row
-&(font35
-![](https://upload.wikimedia.org/wikipedia/commons/9/99/ClaudeShannon_MFO3807.jpg?20190622223728)
-Claude Shannon
-&)
+.font35
+[image https://upload.wikimedia.org/wikipedia/commons/9/99/ClaudeShannon_MFO3807.jpg?20190622223728 Claude Shannon]
-&{column
+:column
-- **Булева алгебра**: как работим с истина/лъжа, с 0/1
+:unordered
+- =[Булева алгебра]=: как работим с истина/лъжа, с 0/1
- - Доказана е [еквивалентност между ел. вериги и булевата алгебра](https://en.wikipedia.org/wiki/A_Symbolic_Analysis_of_Relay_and_Switching_Circuits).
+ .bulleted
+ - Доказана е [url https://en.wikipedia.org/wiki/A_Symbolic_Analysis_of_Relay_and_Switching_Circuits еквивалентност между ел. вериги и булевата алгебра].
- Много типове данни и математически операции могат да се сведат до булева алгебра и работа с памет.
-&}
-&} &]
-&[slide
+:slide
### Дискретни структури (продължение)
-&.br1
+[$br1]
-- **Теория на множествата**: множество е някаква съвкупност от обекти
+:unordered
+- =[Теория на множествата]=: множество е някаква съвкупност от обекти
- - Позволява ни да третираме колекция от математически обекти като математически обект[^importance-of-sets].
+ .bulleted
+ 'footnote importance-of-sets [url https://math.stackexchange.com/a/536172 https://math.stackexchange.com/a/536172]
+ - Позволява ни да третираме колекция от математически обекти като математически обект[$importance-of-sets].
Използва се в основата на много математики; колкото са полезни те, толкова са и множествата.
-&.br2
+[$br2]
-- **Комбинаторика**[^importance-of-combinatorics]: изследва бройки на неща
+'footnote importance-of-combinatorics [url https://math.stackexchange.com/questions/2146051/where-do-combinatorics-play-a-role-in-computer-science https://math.stackexchange.com/questions/2146051/where-do-combinatorics-play-a-role-in-computer-science]
+- =[Комбинаторика]= [$importance-of-combinatorics]: изследва бройки на неща
+ .bulleted
- Често се ползва за анализ и дизайн на алгоритми и структури от данни
- Употребява се при оптимизации и теория на кодирането (компресиране на данни, отстраняване на грешки, криптография)
- Есенциална в теория на графите
-&]
-
-&[slide
+:slide
### Дискретни структури (продължение)
-&.br5
-
-- **Теория на графите**: граф е съвкупност от някакви обекти и връзки между тях.
+[$br5]
+:unordered
+- =[Теория на графите]=: граф е съвкупност от някакви обекти и връзки между тях.
+ .bulleted
- Позволява моделиране на много естествени структури: интернет мрежите, географски карти (места и пътищата между тях), йерархии, биологически мрежи и так. нат.
- - Използва се във важни структури от данни като [heap](https://en.wikipedia.org/wiki/Heap_%28data_structure%29) (и интересната [fibonacci heap](https://www.youtube.com/watch?v=6JxvKfSV9Ns)) и [trie](https://en.wikipedia.org/wiki/Trie)
+ - Използва се във важни структури от данни като [url https://en.wikipedia.org/wiki/Heap_%28data_structure%29 heap] (и интересната [url https://www.youtube.com/watch?v=6JxvKfSV9Ns fibonacci heap]) и [url https://en.wikipedia.org/wiki/Trie trie]
-&]
-
-&[slide
+:slide
### Езици, автомати и изчислимост
-&.br5
+[$br5]
-&{row
+:row
-&(font35
-&(width85% ![](https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Kleene.jpg/421px-Kleene.jpg?20230630215747) &)
-Stephen Kleene
-&)
+:font35
-&{column
+.width85% [image https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Kleene.jpg/421px-Kleene.jpg?20230630215747]
-Това е част от материала в по-общото "theoretical computer science".
-Можем формално да опишем и работим с теоретични компютри и програми.
+.p Stephen Kleene
-- Позволява ни да използваме математика за създаване, обработка и доказване на програми
-&}
+:column
-&}
-&]
+.p
+Това е част от материала в по-общото "theoretical computer science".\n
+Можем формално да опишем и работим с теоретични компютри и програми.
+.bulleted
+- Позволява ни да използваме математика за създаване, обработка и доказване на програми
-&[slide
-&.br1
+:slide
+
+[$br1]
### Алгебра 1
Линейни уравнения и операции върху тях.
+.bulleted
- Линейни уравнения и матрици се срещат сравнително често в софтуер
- Основоположна в компютърната графика
- Много използвана в machine learning
-&.br3
+[$br3]
### Диференциално и интегрално смятане
Разглежда функции и по-общо, непрекъснатата промяна на стойности.
+.bulleted
- Част от компютърната графика (особено обработка на изображения)
- Напреднал machine learning, главно заради употребата на статистиката (която на свой ред се основава на линейната алгебра)
- Анализ на алгоритми
-&]
-
-
-&[slide35
+:slide35
## В по-общ план
Какво не би било възможно без математика в софтуер:
+.bulleted
- компютрите
- компютърната графика (особено 3D)
- интернет
@@ -373,59 +355,54 @@ Stephen Kleene
- самолетни системи и инженерство
- ...
-Математиката е **неразделима** част от софтуера!
+.p
+Математиката е =[неразделима]= част от софтуера!\n
Друг е въпросът дали на вас лично ще ви се налага да я използвате...
-&]
-
-
-&[slide
+:slide
## Какво означава да пишеш софтуер?
+.bulleted
- Инженерите и физиците са създали компютрите, едни специални калкулатори с много памет
- Математиката представя света с абстрактни модели/шаблони
- Компютърната наука свързва теоретичната математика с физичната машина
-<span></span>
+.p
-- Най-великият труд на тази дисциплина е постигнат чрез **синхрон** между тези три предмета
+.bulleted
+- Най-великият труд на тази дисциплина е постигнат чрез =[синхрон]= между тези три предмета
- &(centered &(width60% &{row
-
- ![](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Black_hole_-_Messier_87_crop_max_res.jpg/600px-Black_hole_-_Messier_87_crop_max_res.jpg)
-
- ![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Internet_map_1024.jpg/600px-Internet_map_1024.jpg?20121030160606)
-
- &} &) &)
+:centered
+:width60%
+:row
-&]
+.p [image https://upload.wikimedia.org/wikipedia/commons/thumb/4/4f/Black_hole_-_Messier_87_crop_max_res.jpg/600px-Black_hole_-_Messier_87_crop_max_res.jpg]
+.p [image https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Internet_map_1024.jpg/600px-Internet_map_1024.jpg?20121030160606]
-&[title35
-# Означава да създадеш<br>deus ex machina
-С други думи, позволява ни да разрешим неразрешими проблеми
-&]
+:title_slide35
-&[title35
+# Означава да създадеш\ndeus ex machina
-# [Достатъчно философия, сега ще конфигурираме всичко нужно за първото ни упражнение](./setup.html)
+С други думи, позволява ни да разрешим неразрешими проблеми
-&]
-### Употреба на изображения
+:title_slide35
+
+# [url ./setup.html Достатъчно философия, сега ще конфигурираме всичко нужно за първото ни упражнение]
-Снимки на [Claude Shannon](https://upload.wikimedia.org/wikipedia/commons/9/99/ClaudeShannon_MFO3807.jpg?20190622223728) и [Stephen Cole Kleen](https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Kleene.jpg/421px-Kleene.jpg?20230630215747), предоставени от Konrad Jacobs с авторско право от [MFO](https://opc.mfo.de/), лицензирано с [CC BY-SA 2.0 DE](https://creativecommons.org/licenses/by-sa/2.0/de/deed.en) в Уикипедия.
-Снимка на черната дупка Messier 87, предоставена от [ESO](https://www.eso.org/public/) с лиценз [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.en) в [Уикипедия](https://en.wikipedia.org/wiki/File:Black_hole_-_Messier_87_crop_max_res.jpg).
+### Употреба на изображения
+
+Снимки на [url https://upload.wikimedia.org/wikipedia/commons/9/99/ClaudeShannon_MFO3807.jpg?20190622223728 Claude Shannon] и [url https://upload.wikimedia.org/wikipedia/commons/thumb/1/1c/Kleene.jpg/421px-Kleene.jpg?20230630215747 Stephen Cole Kleen], предоставени от Konrad Jacobs с авторско право от [url https://opc.mfo.de/ MFO], лицензирано с [url https://creativecommons.org/licenses/by-sa/2.0/de/deed.en CC BY-SA 2.0 DE] в Уикипедия.
-Изображение на интернет мрежата направено от [Matt Britt](https://en.wikipedia.org/wiki/User:Matt_Britt) с данни от [The Opte Project](https://www.opte.org/), лицензирано с [CC BY 2.5](https://creativecommons.org/licenses/by/2.5/deed.en) в [Уикипедия](https://commons.wikimedia.org/wiki/File:Internet_map_1024.jpg).
+Снимка на черната дупка Messier 87, предоставена от [url https://www.eso.org/public/ ESO] с лиценз [url https://creativecommons.org/licenses/by/4.0/deed.en CC BY 4.0] в [url https://en.wikipedia.org/wiki/File:Black_hole_-_Messier_87_crop_max_res.jpg Уикипедия].
-[^importance-of-sets]: [https://math.stackexchange.com/a/536172](https://math.stackexchange.com/a/536172)
-[^importance-of-combinatorics]: [https://math.stackexchange.com/questions/2146051/where-do-combinatorics-play-a-role-in-computer-science](https://math.stackexchange.com/questions/2146051/where-do-combinatorics-play-a-role-in-computer-science)
+Изображение на интернет мрежата направено от [url https://en.wikipedia.org/wiki/User:Matt_Britt Matt Britt] с данни от [url https://www.opte.org/ The Opte Project], лицензирано с [url https://creativecommons.org/licenses/by/2.5/deed.en CC BY 2.5] в [url https://commons.wikimedia.org/wiki/File:Internet_map_1024.jpg Уикипедия].
diff --git a/src/teaching/upp-2023/week10/index.du b/src/teaching/upp-2023/week10/index.du
new file mode 100644
index 0000000..04889c4
--- /dev/null
+++ b/src/teaching/upp-2023/week10/index.du
@@ -0,0 +1,91 @@
+# Задачи - УПП, Седмица 10, 15.12.2023
+
+\n
+
+GitHub classroom: [url https://classroom.github.com/a/EJcTQRz4 classroom.github.com/a/EJcTQRz4]
+
+.important Във всички задачи =[трябва]= да използвате рекурсия!
+
+## Задача 1
+
+Най-големия общ делител на числата `[a]` и `[b]` е най-голямото, число което ги дели без остатък.
+Евклидовият алгоритъм се базира на факта, че за две положителни числа `[a]` и `[b]`, като `[a > b]`, НОД на `[a]` и `[b]` е същия като НОД на `[a - b]` и `[b]` и когато `[a = b]`, тогава НОД на `[a]` и `[b]` е тяхната стойност.
+
+От входа получавате две цели положителни числа и трябва да изкарате техния НОД, чрез алгоритъма на Евклид =[имплементиран с рекурсия]=.
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:6 6 :||:6 :|
+|:48 18:||:6 :|
+
+## Задача 2
+
+От входа получавате неотрицателно число `[N]`, което ще бъде някое число на Фибоначи.
+Трябва да върнете кое по ред е, като 0 е нулевото, 1 е първото, 2 е третото, 3 е четвъртото и так. нат.
+Напомням, че математически фибоначи се дефинира така:
+
+.comment
+\begin{align*}
+F_n = \left\{ \begin{array}{ll}
+0, & n=0 \\
+1, & n=1 \\
+F_{n-1} + F_{n-2} & \text{иначе} \\
+\end{array} \right.
+\end{align*}
+
+[image ./img/fib.png F(0) = 0; F(1) = 1; F(n) = F(n-1) + F(n-2)]
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:0 :||:0 :|
+|:1 :||:1 :|
+|:3 :||:4 :|
+|:144 :||:12 :|
+|:1597 :||:17 :|
+|:46368:||:24 :|
+
+## Задача 3
+
+От входа получавате положително число `[N]`, трябва да изкарате на екрана "рисунка", показваща формата на пясъчен часовник с височина `[2N]` (вижте примерите).
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:1 :||:<pre>+\n#</pre>:|
+|:2 :||:<pre>+++\n +\n #\n###</pre>:|
+|:3 :||:<pre>+++++\n +++\n +\n #\n ###\n#####</pre>:|
+|:5 :||:<pre>+++++++++\n +++++++\n +++++\n +++\n +\n #\n ###\n #####\n #######\n#########</pre>:|
+
+## Задача 4
+
+От входа получавате число `[N]`, след това тябва да изкарате на нови редове, в нарастващ ред, всички двоични числа, които могат да се представят с `[N]`-бита.
+Вкарвате и водещи нули, тоест всяко число е съставено от точно `[N]` букви (`[N]` нули и единици).
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:1 :||:0\n1:|
+|:2 :||:00\n01\n10\n11:|
+|:3 :||:000\n001\n010\n011\n100\n101\n110\n111:|
+|:4 :||:0000\n0001\n...\n0111\n1000\n1001\n...\n1101\n1110\n1111:|
+
+## Задача 5
+
+Получавате един ред от терминала, в който ще имате скоби, знакът `[+]` и `[*]`, шпации и числа.
+Това е прост математически израз, трябва да изкарате резултата след неговото пресмятане, като винаги около `[число + число]` и `[число * число]` има скоби (тоест не е нужно да се притеснявате от приоритет и асоциативност).
+
+За удобство спокойно може да ползвате `[atoi]` за конверитране на числовите части от низа в числа.
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:(1 + 2):||:3 :|
+|:((2 + 9) * 3):||:33:|
+|:(((8 * 1) * (56 + 4)) + (19 * 2)):||:518:|
diff --git a/src/teaching/upp-2023/week10/index.md b/src/teaching/upp-2023/week10/index.md
deleted file mode 100644
index 722e705..0000000
--- a/src/teaching/upp-2023/week10/index.md
+++ /dev/null
@@ -1,90 +0,0 @@
-# Задачи - УПП, Седмица 10, 15.12.2023
-
-GitHub classroom: [classroom.github.com/a/EJcTQRz4](https://classroom.github.com/a/EJcTQRz4)
-
-&:important Във всички задачи **трябва** да използвате рекурсия!
-
-## Задача 1
-
-Най-големия общ делител на числата `a` и `b` е най-голямото, число което ги дели без остатък.
-Евклидовият алгоритъм се базира на факта, че за две положителни числа `a` и `b`, като `a > b`, НОД на `a` и `b` е същия като НОД на `a - b` и `b` и когато `a = b`, тогава НОД на `a` и `b` е тяхната стойност.
-
-От входа получавате две цели положителни числа и трябва да изкарате техния НОД, чрез алгоритъма на Евклид **имплементиран с рекурсия**.
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|6 6 |6 |
-|48 18|6 |
-
-## Задача 2
-
-От входа получавате неотрицателно число `N`, което ще бъде някое число на Фибоначи.
-Трябва да върнете кое по ред е, като 0 е нулевото, 1 е първото, 2 е третото, 3 е четвъртото и так. нат.
-Напомням, че математически фибоначи се дефинира така:
-
-<!--
-\begin{align*}
-F_n = \left\{ \begin{array}{ll}
-0, & n=0 \\
-1, & n=1 \\
-F_{n-1} + F_{n-2} & \text{иначе} \\
-\end{array} \right.
-\end{align*}
--->
-
-![F(0) = 0; F(1) = 1; F(n) = F(n-1) + F(n-2)](./img/fib.png)
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|0 |0 |
-|1 |1 |
-|3 |4 |
-|144 |12 |
-|1597 |17 |
-|46368|24 |
-
-## Задача 3
-
-От входа получавате положително число `N`, трябва да изкарате на екрана "рисунка", показваща формата на пясъчен часовник с височина `2N` (вижте примерите).
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|1 |<pre>+<br>#</pre>|
-|2 |<pre>+++<br> +<br> #<br>###</pre>|
-|3 |<pre>+++++<br> +++<br> +<br> #<br> ###<br>#####</pre>|
-|5 |<pre>+++++++++<br> +++++++<br> +++++<br> +++<br> +<br> #<br> ###<br> #####<br> #######<br>#########</pre>|
-
-## Задача 4
-
-От входа получавате число `N`, след това тябва да изкарате на нови редове, в нарастващ ред, всички двоични числа, които могат да се представят с `N`-бита.
-Вкарвате и водещи нули, тоест всяко число е съставено от точно `N` букви (`N` нули и единици).
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|1 |0<br>1|
-|2 |00<br>01<br>10<br>11|
-|3 |000<br>001<br>010<br>011<br>100<br>101<br>110<br>111|
-|4 |0000<br>0001<br>...<br>0111<br>1000<br>1001<br>...<br>1101<br>1110<br>1111|
-
-## Задача 5
-
-Получавате един ред от терминала, в който ще имате скоби, знакът `+` и `*`, шпации и числа.
-Това е прост математически израз, трябва да изкарате резултата след неговото пресмятане, като винаги около `число + число` и `число * число` има скоби (тоест не е нужно да се притеснявате от приоритет и асоциативност).
-
-За удобство спокойно може да ползвате `atoi` за конверитране на числовите части от низа в числа.
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|(1 + 2)|3 |
-|((2 + 9) * 3)|33|
-|(((8 * 1) * (56 + 4)) + (19 * 2))|518|
diff --git a/src/teaching/upp-2023/week11/index.du b/src/teaching/upp-2023/week11/index.du
new file mode 100644
index 0000000..3f7d8f8
--- /dev/null
+++ b/src/teaching/upp-2023/week11/index.du
@@ -0,0 +1,129 @@
+# Задачи - УПП, Седмица 11, 22.12.2023
+
+\n
+
+GitHub classroom: [url https://classroom.github.com/a/cZRnZj9y classroom.github.com/a/cZRnZj9y]
+
+.important Във всички задачи =[трябва]= да използвате рекурсия!
+
+.warn Някои задачи се повтарят с тези от миналия път, ако преди не сте ги решили, сега ги решете
+
+## Алтернативни задачи
+
+Считайте [url https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem11#%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8 задачите от семинара] като задачи преди тези.
+Тоест, за хората които се затрудняват повечко, решете семинарните и след това се върнете тук.
+Разбира се, ще помагам и със семинарните задачи.
+
+## Задача 1
+
+От входа получавате неотрицателно число `[N]`, което ще бъде някое число на Фибоначи.
+Трябва да върнете кое по ред е, като 0 е нулевото, 1 е първото, 2 е третото, 3 е четвъртото и так. нат.
+
+Напомням, че нормално Фибоначи се дефинира като редица, която започва с числата 0 и 1, и всяко следващо е сумата на предходните две.
+Тоест, нулевото число е 0, първото 1, второто е `[0 + 1 = 1]` (понеже 1 се повтаря, зачитаме го за първото число), третото е `[1 + 1 = 2]`, четвъртото е `[1 + 2 = 3]` и так. нат.
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:0 :||:0 :|
+|:1 :||:1 :|
+|:3 :||:4 :|
+|:144 :||:12 :|
+|:1597 :||:17 :|
+|:46368:||:24 :|
+
+## Задача 2
+
+От входа получавате положително число `[N]`, трябва да изкарате на екрана "рисунка" на триъгълници.
+
+### a) горен триъгълник
+
+Рисунката е един правоъгълен равнобедрен триъгълник от знака `[+]`, като `[N]` определя размера на равнобедрените страни (вижте примерите).
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:1 :||:<pre>+</pre>:|
+|:2 :||:<pre>+\n++</pre>:|
+|:3 :||:<pre>+\n++\n+++</pre>:|
+|:5 :||:<pre>+\n++\n+++\n++++\n+++++</pre>:|
+
+### б) долен триъгълник
+
+Подобно на предходната подточка, обаче обърнат по хоризонтала, и със знака `[#]`.
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:1 :||:<pre>#</pre>:|
+|:2 :||:<pre>##\n#</pre>:|
+|:3 :||:<pre>###\n##\n#</pre>:|
+|:5 :||:<pre>#####\n####\n###\n##\n#</pre>:|
+
+### в) пълен триъгълник
+
+=[Използвайки само една рекурсивна функция,]= сега трябва да изкарате първо горния триъгълник и след това долния.
+Ако просто извикате предходните две функции една след друга, задачата се обезсмисля.
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:1 :||:<pre>+\n#</pre>:|
+|:2 :||:<pre>+\n++\n##\n#</pre>:|
+|:3 :||:<pre>+\n++\n+++\n###\n##\n#</pre>:|
+|:5 :||:<pre>+\n++\n+++\n++++\n+++++\n#####\n####\n###\n##\n#</pre>:|
+
+## Задача 3
+
+Направете програма която разрешава проблема с [url https://en.wikipedia.org/wiki/Ages_of_Three_Children_puzzle възрастта на трите деца].
+
+Една жена има три деца за които знаем три неща: умножението на техните възрасти, сбора на техните възрасти и факта, че има едно дете, което е най-голямо.
+Трябва да намерите възрастта на всяко дете, само по тази информация.
+
+Разбира се, от входа получавате две числа, съответно умножението и сбора на възрастите им.
+Трябва на екрана да изкарате три числа - възрастите на трите деца.
+
+=[Подсказка:]= най-лесното решение е да пробвате всички възможни възрасти, като избягвате техни пермутации
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:72 14:||:3 3 8:|
+|:36 13:||:2 2 9:|
+|:350 42:||:2 5 35:|
+
+## Задача 4
+
+От входа получавате число `[N]`, след това трябва да изкарате на нови редове, в нарастващ ред, всички двоични числа, които могат да се представят с `[N]`-бита.
+Вкарвате и водещи нули, тоест всяко число е съставено от точно `[N]` букви (`[N]` нули и единици).
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:1 :||:0\n1:|
+|:2 :||:00\n01\n10\n11:|
+|:3 :||:000\n001\n010\n011\n100\n101\n110\n111:|
+|:4 :||:0000\n0001\n...\n0111\n1000\n1001\n...\n1101\n1110\n1111:|
+
+## Задача 5
+
+Направете програма която разрешава [url https://en.wikipedia.org/wiki/Takuzu Такузо пъзели].
+
+Започвате с дъска 4х4, в тази дъска може да имате само цифрите 0 и 1, като няколко клетки вече идват с попълнени стойности (но повечето са празни).
+Обаче, на всяка колона и ред трябва да има еднакъв брой 0ли и 1ци, и не трябва да има повече от две последователни еднакви цифри (в реда или колоната).
+
+От входа получавате дъската, като с -1 обозначаваме празна клетка.
+
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:-1 1 -1 0\n-1 -1 0 -1\n-1 0 -1 -1\n1 1 -1 0:||:0 1 1 0\n1 0 0 1\n0 0 1 1\n1 1 0 0:|
+|:-1 0 1 -1\n1 -1 0 -1\n0 1 -1 -1\n0 0 1 -1:||:1 0 1 0\n1 1 0 0\n0 1 0 1\n0 0 1 1:|
+|:-1 0 -1 -1\n-1 0 0 -1\n0 -1 -1 -1\n-1 -1 -1 0:||:0 0 1 1\n1 0 0 1\n0 1 1 0\n1 1 0 0:|
diff --git a/src/teaching/upp-2023/week11/index.md b/src/teaching/upp-2023/week11/index.md
deleted file mode 100644
index 92ce89e..0000000
--- a/src/teaching/upp-2023/week11/index.md
+++ /dev/null
@@ -1,127 +0,0 @@
-# Задачи - УПП, Седмица 11, 22.12.2023
-
-GitHub classroom: [classroom.github.com/a/cZRnZj9y](https://classroom.github.com/a/cZRnZj9y)
-
-&:important Във всички задачи **трябва** да използвате рекурсия!
-
-&:warn Някои задачи се повтарят с тези от миналия път, ако преди не сте ги решили, сега ги решете
-
-## Алтернативни задачи
-
-Считайте [задачите от семинара](https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem11#%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8) като задачи преди тези.
-Тоест, за хората които се затрудняват повечко, решете семинарните и след това се върнете тук.
-Разбира се, ще помагам и със семинарните задачи.
-
-## Задача 1
-
-От входа получавате неотрицателно число `N`, което ще бъде някое число на Фибоначи.
-Трябва да върнете кое по ред е, като 0 е нулевото, 1 е първото, 2 е третото, 3 е четвъртото и так. нат.
-
-Напомням, че нормално Фибоначи се дефинира като редица, която започва с числата 0 и 1, и всяко следващо е сумата на предходните две.
-Тоест, нулевото число е 0, първото 1, второто е `0 + 1 = 1` (понеже 1 се повтаря, зачитаме го за първото число), третото е `1 + 1 = 2`, четвъртото е `1 + 2 = 3` и так. нат.
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|0 |0 |
-|1 |1 |
-|3 |4 |
-|144 |12 |
-|1597 |17 |
-|46368|24 |
-
-## Задача 2
-
-От входа получавате положително число `N`, трябва да изкарате на екрана "рисунка" на триъгълници.
-
-### a) горен триъгълник
-
-Рисунката е един правоъгълен равнобедрен триъгълник от знака `+`, като `N` определя размера на равнобедрените страни (вижте примерите).
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|1 |<pre>+</pre>|
-|2 |<pre>+<br>++</pre>|
-|3 |<pre>+<br>++<br>+++</pre>|
-|5 |<pre>+<br>++<br>+++<br>++++<br>+++++</pre>|
-
-### б) долен триъгълник
-
-Подобно на предходната подточка, обаче обърнат по хоризонтала, и със знака `#`.
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|1 |<pre>#</pre>|
-|2 |<pre>##<br>#</pre>|
-|3 |<pre>###<br>##<br>#</pre>|
-|5 |<pre>#####<br>####<br>###<br>##<br>#</pre>|
-
-### в) пълен триъгълник
-
-**Използвайки само една рекурсивна функция,** сега трябва да изкарате първо горния триъгълник и след това долния.
-Ако просто извикате предходните две функции една след друга, задачата се обезсмисля.
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|1 |<pre>+<br>#</pre>|
-|2 |<pre>+<br>++<br>##<br>#</pre>|
-|3 |<pre>+<br>++<br>+++<br>###<br>##<br>#</pre>|
-|5 |<pre>+<br>++<br>+++<br>++++<br>+++++<br>#####<br>####<br>###<br>##<br>#</pre>|
-
-## Задача 3
-
-Направете програма която разрешава проблема с [възрастта на трите деца](https://en.wikipedia.org/wiki/Ages_of_Three_Children_puzzle).
-
-Една жена има три деца за които знаем три неща: умножението на техните възрасти, сбора на техните възрасти и факта, че има едно дете, което е най-голямо.
-Трябва да намерите възрастта на всяко дете, само по тази информация.
-
-Разбира се, от входа получавате две числа, съответно умножението и сбора на възрастите им.
-Трябва на екрана да изкарате три числа - възрастите на трите деца.
-
-**Подсказка:** най-лесното решение е да пробвате всички възможни възрасти, като избягвате техни пермутации
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|72 14|3 3 8|
-|36 13|2 2 9|
-|350 42|2 5 35|
-
-## Задача 4
-
-От входа получавате число `N`, след това трябва да изкарате на нови редове, в нарастващ ред, всички двоични числа, които могат да се представят с `N`-бита.
-Вкарвате и водещи нули, тоест всяко число е съставено от точно `N` букви (`N` нули и единици).
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|1 |0<br>1|
-|2 |00<br>01<br>10<br>11|
-|3 |000<br>001<br>010<br>011<br>100<br>101<br>110<br>111|
-|4 |0000<br>0001<br>...<br>0111<br>1000<br>1001<br>...<br>1101<br>1110<br>1111|
-
-## Задача 5
-
-Направете програма която разрешава [Такузо пъзели](https://en.wikipedia.org/wiki/Takuzu).
-
-Започвате с дъска 4х4, в тази дъска може да имате само цифрите 0 и 1, като няколко клетки вече идват с попълнени стойности (но повечето са празни).
-Обаче, на всяка колона и ред трябва да има еднакъв брой 0ли и 1ци, и не трябва да има повече от две последователни еднакви цифри (в реда или колоната).
-
-От входа получавате дъската, като с -1 обозначаваме празна клетка.
-
-**Примери:**
-
-|Вход|Изход|
-|----|-----|
-|-1 1 -1 0<br>-1 -1 0 -1<br>-1 0 -1 -1<br>1 1 -1 0|0 1 1 0<br>1 0 0 1<br>0 0 1 1<br>1 1 0 0|
-|-1 0 1 -1<br>1 -1 0 -1<br>0 1 -1 -1<br>0 0 1 -1|1 0 1 0<br>1 1 0 0<br>0 1 0 1<br>0 0 1 1|
-|-1 0 -1 -1<br>-1 0 0 -1<br>0 -1 -1 -1<br>-1 -1 -1 0|0 0 1 1<br>1 0 0 1<br>0 1 1 0<br>1 1 0 0|
diff --git a/src/teaching/upp-2023/week12/index.md b/src/teaching/upp-2023/week12/index.du
index d914431..ed380cf 100644
--- a/src/teaching/upp-2023/week12/index.md
+++ b/src/teaching/upp-2023/week12/index.du
@@ -1,12 +1,14 @@
# Задачи - УПП, Седмица 12, 05.01.2024
-GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com/a/KEDSxDjl)
+\n
-&:important Във всички задачи **трябва** да използвате рекурсия!
+GitHub classroom: [url https://classroom.github.com/a/KEDSxDjl classroom.github.com/a/KEDSxDjl]
+
+.important Във всички задачи =[трябва]= да използвате рекурсия!
## Алтернативни задачи
-Считайте [задачите от семинара](https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem12) и [тези от миналия път](../week11/) като част от днешните задачи.
+Считайте [url https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem12 задачите от семинара] и [url ../week11/ тези от миналия път] като част от днешните задачи.
Тоест, за хората които се затрудняват повечко, решете ги и след това се върнете тук.
Разбира се, ще помагам и с тях.
@@ -19,20 +21,20 @@ GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com
Накрая получавате максималната обща тежест за раницата.
Трябва да изкарате на екрана максималната възможна обща ценност.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|3<br>1 4<br>2 5<br>3 1<br>4|3|
-|3<br>1 4<br>2 5<br>3 6<br>3|0|
-|6<br>50 56<br>50 59<br>64 80<br>46 64<br>50 75<br>5 17<br>190|150<!-- https://people.sc.fsu.edu/~jburkardt/datasets/knapsack_01/knapsack_01.html -->|
+.table
+|=Вход=||=Изход=|
+|:3\n1 4\n2 5\n3 1\n4:||:3:|
+|:3\n1 4\n2 5\n3 6\n3:||:0:|
+|:6\n50 56\n50 59\n64 80\n46 64\n50 75\n5 17\n190:||:150<!-- https://people.sc.fsu.edu/~jburkardt/datasets/knapsack_01/knapsack_01.html -->:|
## Задача 2
Получавате N и M, съответно броя редове и колони в дъска.
Всяка клетка от дъската е пълна или празна.
-След това получавате NxM на брой символа за всяка клетка, като `-` означава празна клетка, докато `#` означава пълна.
+След това получавате NxM на брой символа за всяка клетка, като `[-]` означава празна клетка, докато `[#]` означава пълна.
Накрая получавате две числа - координати (започващи от нула, като 0,0 е горния-ляв ъгъл) в дъската.
От подадените координати трябва да запълните "фигурата" в която се намира (фигурата която огражда) дадената плочка.
@@ -40,13 +42,13 @@ GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com
Оцветяването да се случва само в 4те прави посоки (без диагонали).
-![](https://upload.wikimedia.org/wikipedia/commons/7/7e/Recursive_Flood_Fill_4_%28aka%29.gif)
+[image https://upload.wikimedia.org/wikipedia/commons/7/7e/Recursive_Flood_Fill_4_%28aka%29.gif]
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-|5 11<br><pre>- - # # - - - - - - -<br>- # - - # - - - - - -<br># - - - - # # # # # #<br>- # - - # - - - # - #<br>- - # # - - - - - - -</pre>2 2|<pre>- - # # - - - - - - -<br>- # # # # - - - - - -<br># # # # # # # # # # #<br>- # # # # - - - # - #<br>- - # # - - - - - - -</pre>|
+.table
+|=Вход=||=Изход=|
+|:5 11\n<pre>- - # # - - - - - - -\n- # - - # - - - - - -\n# - - - - # # # # # #\n- # - - # - - - # - #\n- - # # - - - - - - -</pre>2 2:||:<pre>- - # # - - - - - - -\n- # # # # - - - - - -\n# # # # # # # # # # #\n- # # # # - - - # - #\n- - # # - - - - - - -</pre>:|
## Задача 3
@@ -56,54 +58,59 @@ GitHub classroom: [classroom.github.com/a/KEDSxDjl](https://classroom.github.com
Интересуваме се от такова поставяне на всички царици, че нито една няма да вземе никоя друга царица в един ход.
Пример:
-![](https://upload.wikimedia.org/wikipedia/commons/6/69/Solution_A_for_8_Queen_Puzzles.png)
+[image https://upload.wikimedia.org/wikipedia/commons/6/69/Solution_A_for_8_Queen_Puzzles.png]
Напишете програма, която намира броя на възможните такива поставяния на цариците.
От входа не получавате нищо.
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-| |92 |
+.table
+|=Вход=||=Изход=|
+|: :||:92 :|
-**Бонус:** направете програмата да изкарва всяко решение
+=[Бонус:]= направете програмата да изкарва всяко решение
## Задача 4
-<!-- https://mathcenter.oxford.emory.edu/site/cs171/probSetUsingStacks/ -->
+.comment https://mathcenter.oxford.emory.edu/site/cs171/probSetUsingStacks/
-Нормално ние представяме математически операции чрез "инфиксен" запис, тоест операторът е по средата, между нещата върху които работи (пример: `1 + 2`).
-Обаче, това не е задължително, по обратната полска нотация винаги слагаме оператът след нещата върху които работи (пример: `1 2 +`).
+Нормално ние представяме математически операции чрез "инфиксен" запис, тоест операторът е по средата, между нещата върху които работи (пример: `[1 + 2]`).
+Обаче, това не е задължително, по обратната полска нотация винаги слагаме оператът след нещата върху които работи (пример: `[1 2 +]`).
Бонусът на това, е че не ни трябва скобуване и ред на операциите.
-В инфиксния израз `(2 + 3) * (2 ^^ 2)`, без скобите, сбора ще се извърши след умножението и степенуването ще се извърши след умножението.
-Обаче, ако искаме да изразим това в обратен полски запис, просто правим `2 3 + 2 2 ^^ *`.
-А ако искаме оригиналното действие, без скоби, записваме `2 3 2 * 2 ^^ +`.
+В инфиксния израз `[(2 + 3) * (2 ^^ 2)]`, без скобите, сбора ще се извърши след умножението и степенуването ще се извърши след умножението.
+Обаче, ако искаме да изразим това в обратен полски запис, просто правим `[2 3 + 2 2 ^^ *]`.
+А ако искаме оригиналното действие, без скоби, записваме `[2 3 2 * 2 ^^ +]`.
Ако изглежда объркващо, идеята е че всеки оператор работи върху предходните две стойности, изчисляваме изразите от ляво надясно и заместваме веднага.
-Тоест, при последния пример, пропускаме първите три числа, стигаме до `*`, умножаваме последните две и заместваме трите неща (`3 2 *`) с резултата, следователно имаме `2 6 2 ^^ +`, пропускаме две, стигаме до `^^` и так.нат.
+Тоест, при последния пример, пропускаме първите три числа, стигаме до `[*]`, умножаваме последните две и заместваме трите неща (`[3 2 *]`) с резултата, следователно имаме `[2 6 2 ^^ +]`, пропускаме две, стигаме до `[^^]` и так.нат.
+
+Направете програма, която чисто рекурсивно изчислиява изрази в обратен полски запис, който поддържа цели числа и операциите събиране, умножение, деление, изваждане и степенуване (за степенуване ще използваме знакът `[^]`).
+
+.important Обаче, за едно извикване на рекурсивната функция, може да пазите само един елемент на израза (число или оператор)!
+
+Изразът винаги завършва на знака `[$]`.
-Направете програма, която чисто рекурсивно изчислиява изрази в обратен полски запис, който поддържа цели числа и операциите събиране, умножение, деление, изваждане и степенуване (за степенуване ще използваме знакът `^`).
+:warn
+Относно вход/изход, понеже няма как да знаем дали i-тата стойност е число или знак (операция), трябва да използваме функцията `[std::cin.fail()]`, която връща булева стойност, която ни казва дали записването на входа е било успешно.\n\n
-&:important Обаче, за едно извикване на рекурсивната функция, може да пазите само един елемент на израза (число или оператор)!
+Тоест, може винаги да запазвате входа в целочислен тип, когато стигнете до знак `[std::cin.fail()]` ще върне `[true]`.
+След това трябва да "забравите" за грешката чрез `[std::cin.clear()]` и може втори път да запазите входа (провалените данни ще се препрочетат) в променлива от знаков тип.\n\n
-Изразът винаги завършва на знака `$`.
+Но това поражда друг проблем, понеже записваме в целочислен тип, когато въведем `[+]` или `[-]`, `[std::cin]` ще очаква това да е водещ знак на число, и ще продължи да чака входа докато не въведем друг знак, тоест `[+]` и `[-]` ще бъдат пропуснати.
+Като компромисен вариант, просто пред тях винаги ще слагаме `[']` и в кода ще го пропускаме.
-&:warn Относно вход/изход, понеже няма как да знаем дали i-тата стойност е число или знак (операция), трябва да използваме функцията `std::cin.fail()`, която връща булева стойност, която ни казва дали записването на входа е било успешно.<br>
- Тоест, може винаги да запазвате входа в целочислен тип, когато стигнете до знак `std::cin.fail()` ще върне `true`.
- След това трябва да "забравите" за грешката чрез `std::cin.clear()` и може втори път да запазите входа (провалените данни ще се препрочетат) в променлива от знаков тип.<br>
- Но това поражда друг проблем, понеже записваме в целочислен тип, когато въведем `+` или `-`, `std::cin` ще очаква това да е водещ знак на число, и ще продължи да чака входа докато не въведем друг знак, тоест `+` и `-` ще бъдат пропуснати.
- Като компромисен вариант, просто пред тях винаги ще слагаме `'` и в кода ще го пропускаме.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|1 2 &apos;+ 3 / $|1|
-|1 4 3 2 ^ * &apos;+ 14 7 / &apos;- $|35|
+.table
+|=Вход=||=Изход=|
+|:1 2 '+ 3 / $:||:1:|
+|:1 4 3 2 ^ * '+ 14 7 / '- $:||:35:|
## Attribution
-- Анимация в [Задача 2](#2) от André Karwath (Aka) на [Уикипедия](https://commons.wikimedia.org/w/index.php?curid=481651) под лиценз CC BY-SA 2.5
-- Изображение на шахматна дъска в [Задача 3](#3) от Encik Tekateki в [Уикипедия](https://commons.wikimedia.org/w/index.php?curid=77832290) под лиценз CC BY-SA 4.0
+.bulleted
+- Анимация в [url #2 Задача 2] от André Karwath (Aka) на [url https://commons.wikimedia.org/w/index.php?curid=481651 Уикипедия] под лиценз CC BY-SA 2.5
+- Изображение на шахматна дъска в [url #3 Задача 3] от Encik Tekateki в [url https://commons.wikimedia.org/w/index.php?curid=77832290 Уикипедия] под лиценз CC BY-SA 4.0
diff --git a/src/teaching/upp-2023/week13/index.md b/src/teaching/upp-2023/week13/index.du
index f0e4b9a..da52d46 100644
--- a/src/teaching/upp-2023/week13/index.md
+++ b/src/teaching/upp-2023/week13/index.du
@@ -1,10 +1,12 @@
# Задачи - УПП, Седмица 13, 12.01.2024
-GitHub classroom: [classroom.github.com/a/bgiFD6SB](https://classroom.github.com/a/bgiFD6SB)
+\n
+
+GitHub classroom: [url https://classroom.github.com/a/bgiFD6SB classroom.github.com/a/bgiFD6SB]
## Алтернативни задачи
-Считайте [задачите от семинара](https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem13) и [тези от миналия път](../week12/) като част от днешните задачи.
+Считайте [url https://github.com/ivanahristova/introduction-to-programming-2023-2024/tree/main/sem13 задачите от семинара] и [url ../week12/ тези от миналия път] като част от днешните задачи.
Тоест, за хората които се затрудняват повечко, решете ги и след това се върнете тук.
Разбира се, ще помагам и с тях.
@@ -18,12 +20,12 @@ GitHub classroom: [classroom.github.com/a/bgiFD6SB](https://classroom.github.com
Всяка дума е на нов ред и е съставена от малки латински букви.
Ако има няколко думи с еднаква "близкост", изкарайте последната от тях.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|5<br>cate<br>cot<br>dog<br>cote<br>co<br>cat|cot|
-|4<br>nask<br>nmaskl<br>msdal<br>task<br>mask|task|
+.table
+|=Вход=||=Изход=|
+|:5\ncate\ncot\ndog\ncote\nco\ncat:||:cot:|
+|:4\nnask\nnmaskl\nmsdal\ntask\nmask:||:task:|
## 2 задача
@@ -34,21 +36,22 @@ GitHub classroom: [classroom.github.com/a/bgiFD6SB](https://classroom.github.com
Редовете са разбъркани, изкарайте първо име и фамилия на хората с най-много продадени продукти.
Ако има няколко хора, които са продали най-много продукти, изкарайте имената им в азбучен ред, първо по фамилия, после по име.
-Използвайте **само една функция за сортиране!**
+Използвайте =[само една функция за сортиране!]=
Като подсказка, използвайте указатели към функции за да променяте как тя работи.
-&:question Какво свойство трябва да е изпълнено за сортиращата функция?
+.question Какво свойство трябва да е изпълнено за сортиращата функция?
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|Antony Garcia 10<br>John Doe 9<br>Joseph Carmichael 10<br>Steven Wayne 1<br>Bob Carmichael 10<br>Holy Wilson 9|Bob Carmichael<br>Joseph Carmichael<br>Antony Garcia|
+.table
+|=Вход=||=Изход=|
+|:Antony Garcia 10\nJohn Doe 9\nJoseph Carmichael 10\nSteven Wayne 1\nBob Carmichael 10\nHoly Wilson 9:||:Bob Carmichael\nJoseph Carmichael\nAntony Garcia:|
## 3 задача
Ще дефинираме обвито изречение, като редица от букви, за които са изпълнени следните правила:
+:unordered
- първата е главна
- последната е точка
- между тях има само малки букви, цифри и шпации
@@ -56,12 +59,12 @@ GitHub classroom: [classroom.github.com/a/bgiFD6SB](https://classroom.github.com
Тоест за всяко изречение са избрани максимален брой колони, и знаците са обвити, така че да се поберат.
Примерно, ако имахме изречението "Hello world." и бяхме избрали 5 колони, тогава получаваме:
-
+
```
Hello
worl
d.
- ```
+
От входа получавате N и M, те съответстват на матрица от символи с N реда и M колони.
В матрицата имате обвити изречения, подредени по такъв начин, че между съседни има със сигурност поне една шпация (която действа като разделител).
@@ -70,30 +73,28 @@ GitHub classroom: [classroom.github.com/a/bgiFD6SB](https://classroom.github.com
```
A B
. .
-```
тогава двете ни изречения са:
```
B.
A .
-```
Изкарайте на конзолата всички обвити изречения в матрицата (редът им няма значение).
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|<pre>7 13<br>Thi A Someth<br>s i n ing. <br>s c . <br>ool <br>. Good Hel<br> luc lo.<br>Ha. k. <br></pre>|Something.<br>An.<br>This is cool.<br>Hello.<br>Good luck.<br>Ha.<br>|
-|<pre>2 7<br>B A.<br>. </pre>|<pre>A.<br>B .</pre>|
-|<pre>3 7<br> A.<br>B <br>. </pre>|<pre>A.<br>B .</pre>|
-|<pre>4 7<br> A.<br> <br>B <br>. </pre>|<pre>A.<br>B .</pre>|
-|<pre>3 6<br>Big <br>jumper<br>. </pre>|<pre>Big jumper.</pre>|
+.table
+|=Вход=||=Изход=|
+|:<pre>7 13\nThi A Someth\ns i n ing. \ns c . \nool \n. Good Hel\n luc lo.\nHa. k. \n</pre>:||:Something.\nAn.\nThis is cool.\nHello.\nGood luck.\nHa.\n:|
+|:<pre>2 7\nB A.\n. </pre>:||:<pre>A.\nB .</pre>:|
+|:<pre>3 7\n A.\nB \n. </pre>:||:<pre>A.\nB .</pre>:|
+|:<pre>4 7\n A.\n \nB \n. </pre>:||:<pre>A.\nB .</pre>:|
+|:<pre>3 6\nBig \njumper\n. </pre>:||:<pre>Big jumper.</pre>:|
## 4 задача
-В префиксния (или полския) запис слагаме оператора за смятане пред (в ляво от) елементите върху които работи (нормален запис - `1 + 2`, полски запис - `+ 1 2`).
+В префиксния (или полския) запис слагаме оператора за смятане пред (в ляво от) елементите върху които работи (нормален запис - `[1 + 2]`, полски запис - `[+ 1 2]`).
Ще разглеждаме "многоредови" изрази в полски запис, тоест изрази в които има няколко реда от целочислени стойности, така че трябва да се изчислят няколко израза с еднаква "форма", но различни стойности.
Един такъв израз изглежда така:
@@ -102,10 +103,9 @@ A .
+ 1 2
3 4
5 6 .
-```
Точката на края на последния ред задава край на израза.
-В този пример ще изчислим `1 + 2`, `3 + 4` и `5 + 6`, тоест ще "върне" три стойности: 3, 7 и 11.
+В този пример ще изчислим `[1 + 2]`, `[3 + 4]` и `[5 + 6]`, тоест ще "върне" три стойности: 3, 7 и 11.
Всяка колона в израза е от един и същи "тип", тоест в една колона винаги ще има числова стойност или някакъв знак.
С изключение на точката, всеки знак може да се постави на произволен ред (обаче в една колона не може да има повече от един знак).
@@ -115,12 +115,11 @@ A .
1 - 2 2 63
+ 3 4 7 7
5 6 * 8 9 .
-```
-Това ще изчисли `1 + (2 - 2 * 63)`, `3 + (4 - 7 * 7)` и `5 + (6 - 8 * 9)`.
+Това ще изчисли `[1 + (2 - 2 * 63)]`, `[3 + (4 - 7* 7)]` и `[5 + (6 - 8 * 9)]`.
Израза би направил същото нещо ако примерно всички знаци бяха на първия ред или на последния.
-От входа получавате няколко такива израза, докато не получите знака `$`.
+От входа получавате няколко такива израза, докато не получите знака `[$]`.
Може да достъпвате стойност от предходни изрази чрез синтаксиса "ИНДЕКС.ИНДЕКС", където индексите са от 0, първия определя номера на израза, докато втория определя коя стойност искаме.
Примерно:
@@ -130,16 +129,15 @@ A .
+ 3 4
5 6 .
* 0.0 0.2 .
-```
В последния израз умножаваме от нулевия израз, първата и третата стойност, тоест умножаваме 3 и 11.
Накрая трябва да изкарате всички стойности от последния израз.
-&:warn Погледнете пояснението за вход/изход от [последната задача от миналия път](../week12/#4).
+.warn Погледнете пояснението за вход/изход от [url ../week12/#4 последната задача от миналия път].
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-|<pre> 1 5<br>+ 2 6<br> 3 7<br> 4 8 .<br>- 0.3 0.2 .<br>* 1.0 0.1 .<br> 1.0 3 0.2 3<br> - 3 0.3 0.1 1.0<br>* 0.0 2.0 / 2.0 0.1 .<br>$<br></pre>|-3 -36 -20|
+.table
+|=Вход=||=Изход=|
+|:<pre> 1 5\n+ 2 6\n 3 7\n 4 8 .\n- 0.3 0.2 .\n* 1.0 0.1 .\n 1.0 3 0.2 3\n - 3 0.3 0.1 1.0\n* 0.0 2.0 / 2.0 0.1 .\n$\n</pre>:||:-3 -36 -20:|
diff --git a/src/teaching/upp-2023/week14/index.md b/src/teaching/upp-2023/week14/index.du
index cf28fe7..a73e18f 100644
--- a/src/teaching/upp-2023/week14/index.md
+++ b/src/teaching/upp-2023/week14/index.du
@@ -1,9 +1,11 @@
# Задачи - УПП, Седмица 14, 19.01.2024
-GitHub classroom: [classroom.github.com/a/B08TtnnW](https://classroom.github.com/a/B08TtnnW)
+\n
+
+GitHub classroom: [url https://classroom.github.com/a/B08TtnnW classroom.github.com/a/B08TtnnW]
Това е последния практикум, затова ви давам по-лесни и приятни задачи: имплементации на игри!
-Всичките са взети от [101 BASIC Computer Games](https://en.wikipedia.org/wiki/BASIC_Computer_Games) (книгата е налична в [archive.org](https://archive.org/details/bitsavers_decBooks10Mar75_26006648)).
+Всичките са взети от [url https://en.wikipedia.org/wiki/BASIC_Computer_Games 101 BASIC Computer Games] (книгата е налична в [url https://archive.org/details/bitsavers_decBooks10Mar75_26006648 archive.org]).
Разбира се, който иска, може да решава задачи от предходни практикуми, давал съм достатъчно задачи.
@@ -24,39 +26,33 @@ Y sticks in pile 1
Z sticks in pile 2
[...]
K sticks in pile X
-```
След това се редуват, първия играч, втория играч:
```terminal
Player 1 turn
-```
Избирате купчина с пръчки:
```terminal
Which pile do you want sticks from? _
-```
където _ е мястото на курсора.
След това броя пръчки от купчината:
```terminal
How many sticks? _
-```
Ако някоя стойност е невалидна, питате пак.
След това идва редът на втория играч:
```terminal
Player 2 turn
-```
Накрая, този който вземе последната пръчка печели играта и се пита дали искате наново да почнете играта:
```terminal
Player X won. Do you want to play again? _
-```
## 2 задача - Хамураби
@@ -71,7 +67,6 @@ Player X won. Do you want to play again? _
```terminal
Hamurabi, I beg to report to you
In year X, Y people starved, Z came to the city.
-```
Разбира се, X, Y и Z са положителни целочислени стойности.
По-късно ще определим как се изменят и какви са началните стойности.
@@ -81,7 +76,6 @@ In year X, Y people starved, Z came to the city.
```terminal
A horrible plague struck! Half of the people died.
-```
След това съветника ви дава информация за града:
@@ -91,7 +85,6 @@ The city now owns X acres.
You harvested Z bushels per acre.
Rats ate K bushels.
You now have L bushels in store.
-```
Разбира се, X, Y, Z, K и L са целочислени стойности.
@@ -102,7 +95,6 @@ You now have L bushels in store.
```terminal
Land is trading at X bushels per acre.
How many acres do you wish to buy? _
-```
Където X е произволно цяло число между 17 и 27, долна черта показва мястото на курсора.
Трябва да се въведе цяло число.
@@ -111,7 +103,6 @@ How many acres do you wish to buy? _
```terminal
Hamurabi, I cannot do what you wish, get yourself another steward!!!!!
So long for now.
-```
Последния ред винаги се показва, когато играта свърши.
@@ -119,7 +110,6 @@ So long for now.
```terminal
Hamurabi, think again, you have only X bushels of grian. Now then,
-```
и същото съобщение за "Land is trading at [...] How many acres ..." се изписва и приемате нов вход.
@@ -127,7 +117,6 @@ Hamurabi, think again, you have only X bushels of grian. Now then,
```terminal
How many acres do you wish to sell? _
-```
Ако се въведе отрицателно число, случва се същото като при купуване на земя.
@@ -135,7 +124,6 @@ How many acres do you wish to sell? _
```terminal
Hamurabi think again, you own only X acres. Now then,
-```
и пак пита "How many acres [...]".
@@ -143,27 +131,23 @@ Hamurabi think again, you own only X acres. Now then,
```terminal
How many bushels do you wish to feed your people? _
-```
Ако се въведе твърде голямо число, съветника предупреждава и пита пак:
```terminal
Hamurabi, think again, you have only X bushels of grain. Now then,
How many bushels do you wish to feed your people? _
-```
Остава последния въпрос от съветника за годината:
```terminal
How many acres do you wish to plant with seed? _
-```
Разбира се, ако се въведат повече акри отколкото има, съветника предупреждава и пита пак:
```terminal
Hamurabi, think again, you own only X acres. Now then,
How many acres do you wish to plant with seed? _
-```
Предполагам може да се сетите какво съобщение съветника връща при отрицателни акри.
@@ -172,7 +156,6 @@ How many acres do you wish to plant with seed? _
```terminal
But you have only X people to tend the fields. Now then,
-```
Това са въпросите на съветника, сега остава годината да се изиграе.
Хората жънат (произволно число) между 1 и 6 бушела жито на всеки акър.
@@ -180,7 +163,7 @@ But you have only X people to tend the fields. Now then,
След това избирате друго произволно число между 1 и 6.
Ако числото е по-голямо от 1, тогава плъховете ще изядат по толкова голяма дроб бушели жито от резерва (при числото 5, плъховете изяждат 1/5; тук бушелите жито се смятат преди жътва).
-Сега населението расте, броя хора които са "дошли" в града се определя по формулата `R * (20 * АКРИ ЗЕМЯ + БУШЕЛИ ЖИТО) / БРОЙ ХОРА / 100 + 1`, където R е цяло число между 1 и 6.
+Сега населението расте, броя хора които са "дошли" в града се определя по формулата `[R * (20* АКРИ ЗЕМЯ + БУШЕЛИ ЖИТО) / БРОЙ ХОРА / 100 + 1]`, където R е цяло число между 1 и 6.
Бушелите жито се смятат след жътва.
Предпоследно, определя се колко хора са умрели от глад, като всеки човек консумира 20 бушели жито.
@@ -191,7 +174,6 @@ You starved X people in one year, due to this extreme mismanagement,
you have not only been impeached and thrown out of office but you have
also been declared national fink!
So long for now.
-```
Накрая на годината, трябва да обновите общия брой хора, които са умрели от глад, за цялото ви царуване, заедно със средния процент хора които са умирали на година.
@@ -200,13 +182,11 @@ So long for now.
```terminal
In your 10-year term of office, X percent of the population starved per year on average,
I.E., a total of Y people died.
-```
Сега изчислявате пропорцията между земя и хора, съветника ви казва:
```terminal
You started with 10 acres per person and ended with X acres per person.
-```
Ако средно над 33% от населението е умирало от глад всяка година или съотношението ви е под 7 акъра на човек, тогава се случва същото нещо, като когато над 45% от населението умира от глад.
@@ -216,7 +196,6 @@ You started with 10 acres per person and ended with X acres per person.
Your heavy-handed performance smacks of Nero and Ivan IV.
The people (remaining) find you an unpleasant ruler, and frankly, hate your guts.
So long for now.
-```
Ако средно над 3% (но под 11%) от населението е умирало от глад всяка година или съотношението е между 9 и 10 акъра на човека, тогава оставате със средно впечатление:
@@ -224,7 +203,6 @@ So long for now.
Your performance could have been somewhat better but really wasn't too bad at all.
X people would dearly like to see you assassinated but we all have our trivial problems.
So long for now.
-```
Където х съответства на бройката, между 0 и 80 процента от населението.
@@ -234,6 +212,5 @@ So long for now.
A fantastic performance!!!
Charlemange, Disraeli and Jefferson combined could not have done better.
So long for now.
-```
В началото на играта започвате с 100 човека население, като 5 от тях са дошли в града, 1000 акри земя, жътва от 3 бушела на акър, плъхове са изяли 200 бушела и имате 2800 бушела в хранилището.
diff --git a/src/teaching/upp-2023/week2/index.md b/src/teaching/upp-2023/week2/index.du
index da03945..e951282 100644
--- a/src/teaching/upp-2023/week2/index.md
+++ b/src/teaching/upp-2023/week2/index.du
@@ -1,70 +1,74 @@
# Задачи - УПП, Седмица 2, 13.10.2023
-GitHub classroom: [classroom.github.com/a/Bi5dhwW7](https://classroom.github.com/a/Bi5dhwW7)
+\n
-Решения: [GitHub](https://github.com/Syndamia/upp-2023-solutions/tree/main/week02)
+GitHub classroom: [url https://classroom.github.com/a/Bi5dhwW7 classroom.github.com/a/Bi5dhwW7]
-## **Важни бележки**
+Решения: [url https://github.com/Syndamia/upp-2023-solutions/tree/main/week02 GitHub]
-1. Не е добре да ползвате `using namespace std;`
-2. Единствената библиотека, която (поне за сега) може да ползвате е `iostream`
-3. За хората с текстови редактори и `gcc`, моля да погледнете в Moodle и да използвате предоставените флагове, най-важния от които е `-std=c++17`
-3. Като си качвате решенията в GitHub classroom, за предпочитане е имената на файловете да свършват на `.cpp`.
+## =[Важни бележки]=
+
+.numbered
+1. Не е добре да ползвате `[using namespace std;]`
+2. Единствената библиотека, която (поне за сега) може да ползвате е `[iostream]`
+3. За хората с текстови редактори и `[gcc]`, моля да погледнете в Moodle и да използвате предоставените флагове, най-важния от които е `[-std=c++17]`
+3. Като си качвате решенията в GitHub classroom, за предпочитане е имената на файловете да свършват на `[.cpp]`.
Отново, не е задължително, но ми улеснява живота.
## Тема: конвертиране
-<br>
+\n
### Задача 1 - Конвертирания от int
-Получавате целочислено число (тип `int`), след това, за всеки тип от следния списък, трябва да изкарате на нов ред текст във формата "Със/без загуба тип стойност":
+Получавате целочислено число (тип `[int]`), след това, за всеки тип от следния списък, трябва да изкарате на нов ред текст във формата "Със/без загуба тип стойност":
-- `bool`
-- `long long int`
-- `unsigned int`
-- `char`
-- `short int`
-- `double`
-- `long int`
-- `unsigned char`
+.bulleted
+- `[bool]`
+- `[long long int]`
+- `[unsigned int]`
+- `[char]`
+- `[short int]`
+- `[double]`
+- `[long int]`
+- `[unsigned char]`
Целта е да напишете един низ, който съдържа "Със/без загуба тип", и след това да изкарате (конвертираната) стойност.
Не се иска да правите код, който намира тази информация автоматично, всичко това просто си го напишете ръчно (hardcoded).
-**Пример**
-&emsp; *Нарочно са показани само първите два реда от изхода*
+=[Пример]=
+&emsp; *[Нарочно са показани само първите два реда от изхода]*
-|Вход|Изход|
-|----|-----|
-|5 |Със загуба bool 1<br>Без загуба long long int 5<br>...|
+.table
+|=Вход=||=Изход=|
+|:5 :||:Със загуба bool 1\nБез загуба long long int 5\n...:|
## Тема: Побитови оператори
-<br>
+\n
### Задача 2 - Mask
Получавате положително цяло число, от него трябва да "запазите" само първите (най-десните) 6 бита и да изкарате получилото се число.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|5 |5 |
-|200 |8 |
+.table
+|=Вход=||=Изход=|
+|:5 :||:5 :|
+|:200 :||:8 :|
### Задача 3 - Деление и умножение
-Получавате положително цяло число `а`, трябва да изкарате две числа (разделени с празно пространство):
-`a` (целочислено) разделено на 16 и `а` умножено по 8.
-**Трябва да използвате побитови оператори за това!**
+Получавате положително цяло число `[а]`, трябва да изкарате две числа (разделени с празно пространство):\n
+`[a]` (целочислено) разделено на 16 и `[а]` умножено по 8.
+=[Трябва да използвате побитови оператори за това!]=
-**Пример**
+=[Пример]=
-|Вход|Изход|
-|----|-----|
-|73 |4 584|
+.table
+|=Вход=||=Изход=|
+|:73 :||:4 584:|
### Задача 4 - IP адрес
@@ -76,89 +80,86 @@ GitHub classroom: [classroom.github.com/a/Bi5dhwW7](https://classroom.github.com
```
10000000100000001000000010000000
-```
Разделяйки по осморки битове:
```
10000000 10000000 10000000 10000000
-```
Всяка като я превърнем в десетично число става:
```
128 128 128 128
-```
-И накрая изкарания резултат трябва да бъде `128.128.128.128`
+И накрая изкарания резултат трябва да бъде `[128.128.128.128]`
На входа получавате цяло положително число, трябва да изкарате на екрана как би изглеждало с това представяне, с точките между осморки битове.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|3831791750|228.100.128.134|
-|240|0.0.0.240|
-|948405232|56.135.131.240|
+.table
+|=Вход=||=Изход=|
+|:3831791750:||:228.100.128.134:|
+|:240:||:0.0.0.240:|
+|:948405232:||:56.135.131.240:|
## Тема: Логически оператори
-<br>
+\n
### Задача 5 - Дели ли се
-От входа получавате две числа: `а` и `n`.
-Трябва да върнете 0 ако `a` не се дели на `n` без остатък, и 1 иначе.
+От входа получавате две числа: `[а]` и `[n]`.
+Трябва да върнете 0 ако `[a]` не се дели на `[n]` без остатък, и 1 иначе.
-**Упътване:** Булевата стойност `false` се изкарва като 0, а `true` се изкарва като 1, от `std::cout`
+=[Упътване:]= Булевата стойност `[false]` се изкарва като 0, а `[true]` се изкарва като 1, от `[std::cout]`
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|200 10|1 |
-|91 5 |0 |
+.table
+|=Вход=||=Изход=|
+|:200 10:||:1 :|
+|:91 5 :||:0 :|
### Задача 6 - Цифра ли е
Получавате от входа буква, трябва да върнете 0 ако буквата не е цифра и 1 ако е.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|5 |1 |
-|a |0 |
-|! |0 |
+.table
+|=Вход=||=Изход=|
+|:5 :||:1 :|
+|:a :||:0 :|
+|:! :||:0 :|
## Тема: Условни конструкции
-<br>
+\n
### Задача 7 - Нарастващ ред
На входа получавате три целочислени, трябва да ги изкарате в нарастващ ред.
-**Пример**
+=[Пример]=
-|Вход|Изход|
-|----|-----|
-|5 3 8|3 5 8|
+.table
+|=Вход=||=Изход=|
+|:5 3 8:||:3 5 8:|
### Задача 8 - Календар
От входа получавате число от 1 до 12: номера на месеца.
Трябва да изкарате името на месеца, където 1 съответства на "January", 2 на "February" и так. нат.
-Моля използвате `switch` конструкция.
+Моля използвате `[switch]` конструкция.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|1 |January|
-|10 |October|
+.table
+|=Вход=||=Изход=|
+|:1 :||:January:|
+|:10 :||:October:|
### Задача 9 - Монети
@@ -166,17 +167,17 @@ GitHub classroom: [classroom.github.com/a/Bi5dhwW7](https://classroom.github.com
Искате да платите използвайки само монети, като целта е да използвате възможно най-големите стойности на монети, възможно най-много (тоест ситуацията в която трябва да носите един милион монети по една стотинка не трябва да е възможност).
Изкарайте двойки "монета бройка", като работите с монети от по 50 стотинки, 20 стотинки, 10 стотинки, 5 стотинки, 1 стотинка.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|12.0|0.5 24 0.2 0 0.1 0 0.05 0 0.01 0|
-|3.37|0.5 6 0.2 1 0.1 1 0.05 1 0.01 2|
+.table
+|=Вход=||=Изход=|
+|:12.0:||:0.5 24 0.2 0 0.1 0 0.05 0 0.01 0:|
+|:3.37:||:0.5 6 0.2 1 0.1 1 0.05 1 0.01 2:|
### Задача 10 - ILS
При кацане, един самолет се нужда от информация дали е точно приравнен със средата на пистата, особено когато видимостта е занижена.
-Една система за тази цел се нарича [ILS](https://www.pilotscafe.com/Understanding-ILS/), но ние ще разгледаме нейния компонент, [the localizer](https://en.wikipedia.org/wiki/Instrument_landing_system_localizer): в края на пистата големи предаватели излъчват различни радио сигнали в двете половини на пистата.
+Една система за тази цел се нарича [url https://www.pilotscafe.com/Understanding-ILS/ ILS], но ние ще разгледаме нейния компонент, [url https://en.wikipedia.org/wiki/Instrument_landing_system_localizer the localizer]: в края на пистата големи предаватели излъчват различни радио сигнали в двете половини на пистата.
Ефектът е като на стерео тон колони, когато самолетът е в ляво от пистата, той приема сигнала от лявата част на пистата по-силно от този за дясната, както ако си доближиш ухото до лявата тон колона, ти ще чуваш нейния звук по-силно от дясната.
@@ -185,22 +186,22 @@ GitHub classroom: [classroom.github.com/a/Bi5dhwW7](https://classroom.github.com
Спрямо техните стойности, трябва да върнете "Turn right" ако самолетът е в ляво от пистата (ако XXX е по-голямо от YYY) и "Turn left" ако самолетът е в дясно.
Допълнително, понеже не е нужно самолетът да се намира перфектно в средата на пистата, зачитаме че ако разликата между двата интензитета е по-малка от 4, тогава самолетът е правилно подравнен и връщаме "Follow heading".
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|045093|Turn left|
-|100090|Turn right|
-|050053|Follow heading|
+.table
+|=Вход=||=Изход=|
+|:045093:||:Turn left:|
+|:100090:||:Turn right:|
+|:050053:||:Follow heading:|
### Задача 11 - GPS
-*В тази задача има много "теория", иначе самия код е малък и лесен.*
+*[В тази задача има много "теория", иначе самия код е малък и лесен.]*
Кондензирайки възможно най-много, ще обясня как работи GPS.
На земята имаме специални методи, чрез които можем да определим позицията на всеки сателит, обаче обратното, определянето на позицията чрез сателит, става с помощта на супер прецизни часовници и малко математика.
-Понеже радио комуникацията е със скоростта на светлината, можем лесно да определим разстояния между сателит и дадена точка, считайки колко време е отнело на сателита да върне отговор (припомням формулата `s = v * t`, или `разстояние = скорост * време`).
+Понеже радио комуникацията е със скоростта на светлината, можем лесно да определим разстояния между сателит и дадена точка, считайки колко време е отнело на сателита да върне отговор (припомням формулата `[s = v * t]`, или `[разстояние = скорост * време]`).
Обаче, така получаваме само разстоянието, това не е достатъчно за да определим точната позиция, понеже има много възможни точки на земята, които да са на това разстояние.
Решението на проблема, е че просто вземаш разстоянието от няколко сателита, твоята позиция се намира в общата точка между всички възможни области.
@@ -213,9 +214,9 @@ GitHub classroom: [classroom.github.com/a/Bi5dhwW7](https://classroom.github.com
От математика, ако знаем разстоянието на нашия приятел към трети различен човек, трите кръга върху картата ще се пресичат в само една точка, а именно позицията на нашия приятел.
В три измерения, правим същото, обаче със сфери, и ни трябват четири сателита.
-Понеже математиката в две и три измерения е малко множко, ще разгледаме всичко едноизмерно, в [Lineland](https://en.wikipedia.org/wiki/Flatland).
+Понеже математиката в две и три измерения е малко множко, ще разгледаме всичко едноизмерно, в [url https://en.wikipedia.org/wiki/Flatland Lineland].
-<br>
+\n
Разработваме (сериозно опростена) GPS система, като работим с едноизмерни координати, тоест позицията на всичко се определя с по едно число.
Изпращаме съобщение към два сателита по едно и също време, и получаваме отговор (какво е съобщението и отговор не е важно, интересува ни само времето).
@@ -226,8 +227,8 @@ GitHub classroom: [classroom.github.com/a/Bi5dhwW7](https://classroom.github.com
Накрая получавате още две числа, пак координата и време, но за втория сателит.
Изкарайте къде се намираме ние, като нека скоростта на светлината да бъде 29 метра в милисекунда.
-**Пример**
+=[Пример]=
-|Вход|Изход|
-|----|-----|
-|18 -100 22 132 30|-42|
+.table
+|=Вход=||=Изход=|
+|:18 -100 22 132 30:||:-42:|
diff --git a/src/teaching/upp-2023/week2/revision.md b/src/teaching/upp-2023/week2/revision.du
index 73e897f..be27064 100644
--- a/src/teaching/upp-2023/week2/revision.md
+++ b/src/teaching/upp-2023/week2/revision.du
@@ -1,142 +1,124 @@
# Преговор - УПП, Седмица 2, 13.10.2023
-&.presentation
+\n
-&[title
+[$presentation-controller]
-# Конвертиране на данни, побитови оператори, условни оператори
-
-&]
+:title_slide
+# Конвертиране на данни, побитови оператори, условни оператори
-&[slide
+:slide
## Конвертиране на данни
-&.br3
+[$br3]
+:unordered
- Неявно (скрито, експлицитно): компилаторът сам се досеща да промени типа
```cpp
int a = 5;
double b = a;
- ```
- Явно (изрично, експлицитно): казваме как типът да се конвертира
```cpp
double a = 5.7, b = 3.42;
int m = (int)a + (int)b;
- ```
-
-&]
-&[slide
+:slide
-&.br5
+[$br5]
+:unordered
- Със загуба на информация (от по-голям тип в по-малък)
-
+
```cpp
double a = 5.8371;
int b = a;
- ```
- Без загуба на информация (от по-малък тип в по-голям)
```cpp
int a = 1000;
long b = a;
- ```
-
-&]
-&[slide
+:slide
## Побитови оператори
-Първо ще ги погледнем чисто теоретично.
+.p Първо ще ги погледнем чисто теоретично.
-**Внимавайте, те са различни от логическите оператори!**
+.p =[Внимавайте, те са различни от логическите оператори!]=
-**Означавам побитовите числа с водеща буква "b"!**
-Тоест, числото `b1001` е двоичното число `1001`, което е десетичното число `9`.
+.p =[Означавам побитовите числа с водеща буква "b"!]=
+Тоест, числото `[b1001]` е двоичното число `[1001]`, което е десетичното число `[9]`.
-&.br3
+[$br3]
+
+:unordered
+- Отрицание/негация, `[~]`: обръща 0 в 1 и 1 в 0
-- Отрицание/негация, `~`: обръща 0 в 1 и 1 в 0
-
```
~ b0010 = b1101
- ```
-&]
+:slide
+:unordered
+- Побитово "и", `[&]`: за два бита, ако и двете са 1, връща 1, иначе връща 0
-&[slide
-
-- Побитово "и", `&`: за два бита, ако и двете са 1, връща 1, иначе връща 0
-
```
3 & 5 = 1
b0011 & b0101 = b0001
- ```
-- Побитово "или", `|`: за два бита, ако и двете са 0, връща 0, иначе връща 1
+- Побитово "или", `[|]`: за два бита, ако и двете са 0, връща 0, иначе връща 1
```
3 | 5 = 7
b0011 | b0101 = b0111
- ```
-- Изключващо "или", `^`: ако само един от двата бита е 1, връща 1, иначе връща 0
+- Изключващо "или", `[^]`: ако само един от двата бита е 1, връща 1, иначе връща 0
```
3 ^ 5 = 6
b0011 ^ b0101 = b0110
- ```
-
-&]
-&[middle27
-
-- Побитово отместване на ляво, `<<`: отмества всеки бит с n позиции на ляво
+:middle_slide27
+:unordered
+- Побитово отместване на ляво, `[<<]`: отмества всеки бит с n позиции на ляво\n
Винаги "запълва" с нули (няма разлика между логическо и аритметично ляво отместване)
```
b1010 << 1 = b0100
b0001 << 3 = b1000
- ```
-
+
(приемаме, че типа данни съхранява само 4 бита данни)
-- Побитово отместване на дясно, `>>`: отмества всеки бит с n позиции на дясно
- При аритметичното отместване, дупките се запълват с предходната стойност на старшия бит
- При логическото отместване, винаги запълваме с 0
+- Побитово отместване на дясно, `[>>]`: отмества всеки бит с n позиции на дясно\n
+ При аритметичното отместване, дупките се запълват с предходната стойност на старшия бит\n
+ При логическото отместване, винаги запълваме с 0\n
В C++ има един оператор, дали е аритметическо или логическо се определя от типа
```
b1000 >> 1 = b0100 или пък b1100
b1010 >> 3 = b0001 или пък b1111
- ```
-
-&]
-&[middle
+:middle_slide
Примери с код:
-```cpp
+:code_cpp
int a = 3, b = 5;
int n1 = ~ a; // -4
@@ -154,85 +136,72 @@ int r2 = b >> 2; // 1
int r3 = -b >> 1; // -3
int r4 = (unsigned int)b >> 1; // 2
int r5 = (unsigned int)-b >> 1; // 2147483645
-```
-
-&]
-
-&[slide
+:slide
## Логически оператори
+.p
Много приличат на побитовите, обаче побитовите работят върху битове, докато логическите работят върху bool.
+[$br4]
-&.br4
-
-- `!`: обръща `true` във `false` и обратно
+:unordered
+- `[!]`: обръща `[true]` във `[false]` и обратно
```cpp
! true // false
! false // true
- ```
-&]
-
-&[middle
-
-- `&&`: "логическо и", ако и двете стойности са `true`, тогава и резултатът е `true`
+:middle_slide
+:unordered
+- `[&&]`: "логическо и", ако и двете стойности са `[true]`, тогава и резултатът е `[true]`
```cpp
true && true // true
false && true // false
false && false // false
- ```
-- `||`: "логическо или", само ако и двете са `false`, тогава е `false`
+- `[||]`: "логическо или", само ако и двете са `[false]`, тогава е `[false]`
```cpp
true || true // true
false || true // true
false || false // false
- ```
-
-&]
-&[slide
+:slide
## Условни конструкции
-- `if`: приема булева стойност, ако е `true`, изпълнява кода в къдравите скоби, ако е `false` ги пропуска
+:unordered
+- `[if]`: приема булева стойност, ако е `[true]`, изпълнява кода в къдравите скоби, ако е `[false]` ги пропуска
```cpp
if (expression) {
dosomething;
}
dootherthing;
- ```
- `expression` се конвертира към типа `bool`
+ `[expression]` се конвертира към типа `[bool]`\n
- Ако в къдравите скоби имаме един израз (тоест е само един ред код, завършващ на `;`) можем да ги пропуснем.
+ Ако в къдравите скоби имаме един израз (тоест е само един ред код, завършващ на `[;]`) можем да ги пропуснем.
```cpp
if (expression) dosomething;
dootherthing;
- ```
-
-&]
-&[middle25
+:middle_slide25
+:unordered
+- `[if-else]`: работи като `[if]`, обаче след къдравите скоби добавяме `[else { ... }]`.
-- `if-else`: работи като `if`, обаче след къдравите скоби добавяме `else { ... }`.
-
```cpp
if (expression) {
dothing1;
@@ -241,12 +210,12 @@ int r5 = (unsigned int)-b >> 1; // 2147483645
dothing2;
}
dootherthing;
- ```
-
- Ако `expression` е истина, `dothing1` се изпълнява и `dothing2` се пропуска изцяло.
- Аналогично, ако `expression` е лъжа, `dothing1` се изпуска и `dothing2` се изпълнява.
- Както с `if`, ако `dothing2` е само един израз, можем да пропуснем къдравите скоби
+ .p
+ Ако `[expression]` е истина, `[dothing1]` се изпълнява и `[dothing2]` се пропуска изцяло.
+ Аналогично, ако `[expression]` е лъжа, `[dothing1]` се изпуска и `[dothing2]` се изпълнява.
+
+ .p Както с `[if]`, ако `[dothing2]` е само един израз, можем да пропуснем къдравите скоби
```cpp
if (expression) {
@@ -254,14 +223,11 @@ int r5 = (unsigned int)-b >> 1; // 2147483645
}
else dothing2;
dootherthing;
- ```
-
-&]
-&[slide25
-
+:slide25
+:unordered
- благодарение на изпускането на къдрави скоби, можем да пишем
```cpp
@@ -275,10 +241,9 @@ int r5 = (unsigned int)-b >> 1; // 2147483645
else {
doSomethingN;
}
- ```
Това е еквивалентно на:
-
+
```cpp
if (expression1) doSomething1;
else {
@@ -288,57 +253,47 @@ int r5 = (unsigned int)-b >> 1; // 2147483645
else doSomethingN;
}
}
- ```
-&]
-
-&[slide
-
-- `expression` винаги се конвертира до тип `bool` (ако е нужно)
- **Никога не правете такива неща:**
+:slide
+:unordered
+- `[expression]` винаги се конвертира до тип `[bool]` (ако е нужно)\n
+ =[Никога не правете такива неща:]=
```cpp
bool a;
if (expression) a = true;
else a = false;
- ```
```cpp
bool a = false;
if (expression) a = true;
- ```
- Просто правите `bool a = expression;`
+ Просто правите `[bool a = expression;]`
```cpp
bool a;
if (expression) a = false;
else a = true;
- ```
-
- Просто правите `bool a = ! expression;`
-
-&]
+ Просто правите `[bool a = ! expression;]`
-&[slide
+:slide
+:unordered
- Тернарен оператор: ако искате да имате такава условна конструкция като част от израз (който взема стойност) използвате
```cpp
(expression) ? valueA : valueB
- ```
- Ако `expression` е истина, връща се `valueA`, иначе се връща `valueB`
+ Ако `[expression]` е истина, връща се `[valueA]`, иначе се връща `[valueB]`
```cpp
int grade;
std::cin >> grade;
double a = (grade < 300) ? 2.0 : grade / 100.0;
- ```
Има много нисък приоритет, в повечето случаи ще ви се наложи да го оградите в скоби.
@@ -346,15 +301,12 @@ int r5 = (unsigned int)-b >> 1; // 2147483645
int grade;
std::cin >> grade;
std::cout << ((grade < 300) ? 2.0 : grade / 100.0);
- ```
-&]
-
-&[middle27
-
-- `switch`: приема стойност и изпълнява случая, при който стойността съвпада с определената
+:middle_slide27
+:unordered
+- `[switch]`: приема стойност и изпълнява случая, при който стойността съвпада с определената
```cpp
switch (value) {
@@ -362,7 +314,6 @@ int r5 = (unsigned int)-b >> 1; // 2147483645
case valueB: doSomething2; break;
case valueC: doSomething3; break;
}
- ```
Служи като улеснение на синтаксиса:
@@ -370,19 +321,16 @@ int r5 = (unsigned int)-b >> 1; // 2147483645
if (value == valueA) doSomething1;
else if (value == valueB) doSomething2;
else if (value == valueC) doSomething3;
- ```
-
- `otherwise` е като `else`, това е случая когато не съвпада с никоя стойност.
- Може да бъде изпуснат.
-
- Без `break` изпълнението продължава към следващия `case`
-&]
+ .p
+ `[otherwise]` е като `[else]`, това е случая когато не съвпада с никоя стойност.
+ Може да бъде изпуснат.
+ .p Без `[break]` изпълнението продължава към следващия `[case]`
-&[middle
+:middle_slide
```cpp
char characterInput;
@@ -393,6 +341,3 @@ switch(characterInput) {
case 'w': std::cout << "Hello World"; break;
default: std::cout << "Error"; break;
}
-```
-
-&]
diff --git a/src/teaching/upp-2023/week3/index.md b/src/teaching/upp-2023/week3/index.du
index 1e71de4..b2a7f65 100644
--- a/src/teaching/upp-2023/week3/index.md
+++ b/src/teaching/upp-2023/week3/index.du
@@ -1,78 +1,80 @@
# Задачи - УПП, Седмица 3, 20.10.2023
-GitHub classroom: [classroom.github.com/a/JgMSXuCf](https://classroom.github.com/a/JgMSXuCf)
+\n
+
+GitHub classroom: [url https://classroom.github.com/a/JgMSXuCf classroom.github.com/a/JgMSXuCf]
## Тема: цикли
-<br>
+\n
### Задача 1 - Степенуване
-Получавате цяло число `x` и цяло положително число `n`, трябва да върнете `x` на степен `n`-та.
+Получавате цяло число `[x]` и цяло положително число `[n]`, трябва да върнете `[x]` на степен `[n]`-та.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|0 0 |1 |
-|-2 3|-8 |
-|4 1 |4 |
+.table
+|=Вход=||=Изход=|
+|:0 0 :||:1 :|
+|:-2 3:||:-8 :|
+|:4 1 :||:4 :|
### Задача 2 - Progress bar
-Получавате цяло число `x`, което е по-голямо или равно на 1, и на всеки ред трябва да изкарате един "progress bar", чиято дължина се увеличава с всеки изминал ред.
-На практика, този "progress bar" трябва да бъде една права, съставена от знакът `#`, която трябва с всеки изминал ред да се удължава с един знак.
-В началото прогресът е 1 и продължава до `x` включително.
+Получавате цяло число `[x]`, което е по-голямо или равно на 1, и на всеки ред трябва да изкарате един "progress bar", чиято дължина се увеличава с всеки изминал ред.
+На практика, този "progress bar" трябва да бъде една права, съставена от знакът `[#]`, която трябва с всеки изминал ред да се удължава с един знак.
+В началото прогресът е 1 и продължава до `[x]` включително.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|3 |#<br>##<br>###
-|5 |#<br>##<br>###<br>####<br>#####
+.table
+|=Вход=||=Изход=|
+|:3 :||:#\n##\n###:|
+|:5 :||:#\n##\n###\n####\n#####:|
#### Бонус
-Направете дължината на този progress bar фиксирана на 10 знака, и въведеното `x` да определя след колко реда трябва да запълним progress bar-а.
+Направете дължината на този progress bar фиксирана на 10 знака, и въведеното `[x]` да определя след колко реда трябва да запълним progress bar-а.
Този път, прогресът започва от 0.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|1 |##########|
-|2 |#####<br>##########|
-|3 |###<br>######<br>##########|
-|10 |#<br>##<br>###<br>...|
-|20 |<br>#<br>#<br>##<br>##<br>###<br>...|
+.table
+|=Вход=||=Изход=|
+|:1 :||:##########:|
+|:2 :||:#####\n##########:|
+|:3 :||:###\n######\n##########:|
+|:10 :||:#\n##\n###\n...:|
+|:20 :||:\n#\n#\n##\n##\n###\n...:|
### Задача 3 - Endless program with an end
От входа получавате букви, не се знае колко.
На нов ред, за всяка буква, трябва да върнете "letter" ако е латинска буква, "digit" ако е цифра и "other" ако не е нито едно от двете.
-Обаче, буквата `^` има специално значение, когато я получим трябва програмата да свърши изпълнение.
+Обаче, буквата `[^]` има специално значение, когато я получим трябва програмата да свърши изпълнение.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|a 8 ) b ^|letter<br>digit<br>other<br>letter|
+.table
+|=Вход=||=Изход=|
+|:a 8 ) b ^:||:letter\ndigit\nother\nletter:|
### Задача 4 - Premature end
-Ще получите максимум 10 цели числа, трябва (целочислено) да разделите числото `65536` на всяко от въведените числа.
+Ще получите максимум 10 цели числа, трябва (целочислено) да разделите числото `[65536]` на всяко от въведените числа.
Но, когато получите числото 0, веднага трябва да спрете вземане на числа от входа.
Финално, изкарайте резултата от всички тези деления.
-**Упътване:** Използвайте `break`.
+=[Упътване:]= Използвайте `[break]`.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|65536 0|1|
-|2 4 3 0|2730|
-|199 2 2 1 -1 1 3 1 10 1|-2|
+.table
+|=Вход=||=Изход=|
+|:65536 0:||:1:|
+|:2 4 3 0:||:2730:|
+|:199 2 2 1 -1 1 3 1 10 1:||:-2:|
### Задача 5 - Stop test
@@ -80,48 +82,48 @@ GitHub classroom: [classroom.github.com/a/JgMSXuCf](https://classroom.github.com
Получавате букви, незнайно колко.
Трябва да броите колко от тях са малки букви, колко са главни и колко са цифри.
-В момента в който получите `$` трябва да спрете приемане на букви и да изкарате
+В момента в който получите `[$]` трябва да спрете приемане на букви и да изкарате
```
Lowercase: X Uppercase: Y Digit: Z
-```
където X, Y и Z са съответните бройки.
-Обаче, ако получите буква, която не е малка, главна, цифра или `$`, трябва моментално да спрете изпълнението на програмата, без да отпечатвате нищо.
+Обаче, ако получите буква, която не е малка, главна, цифра или `[$]`, трябва моментално да спрете изпълнението на програмата, без да отпечатвате нищо.
-**Упътване:** Използвайте `return`.
+=[Упътване:]= Използвайте `[return]`.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|a b A 9 n 3 $|Lowercase: 3 Uppercase: 1 Digit: 2|
-|J h 8 8 @||
+.table
+|=Вход=||=Изход=|
+|:a b A 9 n 3 $:||:Lowercase: 3 Uppercase: 1 Digit: 2:|
+|:J h 8 8 @:||::|
### Задача 6 - Глупави сметки
От входа получавате букви, това ще са "команди", като при всяка буква трябва да направите различно действие:
-- `s`: след като я получите, трябва да вземете цяло число от входа и да го запазите (първоначалната стойност на числото е 15)
-- `l`: трябва побитово да отместите наляво запазеното число с един бит
-- `r`: трябва побитово да отместите надясно запазеното число с един бит
-- `q`: трябва да запазите сегашното число на втора степен
-- `c`: трябва да запазите сегашното число на трета степен
-- `m`: трябва да запазите сегашното число минус 351
-- `p`: трябва да запазите сегашното число плюс 94
-- `&`: прекратявате програмата
+.bulleted
+- `[s]`: след като я получите, трябва да вземете цяло число от входа и да го запазите (първоначалната стойност на числото е 15)
+- `[l]`: трябва побитово да отместите наляво запазеното число с един бит
+- `[r]`: трябва побитово да отместите надясно запазеното число с един бит
+- `[q]`: трябва да запазите сегашното число на втора степен
+- `[c]`: трябва да запазите сегашното число на трета степен
+- `[m]`: трябва да запазите сегашното число минус 351
+- `[p]`: трябва да запазите сегашното число плюс 94
+- `[&]`: прекратявате програмата
След всяка операция трябва да изкарате сегашната стойност на числото.
-Обаче, ако се въведе буква, за която няма дефинирана операция (не е команда) трябва да изкарате "Invalid command!" и да **не** изкарвате сегашната стойност на числото.
+Обаче, ако се въведе буква, за която няма дефинирана операция (не е команда) трябва да изкарате "Invalid command!" и да =[не]= изкарвате сегашната стойност на числото.
-**Упътване:** Използвайте `switch`, `default` и `continue`.
+=[Упътване:]= Използвайте `[switch]`, `[default]` и `[continue]`.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|l l m q r &|30<br>60<br>-291<br>84681<br>42340|
-|s 34 c p s 2 ^ r &|34<br>39304<br>39398<br>2<br>Invalid command!<br>1|
+.table
+|=Вход=||=Изход=|
+|:l l m q r &:||:30\n60\n-291\n84681\n42340:|
+|:s 34 c p s 2 ^ r &:||:34\n39304\n39398\n2\nInvalid command!\n1:|
### Задача 7 - Безсмислена "тивност"
@@ -131,13 +133,13 @@ Lowercase: X Uppercase: Y Digit: Z
Първоначалната стойност на числото е 3.14159 и трябва в началото да изкарате "Positive".
-**Упътване:** Използвайте `do-while`.
+=[Упътване:]= Използвайте `[do-while]`.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|9.1 -22.0 0|Positive<br>Positive<br>Negative|
+.table
+|=Вход=||=Изход=|
+|:9.1 -22.0 0:||:Positive\nPositive\nNegative:|
### Задача 8 - Дигитален часовник
@@ -145,21 +147,26 @@ Lowercase: X Uppercase: Y Digit: Z
Работите върху софтуер на един дигитален часовник, като ще трябва да запазите сегашния час и минути (които първоначално са "00:00").
Получавате букви (команди), като на всяка трябва да извършите някакво действие:
-- `t` - увеличавате минутите с единица (не забравяйте, че ако времето е било "0:59", трябва да стане "1:00") и изкарвате сегашното време
-- `c` - в зависимост от предишни натискания, прави различни неща:
+:bulleted
+- `[t]` - увеличавате минутите с единица (не забравяйте, че ако времето е било "0:59", трябва да стане "1:00") и изкарвате сегашното време
+- `[c]` - в зависимост от предишни натискания, прави различни неща:
+ .bulleted
- ако преди не е натиснат, влизаме в режим на промяна на часовете, от входа приемаме число което ще бъде новия час и изкарваме сегашното време
- ако вече е натиснат, влизаме в режим на минутите, от входа приемаме число, което ще бъде новата стойност на минутите и изкарваме сегашното време
- ако вече два пъти е бил натиснат, излизаме от режима
- - ако сме в някой от първите два режима и получим `t` преди да излезем, не увеличаваме минутите
-- `f` - променяме изкараното време от 12 часов формат на 24 часов и обратно, като първоначално започваме с 24 часов, и изкарваме сегашното време
- - При 24 часов формат изкарваме "XX:YY", където `XX` е часа и `YY` са минутите
+ - ако сме в някой от първите два режима и получим `[t]` преди да излезем, не увеличаваме минутите
+
+- `[f]` - променяме изкараното време от 12 часов формат на 24 часов и обратно, като първоначално започваме с 24 часов, и изкарваме сегашното време
+ .bulleted
+ - При 24 часов формат изкарваме "XX:YY", където `[XX]` е часа и `[YY]` са минутите
- При 12 часов формат е почти същото "XX:YY ZM" където ZM е PM или AM
-**Примери**
-|Вход|Изход|
-|----|-----|
-|t c 19 t c 3 t c f f f|0:1<br>19:1<br>19:3<br>7:3 PM<br>19:3<br>7:3 PM|
+=[Примери]=
+
+.table
+|=Вход=||=Изход=|
+|:t c 19 t c 3 t c f f f:||:0:1\n19:1\n19:3\n7:3 PM\n19:3\n7:3 PM:|
### Задача 9 - BASIC maze
@@ -167,55 +174,51 @@ Lowercase: X Uppercase: Y Digit: Z
```
10 PRINT CHR$(205.5+RND(1));:GOTO 10
-```
-Задачата е да я пресъздадем, тоест на 20 реда трябва да има по 20 букви, като всяка буква е, на случаен принцип, `/` или `\` .
+Задачата е да я пресъздадем, тоест на 20 реда трябва да има по 20 букви, като всяка буква е, на случаен принцип, `[/]` или `[\\]` .
-**Упътване:** Формално никога не се преподават или изискват случайни стойности, затова ги показвам сега:
+=[Упътване:]= Формално никога не се преподават или изискват случайни стойности, затова ги показвам сега:
Най-отгоре на сорс-файла добавете нужната библиотека:
```cpp
#include <stdlib.h>
#include <ctime>
-```
-След това, в `main`, преди да използвате случайни стойности, трябва да "инициализираме системата":
+След това, в `[main]`, преди да използвате случайни стойности, трябва да "инициализираме системата":
```cpp
srand(time(NULL));
-```
-С функцията `rand()` получавате случайна положителна стойност, може да я ограничите до две стойности с модулно деление, `rand() % 2`.
+С функцията `[rand()]` получавате случайна положителна стойност, може да я ограничите до две стойности с модулно деление, `[rand() % 2]`.
-**Примерен изход** *Нямаме вход, вашия изход няма да изглежда напълно еднакъв*
+=[Примерен изход]= *[Нямаме вход, вашия изход няма да изглежда напълно еднакъв]*
```
-////\/\\////\\/////\
-\\/\\\\\\\/\////\///
-\\\///\\\//\\\/\//\/
-/\/\////\\\//\\\/\\\
-//\/\////\\\\\///\\/
-/\\\\\\/\\/\\\/\///\
-/////\\\\\\/\\/\////
-\//\//\\\///\\\\\\\\
-\\\\//\\////\///\/\\
-\//\//\////////\//\\
-\\///\\//\///\/\/\/\
-///\\\///////\\\\///
-/\\/\\//\///\\/\\\\/
-\///\/\\\/\\\\/\\\\\
-////\/\\/\\/////\/\/
-\\/\\\//\//\\//\\///
-////\\\\/\//\\\/\/\/
-\//\\\/\\\\///\////\
-///\///\\//\\\//\\/\
-\/\/\\\/////\//\\\\/
-```
+////\/\\\\////\\\\/////\
+\\\\/\\\\\\\\\\\\\/\////\///
+\\\\\///\\\\\//\\\\\/\//\/
+/\/\////\\\\\//\\\\\/\\\\\
+//\/\////\\\\\\\\\///\\\\/
+/\\\\\\\\\\\\/\\\\/\\\\\/\///\
+/////\\\\\\\\\\\\/\\\\/\////
+\//\//\\\\\///\\\\\\\\\\\\\\\\
+\\\\\\\\//\\\\////\///\/\\\\
+\//\//\////////\//\\\\
+\\\\///\\\\//\///\/\/\/\
+///\\\\\///////\\\\\\\\///
+/\\\\/\\\\//\///\\\\/\\\\\\\\/
+\///\/\\\\\/\\\\\\\\/\\\\\\\\\
+////\/\\\\/\\\\/////\/\/
+\\\\/\\\\\//\//\\\\//\\\\///
+////\\\\\\\\/\//\\\\\/\/\/
+\//\\\\\/\\\\\\\\///\////\
+///\///\\\\//\\\\\//\\\\/\
+\/\/\\\\\/////\//\\\\\\\\/
### Задача 10 - Елка
-*Решението на тази задача е по-дълго!*
+*[Решението на тази задача е по-дълго!]*
Сега имплементирате кода на една елка.
Елката запазва две числа, първото е "сегашното" число с което правим нормалните операции и "виждаме" на екрана, и второто е отделна памет, в която можем да добавяме и изваждаме числа.
@@ -225,22 +228,23 @@ srand(time(NULL));
Първото въведено число директно става новата стойност на сегашното число.
Буквата е команда, като може да бъде +,-,\*,/, които са обикновените операции с които променяме сегашното число, докато:
-- `a` - добавя сегашното число в отделната памет
-- `s` - изважда сегашното число от тази памет
-- `c` - занулява сегашното число
-- `m` - занулява числото в отделната памет
+.bulleted
+- `[a]` - добавя сегашното число в отделната памет
+- `[s]` - изважда сегашното число от тази памет
+- `[c]` - занулява сегашното число
+- `[m]` - занулява числото в отделната памет
-След `a`, `s` и `m` трябва да изкарате числото в отделната памет, докато след всички други команди трябва да изкарате сегашното число.
+След `[a]`, `[s]` и `[m]` трябва да изкарате числото в отделната памет, докато след всички други команди трябва да изкарате сегашното число.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|5 + 5 * 2 a a - 6 c|10<br>20<br>20<br>40<br>14<br>0|
+.table
+|=Вход=||=Изход=|
+|:5 + 5 * 2 a a - 6 c:||:10\n20\n20\n40\n14\n0:|
## Тема: assert
-<br>
+\n
### Задача 11 - Термостат
@@ -248,12 +252,12 @@ srand(time(NULL));
```
int parseSensor(int s) { return ((((s=(s>>1)&(~0xF617A100))<0x54)?s|0xF01:s&0xCBFF)>>2)-21; }
-```
-Все още не сме учили функции, затова просто пльоснете горното нещо във вашия сорс код, *над* `int main()` и *в* `main` може да я използвате чрез `parseSensor(inputValue)`.
+Все още не сме учили функции, затова просто пльоснете горното нещо във вашия сорс код, *[над]* `[int main()]` и *[в]* `[main]` може да я използвате чрез `[parseSensor(inputValue)]`.
Вашата задача е при определени градуси да връщате съобщение на екрана:
+.bulleted
- между 30 и 40 връщате "Hot"
- между 20 и 29 връщате "Warm"
- между 11 и 19 връщате "Temperate"
@@ -262,7 +266,7 @@ int parseSensor(int s) { return ((((s=(s>>1)&(~0xF617A100))<0x54)?s|0xF01:s&0xCB
Обаче, това не е всичко.
Поглеждате функцията на вашия колега и не сте уверени в нея, обаче нямате документацията за обработка на входа.
-Единственото нещо, което знаете, е че стойностите от функцията не трябва да са извън обхвата -20 и 40, затова използвайте `assert` и проверете/тествайте дали това винаги е вярно.
+Единственото нещо, което знаете, е че стойностите от функцията не трябва да са извън обхвата -20 и 40, затова използвайте `[assert]` и проверете/тествайте дали това винаги е вярно.
Ето стойности с които може да тествате:
@@ -274,13 +278,12 @@ int parseSensor(int s) { return ((((s=(s>>1)&(~0xF617A100))<0x54)?s|0xF01:s&0xCB
-332447576
-332447496
-332447736
-```
На кои стойности функцията на колегата не работи?
-**Примери** *Входът е различен от горепосочените стойности (и при него функцията работи коректно)*
+=[Примери]= *[Входът е различен от горепосочените стойности (и при него функцията работи коректно)]*
-|Вход|Изход|
-|----|-----|
-|-332447376|Warm|
-|-332447536|Cold|
+.table
+|=Вход=||=Изход=|
+|:-332447376:||:Warm:|
+|:-332447536:||:Cold:|
diff --git a/src/teaching/upp-2023/week3/revision.md b/src/teaching/upp-2023/week3/revision.du
index b1dab08..876ed77 100644
--- a/src/teaching/upp-2023/week3/revision.md
+++ b/src/teaching/upp-2023/week3/revision.du
@@ -1,101 +1,94 @@
# Преговор - УПП, Седмица 3, 20.10.2023
-&.presentation
+\n
-&[title35
-
-# Цикли, assert
-
-&]
+[$presentation-controller]
+:title_slide35
+# Цикли, assert
-&[slide25
+:slide25
## Бележки от миналия път
+:unordered
- Видях две груби грешки в предадените решения, първо:
```cpp
bool b;
if (condition) b = true;
- ```
-
- Грешно е, понеже `condition` сам по себе си е от тип bool, с този `if` буквално не правите нищо.
+
+ Грешно е, понеже `[condition]` сам по себе си е от тип bool, с този `[if]` буквално не правите нищо.
Правилния вариант е:
```cpp
bool b = condition;
- ```
Аналогично за:
```cpp
bool b;
if (!condition) b = true;
- ```
правилното е:
```cpp
bool b = !condition;
- ```
-
-&]
-&[middle
-
+:middle_slide
+:unordered
- второ:
```cpp
a >= 48 && a <= 57
- ```
+ .p
Всяка буква действително съответства на определено число, дефинирано от ASCII стандарта.
- Наистина '0' е 48 и '9' е 57, обаче от вас **не** се очаква да помните ASCII таблицата!
+ Наистина '0' е 48 и '9' е 57, обаче от вас =[не]= се очаква да помните ASCII таблицата!
Също, ако не знаеш наизуст кои буква са тези числа, този израз е много неясен.
+ .p
Правилния вариант е просто да направите сравнения с буквите, все пак C++ ги "конвертира" (много грубо казано) към съответните ASCII стойности:
```cpp
a >= '0' && a <= '9'
- ```
-
-&]
-&[slide
+:slide
## С/без загуба на данни
-&.br3
+[$br3]
+.p
Получи се малко разногласие между това, което Ивана ви е казала и това което аз ви казах.
-В края на деня, **конвертиране от int към unsigned int не губи информация!**
+В края на деня, =[конвертиране от int към unsigned int не губи информация!]=
+.p
Цитирайки 4то издание на "The C++ Programming Language" глава 10.5:
-> A conversion is value-preserving if you can convert a value and then convert the result back to it's original type and get the original value
+.quote
+A conversion is value-preserving if you can convert a value and then convert the result back to it's original type and get the original value
Тоест, конвертирания при които не губиш битове, нямаш загуба на данни.
-&]
-
-
-&[slide
+:slide
## 2s compliment
+.p
Интуитивно обяснение на 2s compliment.
Да приемем, че работим с тип данни, при който имаме само 3 бита.
+.p
Как бихме ги използвали, за да представим отрицателните числа?
-Най-лесния начин е да погледнем най-левия (старшия) бит, ако е 0 значи е положително, ако е 1 значи е отрицателно, тоест `010` е 2, докато `110` е -2.
+Най-лесния начин е да погледнем най-левия (старшия) бит, ако е 0 значи е положително, ако е 1 значи е отрицателно, тоест `[010]` е 2, докато `[110]` е -2.
Ако разпишем всичките ни числа:
```
@@ -107,37 +100,32 @@
010 2
001 1
000 0
-```
-
-&]
+:middle_slide
-&[middle
-
+.p
Това работи, обаче имаме един гигантски проблем: събирането не работи!
От математика знаем, че "2 - 1 = 2 + (-1)", тоест би трябвало да можем да съберем побитово 2 и -1 и да получим 1.
Ама,
```
2 + -1 = 010 + 101 = 111 = -3
-```
+.p
Също, знаем, че "(-1) + (-1) = -2", обаче
```
-1 + -1 = 101 + 101 = 1010 имаме overflow, това се съкращава на 010 = 2
-```
+.p
Излиза, че с тази схема не можем да събираме отрицателни числа както събираме положителни (или както събираме побитово).
+.p
Да не говорим, че ние имаме -0, което не ни трябва много.
-&]
-
-
-&[middle
+:middle_slide
Нека да помислим пак, да вземем само положителните:
@@ -145,28 +133,23 @@
011 3
010 2
001 1
-```
Сега, искаме -1 да бъде такова число, различно от досега дефинираните (тоест което има единица в старшия си бит) така че "1 + -1 = 0".
Лесно се досещаме, че ако добавим към "001" числото "111", тогава тяхната сума ще предизвика overflow и резултата ще бъде 0:
```
001 + 111 = 1000 overflow, става 000
-```
Нека тогава "-1 = 111".
-&]
-
-
-&[slide
+:slide
+.p
Правейки същото за "2 + -2", намираме че
```
010 + 110 = 1000 overflow, става 000
-```
Нека тогава "-2 = 110".
За "3 + -3" се досещаме, че "-3 = 101".
@@ -181,66 +164,58 @@
010 2
001 1
000 0
-```
100 не сме го използвали, обаче намерихме отрицателното число за всяко положително.
Да видим как работим с него, побитово "100 + 001 = 101", тоест "x + 1 = -3", следователно x ще бъде -4.
-&]
+:middle_slide
-
-&[middle
-
+.p
Това е идеята на "complements", дефинираме отрицателни числа, така че да използваме едно и също събиране между положителни и отрицателни.
-Още от много старите "калкулатори" ([сумиращи машини](https://en.wikipedia.org/wiki/Adding_machine)), изваждането се е свеждало до събиране на положително и отрицателно число.
+.p
+Още от много старите "калкулатори" ([url https://en.wikipedia.org/wiki/Adding_machine сумиращи машини]), изваждането се е свеждало до събиране на положително и отрицателно число.
-И това е причината защо `~ 2` връща `-3`:
+.p
+И това е причината защо `[~ 2]` връща `[-3]`:
```
~ 00000000000000000000000000000010
──────────────────────────────────
11111111111111111111111111111101
-```
-И затова при `>>` със знаков тип имаме аритметическо отместване:
+И затова при `[>>]` със знаков тип имаме аритметическо отместване:
```
11111111111111111111111111111101 >> 1
─────────────────────────────────────
11111111111111111111111111111110
-```
-
-&]
-
-&[slide
+:slide
## Цикли
-&.br4
+[$br4]
-- `while` цикъл
+:unordered
+- `[while]` цикъл
```cpp
while (условие) {
тяло
}
- ```
- "условие" е булева стойност, като ако е `false` цикъла спира, докато ако е `true` "тяло" се изпълнява и после пак се проверява условие
+ "условие" е булева стойност, като ако е `[false]` цикъла спира, докато ако е `[true]` "тяло" се изпълнява и после пак се проверява условие
-&]
-
-&[middle
+:middle_slide
- Може да си го представите като
- ```cpp
+ :code_cpp
if (условие) {
тяло
}
@@ -248,7 +223,6 @@
спри
}
-
if (условие) {
тяло
}
@@ -256,27 +230,24 @@
спри
}
...
- ```
-&]
-&[slide
-
-- `do-while` цикъл, като `while`, но "тяло" се изпълнява поне един път
+:slide
+:unordered
+- `[do-while]` цикъл, като `[while]`, но "тяло" се изпълнява поне един път
```cpp
do {
тяло
} while (условие);
- ```
Нашият аналог е:
- ```cpp
+ :code_cpp
тяло
-
+
if (условие) {
тяло
}
@@ -284,38 +255,32 @@
спри
}
-
if (условие) {
...
- ```
-
-&]
-&[middle
-- `for` цикъл
+:middle_slide
+:unordered
+- `[for]` цикъл
```cpp
for (инициализация; условие; инкрементация) {
тяло
}
- ```
- "инициализация" се изпълнява само веднъж, преди всичко останало в цикъла
- "условие" се изпълнява преди всяка итерация, като ако е `false` цикъла спира, докато ако е `true` продължава
+ "инициализация" се изпълнява само веднъж, преди всичко останало в цикъла\n
+ "условие" се изпълнява преди всяка итерация, като ако е `[false]` цикъла спира, докато ако е `[true]` продължава\n
"инкрементация" се изпълнява след края на всяка итерация
-&]
-
-&[slide
-
+:slide
+:unordered
- Може да си представяте, че това на практика извършва:
- ```cpp
+ :code_cpp
инициализация
if (условие) {
@@ -334,15 +299,13 @@
спри
}
...
- ```
-
-&]
-&[middle
-- или използвайки `while` цикъл:
+:middle_slide
+:unordered
+- или използвайки `[while]` цикъл:
```cpp
инициализация
@@ -350,48 +313,43 @@
тяло
инкрементация
}
- ```
-&]
-
-&[slide
+:slide
### Ключови думи
-&.br3
-
-- `break`: моментално прекратява изпълнението на цикъла
+[$br3]
- При `for` цикли инкрементацията не се изпълнява след `break`
+:unordered
+- `[break]`: моментално прекратява изпълнението на цикъла
-&.br2
+ .p При `[for]` цикли инкрементацията не се изпълнява след `[break]`
-- `continue`: продължи след края на сегашната итерация; тоест изпълнението на тяло се прекратява и започваме нова итерация
+[$br2]
- При `for` цикли директно отива на инкрементация
+- `[continue]`: продължи след края на сегашната итерация; тоест изпълнението на тяло се прекратява и започваме нова итерация
-&]
+ .p При `[for]` цикли директно отива на инкрементация
-&[slide
+:slide
## Assert
+[$br3]
-&.br3
-
+.p
Понякога е полезно да тестваме нашия код вътре в самия код.
Тоест, искаме на конкретно място в кода да проверим нещо.
```cpp
assert(condition);
-```
-
-Ако `condition` е `true`, нищо не се случва, обаче ако е `false` програмата моментално прекратява изпълнение.
-Използва се повече като програмистки уред, тоест ако програмата спре заради `assert`, това е защото има някаква програмистка грешка.
+.p
+Ако `[condition]` е `[true]`, нищо не се случва, обаче ако е `[false]` програмата моментално прекратява изпълнение.
-&]
+.p
+Използва се повече като програмистки уред, тоест ако програмата спре заради `[assert]`, това е защото има някаква програмистка грешка.
diff --git a/src/teaching/upp-2023/week4/index.md b/src/teaching/upp-2023/week4/index.du
index 0d8093b..0981e84 100644
--- a/src/teaching/upp-2023/week4/index.md
+++ b/src/teaching/upp-2023/week4/index.du
@@ -1,10 +1,12 @@
# Задачи - УПП, Седмица 4, 27.10.2023
-GitHub classroom: [classroom.github.com/a/jqKaO1ny](https://classroom.github.com/a/jqKaO1ny)
+\n
+
+GitHub classroom: [url https://classroom.github.com/a/jqKaO1ny classroom.github.com/a/jqKaO1ny]
## Задача 1 - Числен редактор
-Получавате число `N`, което ще е в обхвата от 1 до 10000000000000000000.
+Получавате число `[N]`, което ще е в обхвата от 1 до 10000000000000000000.
Вашата програма трябва да поддържа няколко операции върху това число, включително копиране на редица от цифри в него и поставянето им в друга част на числото.
Подробните операции ще получите по-късно, и не е нужно да валидирате вход или дали след дадена операция числото се побира в типа данни.
@@ -14,7 +16,7 @@ GitHub classroom: [classroom.github.com/a/jqKaO1ny](https://classroom.github.com
Всичките операции трябва да бъдат отделени във функции.
Затова, и за улеснение, задачата е разделена на стъпки:
-**ВАЖНО:** В решението **НЕ** може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие!
+=[ВАЖНО:]= В решението =[НЕ]= може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие!
### Подточка а) Примитивните функции
@@ -22,71 +24,75 @@ GitHub classroom: [classroom.github.com/a/jqKaO1ny](https://classroom.github.com
Имплементирайте функциите:
-- `get`, която приема число, начален индекс и краен индекс (в този ред)
+:unordered
+- `[get]`, която приема число, начален индекс и краен индекс (в този ред)\n
Тя връща подчислото, което започва от началния и завършва в крайния индекс.
- Пример: `get(481395, 2, 4)` връща `813`
+ .p Пример: `[get(481395, 2, 4)]` връща `[813]`
-- `remove`, която приема число, начален индекс и дължина (в този ред)
+- `[remove]`, която приема число, начален индекс и дължина (в този ред)\n
Връща числото, без "дължина" на брой цифри от началния индекс
- Пример: `remove(481395, 3, 3)` връща `485`
+ .p Пример: `[remove(481395, 3, 3)]` връща `[485]`
-- `insert`, която приема число, начален индекс, дължина и число за вмъкване
- Връща числото, като на началния индекс намираме началото на вмъкнатото число с дължина "дължина"
+- `[insert]`, която приема число, начален индекс, дължина и число за вмъкване\n
+ Връща числото, като на началния индекс намираме началото на вмъкнатото число с дължина "дължина"\n
Ефектът, е че числото се вмъква на дадения индекс, обаче избутва цифрите в ляво от него, вместо тези от дясно.
- Пример: `insert(495, 2, 4, 1001)` връща `4100195`
+ .p Пример: `[insert(495, 2, 4, 1001)]` връща `[4100195]`
+
### Подточка б) Композитните функции
Сега е време да имплементираме съществената логика в задачата.
-Използвайки **само** примитивните функции, имплементирайте функциите:
+Използвайки =[само]= примитивните функции, имплементирайте функциите:
-- `copy`, която приема число, начален индекс, дължина и втори начален индекс
+:unordered
+- `[copy]`, която приема число, начален индекс, дължина и втори начален индекс\n
Връща числото, като от втория начален индекс, следващите "дължина" на брой цифри съвпадат с "дължина" на брой цифри от първия начален индекс
- Пример: `copy(481395, 3, 4, 2)` връща `4139581395`
+ .p Пример: `[copy(481395, 3, 4, 2)]` връща `[4139581395]`
-- `cut`, която приема число, начален индекс, дължина и втори начален индекс
+- `[cut]`, която приема число, начален индекс, дължина и втори начален индекс\n
Връща числото, като "дължина" на брой цифри от (стария) начален индекс са преместени във втория начален индекс
- Пример: `cut(481395, 3, 4, 2)` връща `413958`
+ .p Пример: `[cut(481395, 3, 4, 2)]` връща `[413958]`
-- `replace`, която приема число, начален индекс, дължина и число за замяна
- Връща числото, като "дължина" на брой цифри от начален индекс са заменени с числото за замяна
- Заменените цифри и числото за замяна **може да имат различни дължини**!
+- `[replace]`, която приема число, начален индекс, дължина и число за замяна\n
+ Връща числото, като "дължина" на брой цифри от начален индекс са заменени с числото за замяна\n
+ Заменените цифри и числото за замяна =[може да имат различни дължини]=!
- Пример: `replace(481395, 4, 2, 705)` връща `4817055`
+ .p Пример: `[replace(481395, 4, 2, 705)]` връща `[4817055]`
-- `prepend`, която приема две числа
+- `[prepend]`, която приема две числа\n
Връща долепени второто и първото число
- Пример: `prepend(395, 81)` връща `81395`
+ .p Пример: `[prepend(395, 81)]` връща `[81395]`
-- `append`, която приема две числа
+- `[append]`, която приема две числа\n
Връща долепени първото и второто число
- Пример: `append(395, 81)` връща `39581`
+ .p Пример: `[append(395, 81)]` връща `[39581]`
+
### Подточка в) Вход и изход
Последно, време е да имплементираме интерфейса на програмата.
-Както вече казахме, първия вход е числото `N` с което ще извършим операция.
+Както вече казахме, първия вход е числото `[N]` с което ще извършим операция.
-След това приемаме буква, която определя нашата (композитна) функция, като за всички функции използваме първата буква в името им, освен за `cut`, за която използваме `x`.
-Тоест, `c` означава, че ще "copy"-ваме, `p` че ще "prepend"-ваме, `x` че ще "cut"-ваме и так. нат.
+След това приемаме буква, която определя нашата (композитна) функция, като за всички функции използваме първата буква в името им, освен за `[cut]`, за която използваме `[x]`.
+Тоест, `[c]` означава, че ще "copy"-ваме, `[p]` че ще "prepend"-ваме, `[x]` че ще "cut"-ваме и так. нат.
След като въведем буква, трябва да приемем съответния за дадената функция брой аргументи и да изкараме на екрана резултата от функцията.
-**Примери**
+=[Примери]=
-|Вход|Изход|
-|----|-----|
-|x 8504830028402847111 9 6 7|8504832840280047111|
-|p 8 968824945839039458|9688249458390394588|
-|a 968824945839039458 1|9688249458390394581|
-|r 9938175002843839 1 10 86998385021|86998385021843839|
+.table
+|=Вход=||=Изход=|
+|:x 8504830028402847111 9 6 7:||:8504832840280047111:|
+|:p 8 968824945839039458:||:9688249458390394588:|
+|:a 968824945839039458 1:||:9688249458390394581:|
+|:r 9938175002843839 1 10 86998385021:||:86998385021843839:|
## Задача 2 - Умножение на полиноми
@@ -95,27 +101,25 @@ GitHub classroom: [classroom.github.com/a/jqKaO1ny](https://classroom.github.com
Числото с коефициенти е между 1 и 10000000000000000000.
Пример: първото число е 13, a второто е 3052.
-Побитово `13 = 1101`, тоест ще имаме
+Побитово `[13 = 1101]`, тоест ще имаме
```
x³ * 1 + x² * 1 + x¹ * 0 + x⁰ * 1
-```
След това, от второто получаваме всеки коефициент, става
```
-3 * x³ * 1 + 0 * x² * 1 + 5 * x¹ * 0 + 2 * x⁰ * 1
-```
+3 * x³* 1 + 0 * x² * 1 + 5 * x¹ * 0 + 2 * x⁰ * 1
-Финално, нашия полином, кодиран от числата 13 и 3052 е `3x³ + 2`.
+Финално, нашия полином, кодиран от числата 13 и 3052 е `[3x³ + 2]`.
От входа получавате два полинома, трябва да ги умножите и да изкарате получилия се полином (пак във формата с две числа).
-**ВАЖНО:** В решението **НЕ** може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие!
+=[ВАЖНО:]= В решението =[НЕ]= може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие!
## Задача 3 - Дъската на Зар
-*Името си го измислих, няма връзка с нещо :)*
+*[Името си го измислих, няма връзка с нещо :)]*
Дъската на Зар е една много проста игра.
Имаме два играча, които играят върху квадратна дъска, като на всяка "клетка" има цифра (0 до 9).
@@ -129,7 +133,7 @@ x³ * 1 + x² * 1 + x¹ * 0 + x⁰ * 1
Пример: ако играем с дъска 5х5, намираме се на реда "25486" и позицията на първия играч е първата, тогава ходът му изглежда така (с "V" показваме къде се намира):
-```
+:code
V
25486
Прочита цифрата 2, значи трябва да се премести с две клетки на дясно
@@ -142,7 +146,7 @@ V
25486
Прочита цифрата 8, трябва да се премести с осем клетки на дясно
Обаче редът е твърде къс, премества се с една клетка и на следващия си ход ще се премести със 7 клетки надясно
-```
+
Обаче, правилата между първия и втория играч са малко по-различни.
Първия играч започва от първата клетка на първия ред, докато втория започва от първата клетка, до която първия играч не е бил.
@@ -157,11 +161,11 @@ V
Накрая на играта, трябва да сравните точките на първия и втория играч и да изкарате кой е победил (или дали никой не е).
Един ред може да се представи като цяло число и обработваме ред по ред, без да се връщаме назад.
-Тоест, първо от входа получавате число `N`, което е размера на дъската.
-След това ще получавате `N` числа, всяко с `N` цифри в десетичния си запис, като след получаване на едно число изпълнявате ходовете на всички играчи.
+Тоест, първо от входа получавате число `[N]`, което е размера на дъската.
+След това ще получавате `[N]` числа, всяко с `[N]` цифри в десетичния си запис, като след получаване на едно число изпълнявате ходовете на всички играчи.
-**ВАЖНО:** В решението **НЕ** може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие!
+=[ВАЖНО:]= В решението =[НЕ]= може да изполвате масиви, вектори, ..., както и каквито и да е функции, които не сте написали вие!
-**Упътване:**
+=[Упътване:]=
Лесно се получава, ако занулим цифрите които първия играч е посетил.
Още по-лесно става ако използвате функции от първата задача.
diff --git a/src/teaching/upp-2023/week4/revision.md b/src/teaching/upp-2023/week4/revision.du
index 3650875..c99fbb4 100644
--- a/src/teaching/upp-2023/week4/revision.md
+++ b/src/teaching/upp-2023/week4/revision.du
@@ -1,48 +1,48 @@
# Преговор - УПП, Седмица 4, 27.10.2023
-&.presentation
+[$presentation-controller]
-&[title35
+:title_slide35
# Функции и алгоритмични задачи
-&]
-
-
-&[slide27
+:slide27
## От сега нататък ще направим няколко промени
+:unordered
- Вместо много и лесни задачи ще давам малко и трудни задачи
+ .bulleted
- Контролното наближава, а резултата от задачата на семинара не е добър
- Моето впечатление е, че повечето които имат опит с програмиране нямат много опит с алгоритмични задачи и обратно
- Задачите ще са повече алгоритмични, лесните задачи ще виждате на семинар
+
- Ще изисквам добър стил при писане на код
- - Това означава добре подравнен код, празни символи около оператори **и** свестни имена на променливи
+ .bulleted
+ - Това означава добре подравнен код, празни символи около оператори =[и]= свестни имена на променливи
- Името на променлива не трябва да бъде 150 знака, но трябва да е разбираемо какво съдържа
- - **Без шльокавица!**
+ - =[Без шльокавица!]=
+
- Преговорът ще бъде за вас да си го четете (освен ако не трябва да преподам нещо ново)
-- Ще може да предавате задания след срока!
+- Ще може да предавате задания след срока!\n
Искам да решите колкото се може повече вкъщи.
-&]
-
-*Нещата за 2s compliment се намират и в [преговора на миналата седмица](../week3/revision.html?a), ама го написах след като свърши часа, затова го копирам и тук.*
+*[Нещата за 2s compliment се намират и в [url ../week3/revision.html?a преговора на миналата седмица], ама го написах след като свърши часа, затова го копирам и тук.]*
-
-
-&[slide
+:slide
## 2s compliment
+.p
Интуитивно обяснение на 2s compliment.
Да приемем, че работим с тип данни, при който имаме само 3 бита.
+.p
Как бихме ги използвали, за да представим отрицателните числа?
-Най-лесния начин е да погледнем най-левия (старшия) бит, ако е 0 значи е положително, ако е 1 значи е отрицателно, тоест `010` е 2, докато `110` е -2.
+Най-лесния начин е да погледнем най-левия (старшия) бит, ако е 0 значи е положително, ако е 1 значи е отрицателно, тоест `[010]` е 2, докато `[110]` е -2.
Ако разпишем всичките ни числа:
```
@@ -54,67 +54,61 @@
010 2
001 1
000 0
-```
-
-&]
+:middle_slide
-&[middle
-
+.p
Това работи, обаче имаме един гигантски проблем: събирането не работи!
От математика знаем, че "2 - 1 = 2 + (-1)", тоест би трябвало да можем да съберем побитово 2 и -1 и да получим 1.
Ама,
```
2 + -1 = 010 + 101 = 111 = -3
-```
+.p
Също, знаем, че "(-1) + (-1) = -2", обаче
```
-1 + -1 = 101 + 101 = 1010 имаме overflow, това се съкращава на 010 = 2
-```
+.p
Излиза, че с тази схема не можем да събираме отрицателни числа както събираме положителни (или както събираме побитово).
+.p
Да не говорим, че ние имаме -0, което не ни трябва много.
-&]
-
+:middle_slide
-&[middle
-
+.p
Нека да помислим пак, да вземем само положителните:
```
011 3
010 2
001 1
-```
+.p
Сега, искаме -1 да бъде такова число, различно от досега дефинираните (тоест което има единица в старшия си бит) така че "1 + -1 = 0".
Лесно се досещаме, че ако добавим към "001" числото "111", тогава тяхната сума ще предизвика overflow и резултата ще бъде 0:
```
001 + 111 = 1000 overflow, става 000
-```
+.p
Нека тогава "-1 = 111".
-&]
-
+:slide
-&[slide
-
+.p
Правейки същото за "2 + -2", намираме че
```
010 + 110 = 1000 overflow, става 000
-```
+.p
Нека тогава "-2 = 110".
За "3 + -3" се досещаме, че "-3 = 101".
За сега имаме:
@@ -128,39 +122,34 @@
010 2
001 1
000 0
-```
+.p
100 не сме го използвали, обаче намерихме отрицателното число за всяко положително.
Да видим как работим с него, побитово "100 + 001 = 101", тоест "x + 1 = -3", следователно x ще бъде -4.
-&]
-
+:middle_slide
-&[middle
-
+.p
Това е идеята на "complements", дефинираме отрицателни числа, така че да използваме едно и също събиране между положителни и отрицателни.
-Още от много старите "калкулатори" ([сумиращи машини](https://en.wikipedia.org/wiki/Adding_machine)), изваждането се е свеждало до събиране на положително и отрицателно число.
+.p
+Още от много старите "калкулатори" ([url https://en.wikipedia.org/wiki/Adding_machine сумиращи машини]), изваждането се е свеждало до събиране на положително и отрицателно число.
-И това е причината защо `~ 2` връща `-3`:
+.p
+И това е причината защо `[~ 2]` връща `[-3]`:
```
~ 00000000000000000000000000000010
──────────────────────────────────
11111111111111111111111111111101
-```
-И затова при `>>` със знаков тип имаме аритметическо отместване:
+И затова при `[>>]` със знаков тип имаме аритметическо отместване:
```
11111111111111111111111111111101 >> 1
─────────────────────────────────────
11111111111111111111111111111110
-```
-
-&]
-
## Функции
@@ -172,20 +161,19 @@
<ВЪРНАТ ТИП> име(<АРГУМЕНТИ>) {
тяло
}
-```
-Като `<АРГУМЕНТИ>` са двойки от типа `ТИП ИМЕ`, разделени със запетаи.
-Един вид, аргументите са променливи към `тяло`, които задаваме извън функцията.
+Като `[<АРГУМЕНТИ>]` са двойки от типа `[ТИП ИМЕ]`, разделени със запетаи.
+Един вид, аргументите са променливи към `[тяло]`, които задаваме извън функцията.
-Извикваме функция чрез `име(<СТОЙНОСТИ>)`, като `<СТОЙНОСТИ>` са разделени със запетая и всяка съответства на поредния тип в аргументите на функцията.
-Там, където пишем `име(<СТОЙНОСТИ>)` се "замества" с върнатата стойност от функцията.
+Извикваме функция чрез `[име(<СТОЙНОСТИ>)]`, като `[<СТОЙНОСТИ>]` са разделени със запетая и всяка съответства на поредния тип в аргументите на функцията.
+Там, където пишем `[име(<СТОЙНОСТИ>)]` се "замества" с върнатата стойност от функцията.
-Връщаме стойност като напишем във функцията `return СТОЙНОСТ;`.
+Връщаме стойност като напишем във функцията `[return СТОЙНОСТ;]`.
Една функция трябва да бъде декларирана преди да бъде използвана, тоест кода
-```cpp
-#include <iostream>
+:code_cpp
+#include \<iostream>
int main() {
std::cout << doSomething();
@@ -194,19 +182,18 @@ int main() {
int doSomething() {
...
}
-```
+
Няма да се компилира.
Можем само да декларираме функция, без да я дефинираме (тоест без да и дадем тяло) чрез синтаксиса:
```cpp
<ВЪРНАТ ТИП> име(<АРГУМЕНТИ>);
-```
Тоест горния пример ще работи ако имаме:
-```cpp
-#include <iostream>
+:code_cpp
+#include \<iostream>
int doSomething();
@@ -217,4 +204,3 @@ int main() {
int doSomething() {
...
}
-```
diff --git a/src/teaching/upp-2023/week5/index.md b/src/teaching/upp-2023/week5/index.du
index 57f9239..0695f17 100644
--- a/src/teaching/upp-2023/week5/index.md
+++ b/src/teaching/upp-2023/week5/index.du
@@ -1,6 +1,8 @@
# Задачи - УПП, Седмица 5, 03.11.2023
-GitHub classroom: [classroom.github.com/a/3KoIQ71H](https://classroom.github.com/a/3KoIQ71H)
+\n
+
+GitHub classroom: [url https://classroom.github.com/a/3KoIQ71H classroom.github.com/a/3KoIQ71H]
## Задача 1
@@ -8,13 +10,13 @@ GitHub classroom: [classroom.github.com/a/3KoIQ71H](https://classroom.github.com
Направете функция, която получава два двуизмерни координата, покомпонентно ги сумира и връща резултатните координати.
Няма как функцията да върне две стойности, затова добаваете оше два аргумента, които да са указатели към променливи в които да запазим сумираните координати.
-От входа получавате два координата, след това връщате тяхната покомпонентна сума **използвайки функцията**.
+От входа получавате два координата, след това връщате тяхната покомпонентна сума =[използвайки функцията]=.
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-|8.0 1.5 -1.9 -100.741|6.1 -99.241|
+.table
+|=Вход=||=Изход=|
+|:8.0 1.5 -1.9 -100.741:||:6.1 -99.241:|
## Задача 2
@@ -22,62 +24,62 @@ GitHub classroom: [classroom.github.com/a/3KoIQ71H](https://classroom.github.com
Трябва да поддържате операциите събиране и изваждане между две такива числа.
Първо ще получите 30 цифри, които отговарят на първото числа, после още 30 цифри, които отговарят на втрото число и накрая ще получите знак.
-Ако знака е `+`, трябва да ги съберете и да изкарате резултата на екрана.
-Ако знака е `-`, трябва да ги извадите и да изкарате резултата на екрана.
+Ако знака е `[+]`, трябва да ги съберете и да изкарате резултата на екрана.
+Ако знака е `[-]`, трябва да ги извадите и да изкарате резултата на екрана.
При изкарване трябва да следвате "нормалните" правила: цифрите са долепени и водещите нули не се пишат.
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-|0 0 0 0 0 0 4 6 9 2 7 5 2 2 3 3 4 2 9 5 7 4 2 3 3 7 1 9 2 6<br>0 0 0 0 0 0 0 0 0 9 3 4 2 1 6 0 3 3 5 5 1 0 1 3 0 0 0 6 3 2<br>+|470209439376508436372558|
-|0 0 0 0 0 0 4 6 9 2 7 5 2 2 3 3 4 2 9 5 7 4 2 3 3 7 1 9 2 6<br>0 0 0 0 0 0 0 0 0 9 3 4 2 1 6 0 3 3 5 5 1 0 1 3 0 0 0 6 3 2<br>-|468341007309406410371294|
-|9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9<br>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<br>+|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<br>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<br>-|999999999999999999999999999999|
+.table
+|=Вход=||=Изход=|
+|:0 0 0 0 0 0 4 6 9 2 7 5 2 2 3 3 4 2 9 5 7 4 2 3 3 7 1 9 2 6\n0 0 0 0 0 0 0 0 0 9 3 4 2 1 6 0 3 3 5 5 1 0 1 3 0 0 0 6 3 2\n+:||:470209439376508436372558:|
+|:0 0 0 0 0 0 4 6 9 2 7 5 2 2 3 3 4 2 9 5 7 4 2 3 3 7 1 9 2 6\n0 0 0 0 0 0 0 0 0 9 3 4 2 1 6 0 3 3 5 5 1 0 1 3 0 0 0 6 3 2\n-:||:468341007309406410371294:|
+|:9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9\n0 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\n+:||: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\n0 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\n-:||:999999999999999999999999999999:|
## Задача 3
Получавате редица цифри.
Ако имаме поне 3 повтарящи се цифри една след друга, можем да ги премахнем.
-Тоест редицата `0 3 1 2 2 2 4 7` може да стане `0 3 1 4 7`.
+Тоест редицата `[0 3 1 2 2 2 4 7]` може да стане `[0 3 1 4 7]`.
След едно премахване, трябва да можем после да премахнем новопоявило се премахване.
-Тоест редицата `5 1 3 3 3 3 1 1 1 9 2` първо става `5 1 1 1 1 9 2` и след това `5 9 2`.
+Тоест редицата `[5 1 3 3 3 3 1 1 1 9 2]` първо става `[5 1 1 1 1 9 2]` и след това `[5 9 2]`.
Не е нужно да гледате напред за възможно най-много премахване.
-Тоест в случая `8 1 3 4 4 4 5 5 5 5 4 4` не се очаква да предвидите, че ако първо премахнете 5-те, после ще може да премахнете всички 4ки.
+Тоест в случая `[8 1 3 4 4 4 5 5 5 5 4 4]` не се очаква да предвидите, че ако първо премахнете 5-те, после ще може да премахнете всички 4ки.
Премахвате първата валидна повтаряща се редица, връщате се малко назад, поглеждате дали някоя нова редица не се е появила, премахвате нея или отивате на следващата.
-От входа първо получавате броя `N` на цифрите в редицата, като `N` е между 1 и 40.
-След това получавате `N` на брой цифри и накрая връщате редицата с премахнати повтаряния.
+От входа първо получавате броя `[N]` на цифрите в редицата, като `[N]` е между 1 и 40.
+След това получавате `[N]` на брой цифри и накрая връщате редицата с премахнати повтаряния.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|16<br>1 3 8 8 7 5 5 5 5 7 7 8 8 8 8 6|1 3 6|
-|40<br>7 1 5 2 1 7 2 1 2 1 7 2 6 1 6 7 6 9 7 3 8 6 6 5 1 2 7 4 6 8 3 8 2 2 6 9 4 2 6 5|7 1 5 2 1 7 2 1 2 1 7 2 6 1 6 7 6 9 7 3 8 6 6 5 1 2 7 4 6 8 3 8 2 2 6 9 4 2 6 5|
+.table
+|=Вход=||=Изход=|
+|:16\n1 3 8 8 7 5 5 5 5 7 7 8 8 8 8 6:||:1 3 6:|
+|:40\n7 1 5 2 1 7 2 1 2 1 7 2 6 1 6 7 6 9 7 3 8 6 6 5 1 2 7 4 6 8 3 8 2 2 6 9 4 2 6 5:||:7 1 5 2 1 7 2 1 2 1 7 2 6 1 6 7 6 9 7 3 8 6 6 5 1 2 7 4 6 8 3 8 2 2 6 9 4 2 6 5:|
## Задача 4
Получавате редица числа.
Всяко число е индекс към друго число в редицата (индексите започва от 0).
-Започвайки от всяка цифра, проследяваме всички "скоци", тоест ако имаме `1 3 0 2` и започваме от индекс 0, тогава от него скачаме на индекс 1, от него на индекс 3, от него на индекс 2 и от него се връщаме в индекс 0.
-Докато прескачаме не може да посетим вече посетен индекс, тоест ако имаме `1 3 0 1`, от 0 отиваме в 1, от 1 в 3 и от 3 в 1, обаче вече сме посетили индекс 1, така че спираме да скачаме.
+Започвайки от всяка цифра, проследяваме всички "скоци", тоест ако имаме `[1 3 0 2]` и започваме от индекс 0, тогава от него скачаме на индекс 1, от него на индекс 3, от него на индекс 2 и от него се връщаме в индекс 0.
+Докато прескачаме не може да посетим вече посетен индекс, тоест ако имаме `[1 3 0 1]`, от 0 отиваме в 1, от 1 в 3 и от 3 в 1, обаче вече сме посетили индекс 1, така че спираме да скачаме.
Търси се колко най-много скока можем да направим, започайки от който и да е индекс.
Ако има няколко индекса с максималния брой скоци, връщаме само първия.
-Получавате от входа брой `N` на числата (индексите), като `N` е между 1 и 30, след това получавате толкова на брой числа (между 0 и N-1) и накрая връщате при кой начален индекс имаме най-много скока и колко са тези скоци.
+Получавате от входа брой `[N]` на числата (индексите), като `[N]` е между 1 и 30, след това получавате толкова на брой числа (между 0 и N-1) и накрая връщате при кой начален индекс имаме най-много скока и колко са тези скоци.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|9<br>4 6 2 1 5 0 0 3 8|7 7|
-|20<br>16 10 6 11 1 1 9 12 15 17 0 0 9 15 8 16 7 0 16 18|4 9|
-|30<br>0 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|0 1|
-|30<br>29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0|0 2|
+.table
+|=Вход=||=Изход=|
+|:9\n4 6 2 1 5 0 0 3 8:||:7 7:|
+|:20\n16 10 6 11 1 1 9 12 15 17 0 0 9 15 8 16 7 0 16 18:||:4 9:|
+|:30\n0 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:||:0 1:|
+|:30\n29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0:||:0 2:|
## Задача 5
@@ -89,12 +91,13 @@ sim картите са типове smart-card, това означава че
### а) валидационни функции
-- `isUnblockCode`, приема буква и връща дали е отблокиращ код
+.bulleted
+- `[isUnblockCode]`, приема буква и връща дали е отблокиращ код\n
Само главни, малки и цифри са валидни отблокиращи кодове
-- `isPhoneNumber`, приема число (10 цифрено) и поглежда най-левите 3 цифри
+- `[isPhoneNumber]`, приема число (10 цифрено) и поглежда най-левите 3 цифри\n
Те трябва да са валиден код на държава.
Нужно е да приемате поне кодовете за България (359) и за Франция (033).
- Ако искате може и други да приемате, пълен списък има [тук](https://en.wikipedia.org/wiki/List_of_country_calling_codes#Alphabetical_order).
+ Ако искате може и други да приемате, пълен списък има [url https://en.wikipedia.org/wiki/List_of_country_calling_codes#Alphabetical_order тук].
### б) вход и команди
@@ -102,19 +105,20 @@ sim картите са типове smart-card, това означава че
Ако отблокиращия е в невалиден формат, връщате съответно съобщение за грешка и спирате програмата.
След това получавате команди, всяка команда се определя с букви и още някакви стойности.
-**Всяка команда трябва да бъде изкарана в отделна функция!**
+=[Всяка команда трябва да бъде изкарана в отделна функция!]=
-- `v` - пробвате се да се "логнете" в сим картата.
+.bulleted
+- `[v]` - пробвате се да се "логнете" в сим картата.
След буквата получавате и едно число, което е въведения ПИН код.
Ако е правилен, следващите 5 команди, които изискват упълномощение могат да се изпълнят.
След 5те команди, упълномощението се "премахва" и трябва пак да се въведе ПИН код при упълномощени команди.
Ако е грешен, общо има 3 опита, и след тях картата се блокира.
-- `u` - отпблокиране на блокирана карта.
+- `[u]` - отпблокиране на блокирана карта.
След буквата получавате отблокиращ код и нов ПИН код.
Ако отблокиращия код е в грешен формат или е грешната стойност, премахваме един опит.
При 10 неуспешни опита, изкарвате съобщение, че картата е перманентно блокирана и спирате програмата.
Ако е успешно отблокирана, тогава променяте ПИН кода и сте се "логнали" автоматично.
-- `i` - връща информация за СИМ картата, това са общо броя команди които са изпълнявани до сега
+- `[i]` - връща информация за СИМ картата, това са общо броя команди които са изпълнявани до сега
### в) команди с упълномощение
@@ -123,15 +127,16 @@ sim картите са типове smart-card, това означава че
Ако някоя търсена стойност е невалидна или не съществува, връщате съответната грешка.
-- `c` - променя ПИН код.
+.bulleted
+- `[c]` - променя ПИН код.
Получавате нов ПИН код и го променяте.
-- `a` - добавя контакт в паметта, общо може да имаме 10 контакта.
+- `[a]` - добавя контакт в паметта, общо може да имаме 10 контакта.
Всеки контакт се определя с буква, неговото "име", и 10-цифрен мобилен номер.
Приема допълнително неговото име и тел. номер.
Добавяме контакта в първото незаето място, а ако всички са заети, връщаме съобщение с грешка.
-- `r` - приема и още една буква (име), връща телефонния номер на съответния контакт.
+- `[r]` - приема и още една буква (име), връща телефонния номер на съответния контакт.
Ако той не съществува или телефонния номер е невалиден, връщаме съответно съобщение с грешка.
-- `d` - приема и още една буква (име), изтрива съответния контакт.
+- `[d]` - приема и още една буква (име), изтрива съответния контакт.
Ако той не съществува, връщаме съответно съобщение с грешка.
-- `o` - променя контакт, приема допълнително две имена на контакти и телефонен номер.
+- `[o]` - променя контакт, приема допълнително две имена на контакти и телефонен номер.
Променя контакта с първото име, като второто име и тел. номер стават новите му стойности.
diff --git a/src/teaching/upp-2023/week5/revision.md b/src/teaching/upp-2023/week5/revision.du
index 4356848..017b2a1 100644
--- a/src/teaching/upp-2023/week5/revision.md
+++ b/src/teaching/upp-2023/week5/revision.du
@@ -6,45 +6,40 @@
За да можем да определим къде дадено нещо е запазено, всяка клетка в паметта си има "адрес".
Адресът е едно цяло положително число.
-Можем да вземем адреса на дадена променлива с оператора `&`:
+Можем да вземем адреса на дадена променлива с оператора `[&]`:
```cpp
double a = 3.14159;
std::cout << (&a) << std::endl;
-```
-Tази програма ще върне адресът на променлива `a`.
+Tази програма ще върне адресът на променлива `[a]`.
След като имаме адрес, бихме искали да работим със стойността на този адрес.
-Това го правим с дерефериращия оператор `*`:
+Това го правим с дерефериращия оператор `[*]`:
```cpp
double a = 3.14159;
std::cout << (*(&a)) << std::endl;
-```
-Тази програма връща стойността на адреса на променлива `a`.
+Тази програма връща стойността на адреса на променлива `[a]`.
Променливи, които съдържат адреси се наричат указатели.
Синтаксисът на един указател е:
```cpp
<ТИП НА СТОЙНОСТТА> * <ИМЕ> = <АДРЕС>;
-```
Тоест примерно:
```cpp
double a = 3.14159;
double * pointer = &a;
-```
Звездата може да бъде долепена до типа или името на указателя:
```cpp
double* pointer1 = &a;
double *pointer2 = &a;
-```
## Масиви
@@ -59,25 +54,22 @@ double *pointer2 = &a;
<ТИП> <ИМЕ>[N]; // само ги дефинираме, обаче не ги инициализираме
<ТИП> <ИМЕ>[N] = { <СТОЙНОСТ> }; // дефинира всички N елементи със <СТОЙНОСТ>
<ТИП> <ИМЕ>[N] = { <СТОЙНОСТ 1>, <СТОЙНОСТ 2>, ..., <СТОЙНОСТ M> }; // където M <= N
-```
-Самото `<ИМЕ>` е указател, така че може да достъпваме стойности чрез указателна аритметика:
+Самото `[<ИМЕ>]` е указател, така че може да достъпваме стойности чрез указателна аритметика:
```cpp
int arr[2] = { 83, 18 };
std::cout << (*(arr + 1)) << std::endl;
-```
-Връща втория елемент, `18`.
+Връща втория елемент, `[18]`.
Или чрез по-приятния синтаксис с квадратни скоби:
```cpp
int arr[2] = { 83, 18 };
std::cout << (arr[1]) << std::endl;
-```
-Двете неща са еквивалентни, тоест `name[x]` е еквивалентно на `*(name + x)`.
+Двете неща са еквивалентни, тоест `[name[x]]` е еквивалентно на `[*(name + x)]`.
Когато един масив съдържа букви, наричаме го "низ" (string).
-За да не трябва да следим дължината на един низ в друга променлива и да трябва да я подаваме, винаги завършваме нашия низ на "терминаращата нула" - `'\0'`.
+За да не трябва да следим дължината на един низ в друга променлива и да трябва да я подаваме, винаги завършваме нашия низ на "терминаращата нула" - `['\0']`.
diff --git a/src/teaching/upp-2023/week6/index.md b/src/teaching/upp-2023/week6/index.du
index 34c3f53..4daa76b 100644
--- a/src/teaching/upp-2023/week6/index.md
+++ b/src/teaching/upp-2023/week6/index.du
@@ -1,6 +1,8 @@
# Задачи - УПП, Седмица 6, 10.11.2023
-GitHub classroom: [classroom.github.com/a/BBLlWMOy](https://classroom.github.com/a/BBLlWMOy)
+\n
+
+GitHub classroom: [url https://classroom.github.com/a/BBLlWMOy classroom.github.com/a/BBLlWMOy]
## Задача 1
@@ -10,31 +12,31 @@ GitHub classroom: [classroom.github.com/a/BBLlWMOy](https://classroom.github.com
N и M са между 1 и 60.
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-|4 3<br>8 1 9<br>0 3 0<br>4 7 5<br>6 9 0<br>9 5 7 3<br>6 7 2 0<br>1 3 3 7<br>| 87 74 85 87<br>18 21 6 0<br>83 84 57 47<br>108 93 60 18<br>|
+.table
+|=Вход=||=Изход=|
+|:4 3\n8 1 9\n0 3 0\n4 7 5\n6 9 0\n9 5 7 3\n6 7 2 0\n1 3 3 7\n:||: 87 74 85 87\n18 21 6 0\n83 84 57 47\n108 93 60 18\n:|
## Задача 2
Разглеждаме числатата от 0 до N.
За всяко число знаем колко интервала го включват (покриват).
-Тоест в `0 1 1 0` означава, че 0 интервала "покриват" числото 0, един интервал покрива числото 1, един интервал покрива числото 2 и 0 покриват числото 3.
+Тоест в `[0 1 1 0]` означава, че 0 интервала "покриват" числото 0, един интервал покрива числото 1, един интервал покрива числото 2 и 0 покриват числото 3.
Търси се колко различни интервала имаме.
Не различаваме между два долепени интервала и един дълъг интервал.
От входа получаввате N (от 1 до 30), и след това N на брой числа: броя покриващи интервали за всички числа от 0 до N-1.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|5<br>1 1 0 1 1|2|
-|5<br>1 2 1 2 1|3|
-|5<br>9 5 2 9 0|16|
-|11<br>1 1 2 3 2 2 4 2 1 1 1|5|
+.table
+|=Вход=||=Изход=|
+|:5\n1 1 0 1 1:||:2:|
+|:5\n1 2 1 2 1:||:3:|
+|:5\n9 5 2 9 0:||:16:|
+|:11\n1 1 2 3 2 2 4 2 1 1 1:||:5:|
## Задача 3
@@ -47,19 +49,19 @@ N и M са между 1 и 60.
В случай, че игралното поле се запълни и никой не е спечелил, след последното му изкарване трябва да върнете "Draw!" и да спрете програмата.
-**Пример:**
-*Смесен вход/изход, вход е означен с "$ " преди него*
+=[Пример:]=
+*[Смесен вход/изход, вход е означен с "$ " преди него]*
```
-
-
-
+\n
+\n
+\n
$ 5
-
+\n
X
-
+\n
$ 9
-
+\n
X
O
$ 3
@@ -79,13 +81,12 @@ X X
X
OOO
O wins!
-```
-**Бонус:** направете го да работи с NxN брой клетки, като N е число между 1 и 50.
+=[Бонус:]= направете го да работи с NxN брой клетки, като N е число между 1 и 50.
## Задача 4
-Имплементирайте играта [chomp](https://en.wikipedia.org/wiki/Chomp): представете си, че имаме един шоколад, разделен на NxM квадратчета.
+Имплементирайте играта [url https://en.wikipedia.org/wiki/Chomp chomp]: представете си, че имаме един шоколад, разделен на NxM квадратчета.
Всеки играч избира квадратче (координати), след това изяжда всички парчета, които са в дясно или надолу от квадратчето.
Играчът, който изяде квадратчето в горния ляв ъгъл губи играта.
@@ -94,8 +95,8 @@ O wins!
Редуват се първия и втория играч, като всеки въвежда две числа - координати в шоколада (между 1 и N за реда и 1 и M за колоната).
Когато някой изяде парчето в горния ляв ъгъл, програмата изкарва "PLAYER wins!" (PLAYER е 1 или 2) и спира изпълнение.
-**Пример**
-*Смесен вход/изход, вход е означен с "$ " преди него*
+=[Пример]=
+*[Смесен вход/изход, вход е означен с "$ " преди него]*
```
4 5
@@ -112,28 +113,27 @@ $ 4 2
#####
#####
####
-#
+# \n
$ 1 2
-#
-#
-#
-#
+# \n
+# \n
+# \n
+# \n
$ 2 1
-#
-
-
-
+# \n
+ \n
+ \n
+ \n
$ 1 1
-
-
-
-
+ \n
+ \n
+ \n
+ \n
2 wins!
-```
## Задача 5
-**Тази задача е много трудна, proceed with caution!**
+=[Тази задача е много трудна, proceed with caution!]=
Ще имплементираме програма, която "симулира" един елементарен компютър.
Компютъра ни, като всеки друг, работи само и единствено с цели неотрицателни числа.
@@ -144,33 +144,35 @@ $ 1 1
Започваме изпълнение от началото на паметта, след като изпълним една инструкция, изпълняваме тази директно до нея, и така докато не стигнем инструкцията "EXT".
В такъв случай, изкарваме стойността в регистър B и спираме програмата.
-Това са командите, описани във формата "D - `A B C`", като D е число, съответстващо на инструкцията с име `A` (името го използваме за нас, в кода то не присъства) и аргументи след името `B` и `C`.
-`MEMORY` е число, съответстващо на индекс (адрес) в паметта на компютъра (между 0 и 127), а `VALUE` е произволна числова стойност.
+Това са командите, описани във формата "D - `[A B C]`", като D е число, съответстващо на инструкцията с име `[A]` (името го използваме за нас, в кода то не присъства) и аргументи след името `[B]` и `[C]`.
+`[MEMORY]` е число, съответстващо на индекс (адрес) в паметта на компютъра (между 0 и 127), а `[VALUE]` е произволна числова стойност.
+
+:unordered
+- 0 - `[EXT]` - край на изпълнението на програмата в симулирания компютър
-- 0 - `EXT` - край на изпълнението на програмата в симулирания компютър
+- 1 - `[INC MEMORY]` - инкрементира стойността на индекс `[MEMORY]`\n
+ Пример: `[0 2]` - инкрементира стойността на индекс 2
-- 1 - `INC MEMORY` - инкрементира стойността на индекс `MEMORY`
- Пример: `0 2` - инкрементира стойността на индекс 2
+- 2 - `[RIN VALUE MEMORY]` - инкрементира стойността на индекс `[VALUE + MEMORY]`\n
+ Пример: `[1 3 6]` - инкрементира стойността на адрес `[3 + 6 = 9]`
-- 2 - `RIN VALUE MEMORY` - инкрементира стойността на индекс `VALUE + MEMORY`
- Пример: `1 3 6` - инкрементира стойността на адрес `3 + 6 = 9`
+- 3 - `[DEC MEMORY]` - декрементира стойността на индекс `[MEMORY]`
-- 3 - `DEC MEMORY` - декрементира стойността на индекс `MEMORY`
+- 4 - `[RDE VALUE MEMORY]` - декрементира стойността на индекс `[VALUE + MEMORY]`
-- 4 - `RDE VALUE MEMORY` - декрементира стойността на индекс `VALUE + MEMORY`
+- 5 - `[STA MEMORY]` - запазва стойността на индекс `[MEMORY]` в регистъра А\n
+ Пример: `[4 19]` - запазва стойността на индекс 19 в регистъра А
-- 5 - `STA MEMORY` - запазва стойността на индекс `MEMORY` в регистъра А
- Пример: `4 19` - запазва стойността на индекс 19 в регистъра А
+- 6 - `[RST VALUE MEMORY]` - запазва стойността на адрес `[VALUE + MEMORY]` в регистър А\n
+ Пример: `[5 2 14]` - запазва стойността на индекс `[2 + 14 = 16]` в регистър А
-- 6 - `RST VALUE MEMORY` - запазва стойността на адрес `VALUE + MEMORY` в регистър А
- Пример: `5 2 14` - запазва стойността на индекс `2 + 14 = 16` в регистър А
+- 7 - `[STB MEMORY]` - запазва стойността на индекс `[MEMORY]` в регистъра B
-- 7 - `STB MEMORY` - запазва стойността на индекс `MEMORY` в регистъра B
+- 8 - `[BEQ MEMORY]` - продължава изпълнение от индекс `[MEMORY]`, ако стойността в регистъра А е нула\n
+ Пример: `[7 8]` - продължава изпълнение от индекс 8, ако стойността в регистър А е нула
-- 8 - `BEQ MEMORY` - продължава изпълнение от индекс `MEMORY`, ако стойността в регистъра А е нула
- Пример: `7 8` - продължава изпълнение от индекс 8, ако стойността в регистър А е нула
+- 9 - `[BNE MEMORY]` - продължава изпълнение от индекс `[MEMORY]`, ако стойността в регистъра А не е нула
-- 9 - `BNE MEMORY` - продължава изпълнение от индекс `MEMORY`, ако стойността в регистъра А не е нула
В началото получавате N, това са броя числа, които съставят цялата програма.
След това се въвеждат N числа, които са цялата програма.
@@ -178,20 +180,21 @@ $ 1 1
Ако по време на изпълнение стигнете до инструкция, която не е дефинирана, изкарвате "Error: undefined instruction!" и спирате програмата.
Ако някой аргумент е индекс в паметта, обаче стойността му е извън обхвата на паметта, изкарвате "Error: invalid memory address!" и спирате програмата.
-Ако няма грешка и програмата успешно стигне до `EXT` инструкция, както беше казано, изкарваме на екрана стойността в регистъра B.
+Ако няма грешка и програмата успешно стигне до `[EXT]` инструкция, както беше казано, изкарваме на екрана стойността в регистъра B.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|3 10 8 0|Error: undefined instruction!|
-|3 5 8000 0|Error: invalid memory address!|
-|6 1 3 7 3 0 958|959|
-|17 5 9 8 6 1 8 3 9 5 9 9 2 7 8 0 91461 772000|863461|
+.table
+|=Вход=||=Изход=|
+|:3 10 8 0:||:Error: undefined instruction!:|
+|:3 5 8000 0:||:Error: invalid memory address!:|
+|:6 1 3 7 3 0 958:||:959:|
+|:17 5 9 8 6 1 8 3 9 5 9 9 2 7 8 0 91461 772000:||:863461:|
-&:question Какво прави последната програма?
+.question Какво прави последната програма?
-**Бонус:** направете програми за симулаторния компютър, които
+=[Бонус:]= направете програми за симулаторния компютър, които\n
+.numbered
1. умножават числата 87401 и 37
2. намира сумата на числата 87, 305, 2, 612, 222
diff --git a/src/teaching/upp-2023/week7/index.md b/src/teaching/upp-2023/week7/index.du
index b216992..5e571aa 100644
--- a/src/teaching/upp-2023/week7/index.md
+++ b/src/teaching/upp-2023/week7/index.du
@@ -1,68 +1,69 @@
# Задачи - УПП, Седмица 7, 17.11.2023
-GitHub classroom: [classroom.github.com/a/m5M2_CWD](https://classroom.github.com/a/m5M2_CWD)
+\n
+
+GitHub classroom: [url https://classroom.github.com/a/m5M2_CWD classroom.github.com/a/m5M2_CWD]
## Задача 1
-*Това е почти същата задача като през [седмица 5](../week5/#1)*
+*[url ../week5/#1 Това е почти същата задача като през [седмица 5]]*
Дефинираме двуизмерен координат като две числа с плаваща запетая.
Направете функция, която получава два двуизмерни координата, покомпонентно ги сумира и връща резултатните координати.
Няма как функцията да върне две стойности, затова добаваете още два аргумента, които да са указатели към променливи в които да запазим сумираните координати.
-&:warn **Трябва** да използвате референции вместо указатели!
-
-От входа получавате два координата, след това връщате тяхната покомпонентна сума **използвайки функцията**.
+.warn =[Трябва]= да използвате референции вместо указатели!
-**Пример:**
+От входа получавате два координата, след това връщате тяхната покомпонентна сума =[използвайки функцията]=.
-|Вход|Изход|
-|----|-----|
-|8.0 1.5 -1.9 -100.741|6.1 -99.241|
+=[Пример:]=
+.table
+|=Вход=||=Изход=|
+|:8.0 1.5 -1.9 -100.741:||:6.1 -99.241:|
## Задача 2
-Един магазин продава три продукта, които ще бележим с `a`, `b` и `c`.
+Един магазин продава три продукта, които ще бележим с `[a]`, `[b]` и `[c]`.
Правим инвентарна система за тези продукти, като за всеки от тях пазим неговата бройка в склада.
В началото имаме 0 от всеки продукт.
-Получавате букви, докато не стигнете до буквата `$`.
-Ако буквата е `a`, `b` или `c`, тогава този продукт става "сегашния" продукт.
-Ако буквата е `S`, тогава намаляте бройката на сегашния продукт с 1, а ако е `R` - увеличаваме с 10.
+Получавате букви, докато не стигнете до буквата `[$]`.
+Ако буквата е `[a]`, `[b]` или `[c]`, тогава този продукт става "сегашния" продукт.
+Ако буквата е `[S]`, тогава намаляте бройката на сегашния продукт с 1, а ако е `[R]` - увеличаваме с 10.
-&:warn **НЕ** може да използвате масиви! **Трябва** действията на `S` и `R` да се изкарат във функции!
+.warn =[НЕ]= може да използвате масиви! =[Трябва]= действията на `[S]` и `[R]` да се изкарат във функции!
-Когато получите `$`, изкарвате броя на всеки продукт и спирате програмата.
+Когато получите `[$]`, изкарвате броя на всеки продукт и спирате програмата.
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-|a R R S S S S S S b R c b b R c R a S c S b S S S a R $|а: 23 b: 17 c: 9|
+.table
+|=Вход=||=Изход=|
+|:a R R S S S S S S b R c b b R c R a S c S b S S S a R $:||:а: 23 b: 17 c: 9:|
## Задача 3
-В началото получавате буква - тя съответства на дадена **функция**, след това получавате 5 числа с плаваща запетая.
+В началото получавате буква - тя съответства на дадена =[функция]=, след това получавате 5 числа с плаваща запетая.
След всяко въведено трябва да изкарате резултата от съответната функция при подадено входното число.
-&:warn **Трябва** да използвате указател към функция!
+.warn =[Трябва]= да използвате указател към функция!
Буквите съответстват на следните функции:
+.bulleted
+- `[a]` - модул на стойност
+- `[s]` - стойност на втора степен
+- `[h]` - занулена частта след запетаята
+- `[f]` - занулена частта преди (в ляво от) запетаята
-- `a` - модул на стойност
-- `s` - стойност на втора степен
-- `h` - занулена частта след запетаята
-- `f` - занулена частта преди (в ляво от) запетаята
-
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|a 0.5 -18.3 192.994 0 -0.003|0.5 18.3 192.994 0 0.003|
-|s 0.5 -18.3 192.994 0 -0.003|0.25 334.89 37246.67404 0 0.000009|
-|h 0.5 -18.3 192.994 0 -0.003|0 -18 192 0 0|
-|f 0.5 -18.3 192.994 0 -0.003|0.5 -0.3 0.994 0 -0.003|
+.table
+|=Вход=||=Изход=|
+|:a 0.5 -18.3 192.994 0 -0.003:||:0.5 18.3 192.994 0 0.003:|
+|:s 0.5 -18.3 192.994 0 -0.003:||:0.25 334.89 37246.67404 0 0.000009:|
+|:h 0.5 -18.3 192.994 0 -0.003:||:0 -18 192 0 0:|
+|:f 0.5 -18.3 192.994 0 -0.003:||:0.5 -0.3 0.994 0 -0.003:|
## Задача 4
@@ -75,48 +76,46 @@ GitHub classroom: [classroom.github.com/a/m5M2_CWD](https://classroom.github.com
```
N. [C] TASK
-```
-Където `N` е нейния номер (индекс), `C` е шпация или буквата "x" (шпация когато не е изпълнена, и "х" когато е), `TASK` е самия низ на задачата.
+Където `[N]` е нейния номер (индекс), `[C]` е шпация или буквата "x" (шпация когато не е изпълнена, и "х" когато е), `[TASK]` е самия низ на задачата.
-Програмата получава букви, докато не получи буквата `$`.
+Програмата получава букви, докато не получи буквата `[$]`.
Всяка буква определя някакво действие:
-
-- при `p` изкарваме на екрана всички задачи
-- при `d` изкарваме на екрана всички завършени задачи
-- при `t` изкарваме на екрана всички незавършени задачи
-- след `a` въвеждаме нова (незавършена) задача на последния свободен индекс
+.bulleted
+- при `[p]` изкарваме на екрана всички задачи
+- при `[d]` изкарваме на екрана всички завършени задачи
+- при `[t]` изкарваме на екрана всички незавършени задачи
+- след `[a]` въвеждаме нова (незавършена) задача на последния свободен индекс\n
Ако вече пазим 64 задачи, трябва да изкараме грешка на екрана и да продължим с програмата.
-- след `c` въвеждаме номер на задача и обръщаме нейната изпълненост: ако е изпълнена, става неизпълнена, и ако е неизпълнена, става изпълнена
+- след `[c]` въвеждаме номер на задача и обръщаме нейната изпълненост: ако е изпълнена, става неизпълнена, и ако е неизпълнена, става изпълнена
В началото на програмата нямаме никакви задачи.
-**Пример:**
-*Смесен вход/изход, изход е отбелязан с "> ". Забележете, че има шпации в края на низове за задачи.*
+=[Пример:]=
+*[Смесен вход/изход, изход е отбелязан с "> ". Забележете, че има шпации в края на низове за задачи.]*
```
a
-Do exercise 4
+Do exercise 4 \n
a
-Solve homework
+Solve homework\n
a
-Clean room
+Clean room \n
p
-> 1. [ ] Do exercise 4
-> 2. [ ] Solve homework
-> 3. [ ] Clean room
+> 1. [ Do exercise 4 \n
+> 2. [ Solve homework\n
+> 3. [ Clean room \n
c 2
p
-> 1. [ ] Do exercise 4
-> 2. [x] Solve homework
-> 3. [ ] Clean room
+> 1. [ Do exercise 4 \n
+> 2. [x] Solve homework\n
+> 3. [ Clean room \n
d
-> 2. [x] Solve homework
+> 2. [x] Solve homework\n
t
-> 1. [ ] Do exercise 4
-> 3. [ ] Clean room
+> 1. [ Do exercise 4 \n
+> 3. [ Clean room \n
$
-```
## Задача 5
@@ -126,18 +125,18 @@ $
В началото на програмата получавате едно изображение.
След това получавате произволен брой команди - букви с възможна последователност от стойности.
Трябва да имплементирате следните команди:
-
-- `s` - изкарвате изображението на екрана
-- `r` - завъртате изображението по часовниковата стрелка с 90 градуса
-- `l` - завъртате изображението обратно на часовниковата стрелка с 90 градуса
-- `h` - обръщате изображението по хоризонтала (първи и последен ред се разменят, след това втори и предпоследен и так. нат.)
-- `v` - обръщате изображението по вертикалата (първа и последна колона се разменят, след това втора и предпоследна и так. нат.)
-- `f` - след този знак получавате още 4 стойности - това са два координата върху изображението, и трябва да запълните с бяло правоъгълна област с горен ляв ъгъл в първата точка и с долен десен ъгъл във втората точка.
+.bulleted
+- `[s]` - изкарвате изображението на екрана
+- `[r]` - завъртате изображението по часовниковата стрелка с 90 градуса
+- `[l]` - завъртате изображението обратно на часовниковата стрелка с 90 градуса
+- `[h]` - обръщате изображението по хоризонтала (първи и последен ред се разменят, след това втори и предпоследен и так. нат.)
+- `[v]` - обръщате изображението по вертикалата (първа и последна колона се разменят, след това втора и предпоследна и так. нат.)
+- `[f]` - след този знак получавате още 4 стойности - това са два координата върху изображението, и трябва да запълните с бяло правоъгълна област с горен ляв ъгъл в първата точка и с долен десен ъгъл във втората точка.
В един координат първо посочваме реда и след това колоната, като координатите започват от 0, от горния ляв ъгъл.
-- `c` - почти същото като `f`, обаче запълвате с черно, не с бяло
+- `[c]` - почти същото като `[f]`, обаче запълвате с черно, не с бяло
-**Пример:**
-*Смесен вход/изход*
+=[Пример:]=
+*[Смесен вход/изход]*
```
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -188,28 +187,27 @@ X XXXXXXXXXXXXXXXXX X
X X
X X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-```
## Задача 6
-Ще имплементираме програма, която намира състоянието на един [елементарен едноклетъчен автомат](https://en.wikipedia.org/wiki/Elementary_cellular_automaton) след даден брой генерации и определено правило.
+Ще имплементираме програма, която намира състоянието на един [url https://en.wikipedia.org/wiki/Elementary_cellular_automaton елементарен едноклетъчен автомат] след даден брой генерации и определено правило.
Задачата изглежда сложна, но не е толкова зле.
За нашите цели, един "елементарен едноклетъчен автомат" е просто един голям булев масив.
-Ще наричаме стойност `true` жива и стойност `false` мъртва.
+Ще наричаме стойност `[true]` жива и стойност `[false]` мъртва.
За всяка клетка в масива имаме правила, в зависимост от стойностите на клетката в ляво и в дясно променяме сегашната клетка.
Направили сме една "генерация" след като обиколим всички клетки един път (от ляво на дясно) и обновим техните стойности.
-Би трябвало това да ви напомня на [играта "Живот"](https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life) от [John Conway](https://en.wikipedia.org/wiki/John_Horton_Conway).
+Би трябвало това да ви напомня на [url https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life играта "Живот"] от [url https://en.wikipedia.org/wiki/John_Horton_Conway John Conway].
-Конкретните правила са тези при ["правило 30"](https://en.wikipedia.org/wiki/Rule_30).
+Конкретните правила са тези при [url https://en.wikipedia.org/wiki/Rule_30 "правило 30"].\n
Ако сегашната клетка е жива:
-
+.bulleted
- става мъртва, ако тази в ляво е жива
- остава жива иначе
Ако сегашната клетка е мъртва:
-
+.bulleted
- става жива, ако тази в ляво ИЛИ тази в дясно е жива (но не и двете едновременно)
- иначе остава мъртва
diff --git a/src/teaching/upp-2023/week8/index.md b/src/teaching/upp-2023/week8/index.du
index 561dc71..fd1ebf8 100644
--- a/src/teaching/upp-2023/week8/index.md
+++ b/src/teaching/upp-2023/week8/index.du
@@ -1,8 +1,10 @@
# Задачи - УПП, Седмица 8, 24.11.2023
-GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com/a/Big7FRUG)
+\n
-&:warn **Трябва** да използвате възможно най-малко памет във всички задачи!
+GitHub classroom: [url https://classroom.github.com/a/Big7FRUG classroom.github.com/a/Big7FRUG]
+
+.warn =[Трябва]= да използвате възможно най-малко памет във всички задачи!
## Задача 1
@@ -13,11 +15,11 @@ GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com
Броим позициите на числата от 1, тоест в "8 5 9 7", 8 е на позиция 1, 5 е на позиция 2, 9 е на позиция 3 и 7 е на позиция 4.
"Всяко второ число" са числата 5 и 7, докато "всяко трето" е само числото 9.
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-|8<br>19 6 2 100 96 54 56 39|6 100 54 39<br>2 54|
+.table
+|=Вход=||=Изход=|
+|:8\n19 6 2 100 96 54 56 39:||:6 100 54 39\n2 54:|
## Задача 2
@@ -30,25 +32,25 @@ GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com
След ротацията трябва да изкарате числата на екрана.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|9 1 3 5 0 1|5 9 1 3|
-|1 2 2 2 1 0 -3|2 1 1 2 2|
-|983 473 103 1 4 0 0|983 473 103 1 4|
+.table
+|=Вход=||=Изход=|
+|:9 1 3 5 0 1:||:5 9 1 3:|
+|:1 2 2 2 1 0 -3:||:2 1 1 2 2:|
+|:983 473 103 1 4 0 0:||:983 473 103 1 4:|
## Задача 3
Получавате цяло положително число N и след това получавате всички коефициенти в матрица NxN.
Трябва да изкарате редицата числа, получена чрез умножаване на първия ред по всяка колона от същата матрица.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|3<br>78 97 21<br>67 9 37<br>67 11 89|13990 8670 7096|
-|4<br>46 34 26 61<br>30 58 81 27<br>50 69 26 83<br>100 2 25 63|10536 5452 6151 9725|
+.table
+|=Вход=||=Изход=|
+|:3\n78 97 21\n67 9 37\n67 11 89:||:13990 8670 7096:|
+|:4\n46 34 26 61\n30 58 81 27\n50 69 26 83\n100 2 25 63:||:10536 5452 6151 9725:|
## Задача 4
@@ -60,38 +62,38 @@ GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com
Накрая трябва да изкарате получената редица стойности.
При изкарване трябва да пропуснете незапълнени клетки.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|82 25 23 32 72 19 0|82 23 25 32 72 19|
-|82 25 23 32 72 19 61 0|82 23 25 32 72 61 19|
-|96 96 56 90 33 43 15 73 17 0|96 56 96 90 33 15 43 73 17|
+.table
+|=Вход=||=Изход=|
+|:82 25 23 32 72 19 0:||:82 23 25 32 72 19:|
+|:82 25 23 32 72 19 61 0:||:82 23 25 32 72 61 19:|
+|:96 96 56 90 33 43 15 73 17 0:||:96 56 96 90 33 15 43 73 17:|
## Задача 5
Получавате цели числа от входа, докато не получите числото 0.
Представете си една права "по средата" на масива, вмъквате първото число в ляво от правата, второто в дясно, после пак в ляво и четвъртото в дясно и так. нат.
-Пример: ако са въведени числата "1 2 3 4", и си представяме правата `|`, при първото число правим `1|`, при второто `1|2`, при третото `1 3|2` и при четвъртото `1 3|4 2`, тоест финалната редица е "1 3 4 2".
+Пример: ако са въведени числата "1 2 3 4", и си представяме правата `[|]`, при първото число правим `[1|]`, при второто `[1|2]`, при третото `[1 3|2]` и при четвъртото `[1 3|4 2]`, тоест финалната редица е "1 3 4 2".
Друг начин по който да го разберем, е че първото число е на първа позиция, второто число е на последната, третото число е на втора позиция, четвъртото е на предпоследна и так. нат.
Обаче ние не знаем финалния размер на масива, затова се нуждаем от логиката с чертата.
-&:important Моля не правете решенето със запазване на входа и разместване на елементите
+.important Моля не правете решенето със запазване на входа и разместване на елементите
Напомням, че тази права само си я представяте.
В началото масива е с размер 2.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|90 13 85 42 92 0|90 85 92 42 13|
-|85 43 26 38 45 41 48 18 11 78 56 0|85 26 45 48 11 56 78 18 41 38 43|
+.table
+|=Вход=||=Изход=|
+|:90 13 85 42 92 0:||:90 85 92 42 13:|
+|:85 43 26 38 45 41 48 18 11 78 56 0:||:85 26 45 48 11 56 78 18 41 38 43:|
## Задача 6
-Трябва да направите интерпретатор за програмния език [brainfuck](https://en.wikipedia.org/wiki/Brainfuck).
+Трябва да направите интерпретатор за програмния език [url https://en.wikipedia.org/wiki/Brainfuck brainfuck].
В него имате 8 команди/инструкции, всяка от които се изразява с един знак.
Запазвате в паметта няколко неща: вашата brainfuck програма, паметта на "машината", къде се намирате в програмата и къде се намирате в паметта на "машината".
@@ -100,24 +102,24 @@ GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com
За предпочитане е, типа данни в паметта на "машината" да запазва само един байт информация.
Самите команди (знаци), които съставят една brainfuck програма са:
+.bulleted
+- `[>]`: сегашната клетка (къде се намирате в паметта на "машината") става тази в дясно
+- `[<]`: сегашната клетка става тази в ляво
+- `[+]`: инкрементира стойността в сегашната клетка с едно
+- `[-]`: декрементира стойността в сегашната клетка с едно
+- `[.]`: изкарва стойността в сегашната клетка (като число)
+- `[,]`: приема от входа едно число и го записва в сегашната клетка
+- `[[]`: ако стойността в сегашната клетка е 0, тогава програмата "скача" напред към знака след съответната `[]]`
+- `[]]`: ако стойността в сегашната клетка не е 0, тогава програмата "скача" назад към знака след съответната `[[]`
-- `>`: сегашната клетка (къде се намирате в паметта на "машината") става тази в дясно
-- `<`: сегашната клетка става тази в ляво
-- `+`: инкрементира стойността в сегашната клетка с едно
-- `-`: декрементира стойността в сегашната клетка с едно
-- `.`: изкарва стойността в сегашната клетка (като число)
-- `,`: приема от входа едно число и го записва в сегашната клетка
-- `[`: ако стойността в сегашната клетка е 0, тогава програмата "скача" напред към знака след съответната `]`
-- `]`: ако стойността в сегашната клетка не е 0, тогава програмата "скача" назад към знака след съответната `[`
-
-От входа ще получавате редица знаци, които ще съставят вашата brainfuck програма, като при знака `$` входът спира и трябва да започнете изпълнение на brainfuck кода.
+От входа ще получавате редица знаци, които ще съставят вашата brainfuck програма, като при знака `[$]` входът спира и трябва да започнете изпълнение на brainfuck кода.
Не знаете колко памет на "машината" ще ви трябва, затова бъдете готови да я разширявате при нужда.
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-|+ + > + + + + + [ < + > - ] < . $|7|
+.table
+|=Вход=||=Изход=|
+|:+ + > + + + + + [ < + > - < . $:||:7:|
## Задача 7
@@ -130,6 +132,7 @@ GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com
Играчът започва с 10 точки живот и с меч, който взема 2 точки живот, когато използван.
На всеки ход играчът има няколко възможни действия:
+:unordered
- да отиде в следващата или предходната стая
- ако има коридор, да отиде в другия край на коридора
@@ -146,13 +149,14 @@ GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com
Няма как да знаете колко точки живот отнема една атака на чудовището, преди да ви е ударило.
Ако изберете да отидете в друга стая, никой няма да атакува никой.
- На всеки ход, всяко живо чудовище избира на случаен принцип дали да остане в своята стая, дали да отиде в лявата или в дясната (шансът за всяка опция е еднакъв).
+ .p На всеки ход, всяко живо чудовище избира на случаен принцип дали да остане в своята стая, дали да отиде в лявата или в дясната (шансът за всяка опция е еднакъв).\n
След като убиете едно чудовище, имате 25% шанс да получите телепортер, с него може да излезете от коридорния dungeon и да свършите играта.
- Ако чудовище влезе в стая със съкровище, то го плячкосва и се губи.
+ .p Ако чудовище влезе в стая със съкровище, то го плячкосва и се губи.
- ако притежавате телепортер, може да спрете играта
+
Има 20% шанс една стая да има съкровище, 20% шанс да има чудовище, 10% шанс да има коридор и 50% шанс да бъде празна.
При "създаване" на едно чудовище, то ще има между 20 и 30 точки живот, и оръжието му ще взема между 5 и 20 точки живот.
Шанса за всяка от тези стойности е еднакъв.
@@ -164,4 +168,4 @@ GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com
Всеки допълнителен телепортер, извън първоначалния с който спирате играта, ви носи още 50 точки.
На всеки ход трябва да изкарате броя точки живот на играча, броя точки живот които меча му отнема, сегашната стая в която се намира, левите 5 стаи и десните 5 стаи.
-Една стая е изобразена със знака `?` ако не е посетена, ` ` ако е празна, `c` ако има съкровище, `m` ако има чудовище и `t` ако има тунел.
+Една стая е изобразена със знака `[?]` ако не е посетена, `[ ]` ако е празна, `[c]` ако има съкровище, `[m]` ако има чудовище и `[t]` ако има тунел.
diff --git a/src/teaching/upp-2023/week9/index.md b/src/teaching/upp-2023/week9/index.du
index 557b89a..af2f853 100644
--- a/src/teaching/upp-2023/week9/index.md
+++ b/src/teaching/upp-2023/week9/index.du
@@ -1,19 +1,21 @@
# Задачи - УПП, Седмица 9, 01.12.2023
-GitHub classroom: [classroom.github.com/a/lGXxCRZO](https://classroom.github.com/a/lGXxCRZO)
+\n
-&:warn Освен ако не е казано друго, може да зачитате, че максималната дължина на един низ е 1024 знака.
+GitHub classroom: [url https://classroom.github.com/a/lGXxCRZO classroom.github.com/a/lGXxCRZO]
+
+.warn Освен ако не е казано друго, може да зачитате, че максималната дължина на един низ е 1024 знака.
## Задача 1
Получавате от входа два низа.
Трябва да изкарате на екрана низ, при който има знакът "\_" на индексите, където буквите между двата низа се различават, и съответната буква, когато не се различават.
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-|ABCDE<br>AKDDCP|A\_\_D\_\_|
+.table
+|=Вход=||=Изход=|
+|:ABCDE\nAKDDCP:||:A\_\_D\_\_:|
## Задача 2
@@ -21,27 +23,27 @@ GitHub classroom: [classroom.github.com/a/lGXxCRZO](https://classroom.github.com
Изкарайте на екрана втората половина от низа и след това директно долепена първата половина.
Ако низа е с нечетна дължина, зачитаме средния елемент като част от втората половина.
-&:important Трябва да използвате динамична памет
+.important Трябва да използвате динамична памет
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|6<br>A CM N|M NA C|
-|7<br>ABCKLMN|KLMNABC|
+.table
+|=Вход=||=Изход=|
+|:6\nA CM N:||:M NA C:|
+|:7\nABCKLMN:||:KLMNABC:|
## Задача 3
От входа получаввате един низ, трябва да изкарате броя думи в него.
Думите се разделят с една или повече шпации, като знаци (точка, запетая, удивителна, ...) не са думи.
-**Примери:**
+=[Примери:]=
-|Вход|Изход|
-|----|-----|
-|abc|1|
-|abc def|2|
-|<pre>This , is , a , sentence .!</pre>|4|
+.table
+|=Вход=||=Изход=|
+|:abc:||:1:|
+|:abc def:||:2:|
+|:<pre>This , is , a , sentence .!</pre>:||:4:|
## Задача 4
@@ -49,22 +51,23 @@ GitHub classroom: [classroom.github.com/a/lGXxCRZO](https://classroom.github.com
Тя позволява да погледнеш стойностите в клетки от паметта, да запишеш стойности и да стартираш програми.
Игнорирайки последната му възможност, нека да го имплементираме.
-За нашите цели, паметта на компютъра е просто един масив, които ще расте **когато е нужно**.
+За нашите цели, паметта на компютъра е просто един масив, които ще расте =[когато е нужно]=.
Ще адресираме (индексираме) стойностите от масива с числа от 16-тична бройна система.
Когато въведем низ във формата:
+:unordered
- "адрес", без нищо друго на реда, изкарваме "X: V", където X е конкретния адрес (пак в 16-тична бройна система) и V е стойността на клетката в този адрес.
- "адрес.адрес", връщаме стойностите между тези адреси (включително) във формата "X: V ...", където X е начален адрес и "V ..." са стойностите на всяка клетка.
+ .p
Допълнително, ако изкарваме повече от 8 адреса, трябва да продължим на нов ред, като изкараме в същия формат.
Пример: вход: "0.А", изход:
```
0: 0 0 0 0 0 0 0 0
8: 0 0 0
- ```
- "адрес: стойност", записваме "стойност" на дадения адрес.
Стойноста също е 16-тично число.
@@ -72,40 +75,42 @@ GitHub classroom: [classroom.github.com/a/lGXxCRZO](https://classroom.github.com
- "адрес: стойност ...", като предходното, обаче може да определим стойностите на сегашната и на следващите клетки (пак изкарваме във формата "X: V ...")
-**Примери:**
-|Вход|Изход|
-|----|-----|
-|0 |0: 0 |
-|2.8 |2: 0 0 0 0 0 0 0|
-|2: FF<br>2|2: 0<br>2: FF|
-|2: FF 0 A 5<br>2.5|2: 0 0 0 0<br>2: FF 0 A 5|
-|1: FA 0 9 3 5 6 1 2 ABB 8A 99<br>1.12|1: 0 0 0 0 0 0 0 0<br>9: 0 0 0<br>1: FA 0 9 3 5 6 1 2<br>9: ABB 8A 99 0|
+=[Примери:]=
+
+.table
+|=Вход=||=Изход=|
+|:0 :||:0: 0 :|
+|:2.8 :||:2: 0 0 0 0 0 0 0:|
+|:2: FF\n2:||:2: 0\n2: FF:|
+|:2: FF 0 A 5\n2.5:||:2: 0 0 0 0\n2: FF 0 A 5:|
+|:1: FA 0 9 3 5 6 1 2 ABB 8A 99\n1.12:||:1: 0 0 0 0 0 0 0 0\n9: 0 0 0\n1: FA 0 9 3 5 6 1 2\n9: ABB 8A 99 0:|
## Задача 5
Перфокартите са стар формат за съхраняване на текст (код) върху хартиен носител, който е четим от машини.
Разделени са на някакъв брой редове и колони, всяка колона определя една буква, и всеки ред определя битовите стойности на всяка буква, като дупката означава бит 1, а липсата и бит 0.
-![](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Blue-punch-card-front-horiz.png/1024px-Blue-punch-card-front-horiz.png)
+[image https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Blue-punch-card-front-horiz.png/1024px-Blue-punch-card-front-horiz.png
За удобство на програмиста, почти винаги най-отгоре на колоната се изписва с мастило каква е буквата на съответната колона.
Трябва да имплементирате програма, която получава перфо карти в стандартния IBM формат: 12 реда и 80 колони и изкарва съответния ред, който е закодиран.
-Тоест, от входа получавате 12 низа, всеки низ е с дължина 80, и са съставени от 0 и 1.
-Стойностите **по колони**:
+Тоест, от входа получавате 12 низа, всеки низ е с дължина 80, и са съставени от 0 и 1.\n
+Стойностите =[по колони]=:
+.bulleted
- от "100000000000" до "000000000001" (със само една 1ца) съответстват на знаците "&", "-", "0", "1", ... "9".
- от "100100000000" до "100000000001" (с две 1ци, едната която е винаги първата) съответстват на знаците от "A" до "I".
- от "010100000000" до "010000000001" (с две 1ци, едната която е винаги втората) съответстват на знаците от "J" до "R".
- от "001100000000" до "001000000001" (с две 1ци, едната която е винаги третата) съответстват на знаците "/", "S", ... "Z".
-**Пример:**
+=[Пример:]=
-|Вход|Изход|
-|----|-----|
-|100000000000111111111000000000000000000<br>010000000000000000000111111111000000000<br>001000000000000000000000000000111111111<br>000100000000100000000100000000100000000<br>000010000000010000000010000000010000000<br>000001000000001000000001000000001000000<br>000000100000000100000000100000000100000<br>000000010000000010000000010000000010000<br>000000001000000001000000001000000001000<br>000000000100000000100000000100000000100<br>000000000010000000010000000010000000010<br>000000000001000000001000000001000000001<br>|&-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ|
+.table
+|=Вход=||=Изход=|
+|:100000000000111111111000000000000000000\n010000000000000000000111111111000000000\n001000000000000000000000000000111111111\n000100000000100000000100000000100000000\n000010000000010000000010000000010000000\n000001000000001000000001000000001000000\n000000100000000100000000100000000100000\n000000010000000010000000010000000010000\n000000001000000001000000001000000001000\n000000000100000000100000000100000000100\n000000000010000000010000000010000000010\n000000000001000000001000000001000000001\n:||:&-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ:|
## Задача 6
@@ -113,25 +118,30 @@ GitHub classroom: [classroom.github.com/a/lGXxCRZO](https://classroom.github.com
Вие ще ги изучавате много подробно в "Езици, автомати и изчислимост", но за нашите цели ще се абстрахираме от детайлите.
Правилата за регулярни изрази са следните:
-
+.bulleted
- ако е буквата "\*", значи предходната буква може да се повтаря 0 или повече пъти
- ако е буквата "?", значи предходната буква може да се повтаря 0 или 1 пъти
- ако не е някой от горните знаци, тогава искаме сегашната буква да бъде равна на тази в израза
-1. Какво описва регулярният израз `aa*bcd`?
+:unordered
+1. Какво описва регулярният израз `[aa*bcd]`?
- Първата буква от нашия низ трябва да бъде `а`.
- След това имаме `a*`, след тази първа буква може да имаме 0 или повече `a`-та.
- Тоест втората буква може да бъде `a` или `b`, ако е `a`, третата буква може да бъде `a` или `b`, обаче ако втората буква е `b`, тогава продължаваме напред и останалите букви трябва да са `bcd`.
+ .p
+ Първата буква от нашия низ трябва да бъде `[а]`.
+ След това имаме `[a*]`, след тази първа буква може да имаме 0 или повече `[a]`-та.
+ Тоест втората буква може да бъде `[a]` или `[b]`, ако е `[a]`, третата буква може да бъде `[a]` или `[b]`, обаче ако втората буква е `[b]`, тогава продължаваме напред и останалите букви трябва да са `[bcd]`.
- Тоест, този регулярен израз приема низове, които започват с `a`, след това имат 0 или повече `a`-та и завършват на `bcd`.
+ .p
+ Тоест, този регулярен израз приема низове, които започват с `[a]`, след това имат 0 или повече `[a]`-та и завършват на `[bcd]`.
Следните низове ще бъдат приети: "abcd", "aabcd", "aaabcd", "aaaabcd" и так. нат.
-2. Какво описва регулярният израз `b*cd?`?
+2. Какво описва регулярният израз `[b*cd?]`?
- В началото имаме `b` нула или повече пъти, след това имаме `c` и накрая имаме нула или едно `d`.
+ .p
+ В началото имаме `[b]` нула или повече пъти, след това имаме `[c]` и накрая имаме нула или едно `[d]`.
Следните низове ще бъдат приети: "c", "bc", "bbc", "bbbc", ..., "cd", "bcd", "bbcd", ...
+
От входа получавате число N и след това ще получите 2N на брой редове.
Един ред ще бъде регулярен израз, следващия ще бъде низ за проверка, след това пак регулярен израз, след това пак низ за проверка и така се редуват.
@@ -139,8 +149,8 @@ GitHub classroom: [classroom.github.com/a/lGXxCRZO](https://classroom.github.com
В противен случай изкарвате "No match".
Ако регулярния израз е в грешен формат (срещнете "?" или "\*" като първи знак), трябва да изкарате "Bad regex".
-**Пример:**
-*Смесен вход/изход*
+=[Пример:]=
+*[Смесен вход/изход]*
```
9
@@ -171,4 +181,3 @@ No match
*abc
ops
Bad regex
-```