Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / upp-2023 / additional1 / index.du
diff options
context:
space:
mode:
1 files changed, 67 insertions, 48 deletions
-rw-r--r--src/teaching/upp-2023/additional1/index.du115
diff --git a/src/teaching/upp-2023/additional1/index.du b/src/teaching/upp-2023/additional1/index.du
index 0356403..9956e2e 100644
--- a/src/teaching/upp-2023/additional1/index.du
+++ b/src/teaching/upp-2023/additional1/index.du
@@ -1,17 +1,20 @@
-# Допълнително упражнение 1 - УПП, 04.11.2023
+'def title Допълнително упражнение 1 - УПП, 04.11.2023
+'def desc Условия на задачите за упражнение
+
+# {title}
\n
-GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.com/a/nlFuKALw]
+GitHub classroom: {url classroom.github.com/a/nlFuKALw;https://classroom.github.com/a/nlFuKALw}
-При изображението [image /img/dialog-question.png трябва да спрете, да помислите и да си отговорите на дадения въпрос.
+При изображението {img /img/dialog-question.png} трябва да спрете, да помислите и да си отговорите на дадения въпрос.
Почти винаги ако не може да отговорите, ще имате проблеми в бъдеще с решаването.
Понякога ще ви спираме и ще ви питаме за тези въпроси.
## Задача - База гаднни
-.warn [=Нямате=] право да използвате каквито и да е функции, които вие не сте написали, както и неизучаван материал като двуизмерни масиви или динамична памет.
-[=Не=] употребявайте търсачки, ако ви трябва информация за нещо, ще може да си я изкарате с една проста тестова програма или калкулатор.
+.warn {b Нямате} право да използвате каквито и да е функции, които вие не сте написали, както и неизучаван материал като двуизмерни масиви или динамична памет.
+{b Не} употребявайте търсачки, ако ви трябва информация за нещо, ще може да си я изкарате с една проста тестова програма или калкулатор.
\n
@@ -41,7 +44,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
Стойностите от таблица А са винаги ограничени отгоре с най-големия брой битове, които комфортно може да поберем в 7 цифри.
Тоест 9999999 не е валидна стойност от таблица А, докато 8388608 e.
-.question Колко най-много [*битове*] можем със сигурност да поберем в 7 цифри?
+.question Колко най-много {i битове} можем със сигурност да поберем в 7 цифри?
Понеже редовете са от 1 до 9, ако в таблица А имаме ред 0 правим нещо специално, но това ще видите в бъдеще.
@@ -51,15 +54,16 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
Преди да започнем, трябва да имплементираме функция, която разделя дадения ред от таблица А на трите му компонента (ред, тип и стойност):
-[`getRow`] - приема ред от таблица А и указатели към променливи за ред, тип и стойност; не връща нищо\n
+{` getRow} - приема ред от таблица А и указатели към променливи за ред, тип и стойност; не връща нищо\n
В подадените указатели пази съответните стойности от реда
.question Защо приемаме указатели към променливи? Каква е "сигнатурата" на функцията?
\n
-[=Примери:=]
+{b Примери:}
-:table_2
+:table
+:2
|= Извикване
|= Резултат
@@ -73,6 +77,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
|: row = 1, type = 2, value = 3456789
+
### б) обикновенно число
Ако типа е цифрата "0", тогава стойността в базата данни е някакво число с плаваща запетая.
@@ -82,13 +87,14 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
Имплементирайте функция:
-[`parseNumber`] - приема стойност от таблица А и ред от таблица Б; връща полученото число от тези стойности
+{` parseNumber} - приема стойност от таблица А и ред от таблица Б; връща полученото число от тези стойности
\n
-[=Примери:=]
-[*Възможно е отклонението на последния пример да бъде повече от 2 единици*]
+{b Примери:}
+{i Възможно е отклонението на последния пример да бъде повече от 2 единици}
-:table_2
+:table
+:2
|= Извикване
|= Резултат
@@ -105,12 +111,14 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
|: a = 8388607.18446744073709551615
+
### в) числов текст (част едно)
Ако типа е "1", тогава стойността в базата данни е някакъв низ (последователност от букви), която е кодирана в числата.
Всеки 5 бита в реда (от дясно на ляво) от таблица Б определя буква, като:
-:table_3
+:table
+:3
|: Битове
|: Десетично число
|: Буква
@@ -137,7 +145,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
|: 11010
|: 26
-|: [*шпация*]
+|: {i шпация}
|: 11011
|: 27
@@ -160,22 +168,24 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
|: !
-Тоест ако в нашия тип данни запазваме само 10 бита, тогава числото "2" ще бъде [`0000000010`] и имаме низа "AC".
+
+Тоест ако в нашия тип данни запазваме само 10 бита, тогава числото "2" ще бъде {` 0000000010} и имаме низа "AC".
Игнорирайте старшите битове, които остават като "остатък" (по-малко от 5 бита ширина).
.question Колко бита наистина запазваме в нашия тип данни? Колко бита ще трябва да игнорираме? Колко най-много букви може да поберем?
Имплементирайте функция:
-[`decodeNumberText`] - приема ред от таблица Б и указател към "низ"; не връща нищо\n
+{` decodeNumberText} - приема ред от таблица Б и указател към "низ"; не връща нищо\n
Записва декодиран текстът от реда в указателя
.question Нарочно има кавички около думата "низ", какъв трябва наистина да е типа на указателя?
\n
-[=Примери:=]
+{b Примери:}
-:table_2
+:table
+:2
|= Извикване
|= Резултат
@@ -189,12 +199,13 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
|: decodedText = "!. ,:?!. ,:?"
+
### г) числов текст (част две)
Дотук добре, обаче не сме свършили съвсем.
-От гледна точка на сигурност, искаме дори някой да получи достъп до таблица Б, да не може да разбере текста дори след като е използвал [`decodeNumberText`].
+От гледна точка на сигурност, искаме дори някой да получи достъп до таблица Б, да не може да разбере текста дори след като е използвал {` decodeNumberText}.
-Ще използваме [url 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.
@@ -205,13 +216,14 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
Промененте функцията:
-[`decodeNumberText`] - приема ред от таблица Б, стойност от таблица А и указател към "низ"; не връща нищо\n
+{` decodeNumberText} - приема ред от таблица Б, стойност от таблица А и указател към "низ"; не връща нищо\n
След като декодира текста от реда от Б, дешифрира го със стойността от таблица А
\n
-[=Примери:=]
+{b Примери:}
-:table_2
+:table
+:2
|= Извикване
|= Резултат
@@ -237,6 +249,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
|: decodedText = "!. ,:?!., :?"
+
### д) масив (част едно)
Ако типа е "2", тогава в реда от Б сме вложили масив от стойности (числа).
@@ -246,13 +259,14 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
Имплементирайте функцията:
-[`decodeArray`] - приема ред от таблица Б и указател към масив; не връща нищо\n
+{` decodeArray} - приема ред от таблица Б и указател към масив; не връща нищо\n
Декодира елементите от реда и ги запазва в указателя
\n
-[=Пример:=]
+{b Пример:}
-:table_2
+:table
+:2
|= Извикване
|= Резултат
@@ -260,6 +274,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
|: arr = { 0, 11, 11, 15, 0, 10, 9, 10, 0, 0, 15, 5, 3, 11, 15, 0 }
+
### е) масив (част две)
От гледна точка на сигурност или оптимизране на памет, искаме да "лимитираме" какви стойности са валидни, и всички невалидни да станат някоя друга стойност по подразбиране.
@@ -267,21 +282,22 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
В старшите 20 бита от стойността в таблица А ще пазим общо 5 възможни валидни стойности, а в останалите (младши) 3 бита ще пазим индекс към тези стойности, който индекс (започвайки от 1) определя стойността по подразбиране.
-Пример: ако имаме побитово [`1111100000100011101101010101`], тогава:
+Пример: ако имаме побитово {` 1111100000100011101101010101}, тогава:
.bulleted
-- валидните числа са [`11111, 00000, 10001, 11011 и 01010`]
-- числото по подразбиране е 5-тото ([`101 = 5`]), което е числото [`01010`]
-- ако от реда в Б изкараме [`11011`], тогава го запазваме, обаче ако изкараме примерно [`11000`] тогава го превръщаме в стойността по подразбиране, а именно [`01010`]
+- валидните числа са {` 11111, 00000, 10001, 11011 и 01010}
+- числото по подразбиране е 5-тото ({` 101 = 5}), което е числото {` 01010}
+- ако от реда в Б изкараме {` 11011}, тогава го запазваме, обаче ако изкараме примерно {` 11000} тогава го превръщаме в стойността по подразбиране, а именно {` 01010}
Разширете функцията:
-[`decodeArray`] - приема стойност от таблица А, ред от таблица Б и указател към масив; не връща нищо\n
+{` decodeArray} - приема стойност от таблица А, ред от таблица Б и указател към масив; не връща нищо\n
Декодира елементите от реда, като всички невалидни стойност се превръщат в стойността по подразбиране, и ги запазва в указателя
\n
-[=Примери:=]
+{b Примери:}
-:table_2
+:table
+:2
|= Извикване
|= Резултат
@@ -292,6 +308,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
|: arr = { 8, 8, 8, 15, 8, 8, 8, 8, 8, 8, 15, 5, 3, 8, 15, 8 }
+
### ж) компресирани стойности
Ако редът в таблица А е 0, тогава цялата стойност в базата данни е побрана в стойността на таблица А.
@@ -306,15 +323,15 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
.comment 000 001 010 011 100 101
:bulleted
-- Kриптографски ред е [`00000, 10101, 11011, 10001, 01101, 10100`]
+- Kриптографски ред е {` 00000, 10101, 11011, 10001, 01101, 10100}
.bulleted
- Индексираме от 0 до 5, което побитово е от 000 до 101
-- Стойност в таблицата А е [`011001000001101101`]
+- Стойност в таблицата А е {` 011001000001101101}
.bulleted
- - Разделяйки го на индекси, това са [`011, 001, 000, 001, 101, 101`]
+ - Разделяйки го на индекси, това са {` 011, 001, 000, 001, 101, 101}
-- Слепвайки от криптографския ред на тези индекси получаваме [`100011010100000101011010010100`]
+- Слепвайки от криптографския ред на тези индекси получаваме {` 100011010100000101011010010100}
Във вашата програма ще се наложи да направите още една променлива, в която пазите криптографския ред.
@@ -326,12 +343,13 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
Напишете функция:
-[`decompress`] - приема стойност от таблица А, криптографски ред, указател за запазване на декомпресираната стойност от таблица А и указател за запазване на декомпресирания ред от таблица Б; не връща нищо
+{` decompress} - приема стойност от таблица А, криптографски ред, указател за запазване на декомпресираната стойност от таблица А и указател за запазване на декомпресирания ред от таблица Б; не връща нищо
\n
-[=Примери:=]
+{b Примери:}
-:table_2
+:table
+:2
|= Извикване
|= Резултат
@@ -342,6 +360,7 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
|: decompA = 8388607, decompB = 18446744073709551615
+
### з) входни данни
В началото на програмата получавате броя на редове от таблица А (между 1 и 16), след това толкова "реда".
@@ -352,22 +371,22 @@ GitHub classroom: [url https://classroom.github.com/a/nlFuKALw classroom.github.
След това получавате команди (знак):
.bulleted
-- [`g X`]: изкарвате на екрана стойността в базата данни, започвайки с ред X от таблица А
-- [`i`]: Връщате информация за базата данни
-- [`q`]: спиране на програмата
+- {` g X}: изкарвате на екрана стойността в базата данни, започвайки с ред X от таблица А
+- {` i}: Връщате информация за базата данни
+- {` q}: спиране на програмата
### й) заявки
.bulleted
-- [`t X`]: връщате броя и след това всички редове от таблица А с тип X
-- [`r X`]: връщате броя и всички редове от таблица А, които използват реда Х\n
+- {` t X}: връщате броя и след това всички редове от таблица А с тип X
+- {` r X}: връщате броя и всички редове от таблица А, които използват реда Х\n
Ако реда е 0, тогава трябва да върнете и размера на криптографския ред
### к) презаписване в базата данни
.bulleted
-- [`w T R V`]: запазвате (презаписвате) стойност V в таблица Т (може да бъде [`A`] или [`B`]) на ред R
-- [`s T V`]: запазвате стойност V от тип Т в базата данни\n
+- {` w T R V}: запазвате (презаписвате) стойност V в таблица Т (може да бъде {` A} или {` B}) на ред R
+- {` s T V}: запазвате стойност V от тип Т в базата данни\n
Пробвате се да я запазите, използвайки и двете таблици, но ако Б вече е запълнена, добавяте я като компресирана стойност в таблица А.
Ако и А е запълнена, изкарвате съобщение за запълнена база данни и не запазвате стойността.