Summary Files Commits Branches @commit @diff @stats
path: root / src / teaching / upp-2023 / week5 / index.md
diff options
context:
space:
mode:
1 files changed, 136 insertions, 0 deletions
-rw-r--r--src/teaching/upp-2023/week5/index.md136
diff --git a/src/teaching/upp-2023/week5/index.md b/src/teaching/upp-2023/week5/index.md
new file mode 100644
index 0000000..ca60e23
--- /dev/null
+++ b/src/teaching/upp-2023/week5/index.md
@@ -0,0 +1,136 @@
+# Задачи - УПП, Седмица 5, 03.11.2023
+
+GitHub classroom: [classroom.github.com/a/3KoIQ71H](https://classroom.github.com/a/3KoIQ71H)
+
+## Задача 1
+
+Дефинираме двуизмерен координат като две числа с плаваща запетая.
+Направете функция, която получава два двуизмерни координата, покомпонентно ги сумира и връща резултатните координати.
+Няма как функцията да върне две стойности, затова последните два аргумента трябва да са указатели към променливи в които да запазим сумираните координати.
+
+От входа получавате два координата, след това връщате тяхната покомпонентна сума **използвайки функцията**.
+
+**Пример:**
+
+|Вход|Изход|
+|----|-----|
+|8.0 1.5 -1.9 -100.741|6.1 -99.241|
+
+## Задача 2
+
+Използвайки масиви, имплементирайте 30-цифрени цели положителни числа.
+Трябва да поддържате операциите събиране и изваждане между две такива числа.
+
+Първо ще получите 30 цифри, които отговарят на първото числа, после още 30 цифри, които отговарят на втрото число и накрая ще получите знак.
+Ако знака е `+`, трябва да ги съберете и да изкарате резултата на екрана.
+Ако знака е `-`, трябва да ги извадите и да изкарате резултата на екрана.
+
+При изкарване трябва да следвате "нормалните" правила: цифрите са долепени и водещите нули не се пишат.
+
+**Пример:**
+
+|Вход|Изход|
+|----|-----|
+|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>9 3 4 2 1 6 0 3 3 5 5 1 0 1 3 0 0 0 6 3 2<br>+|470209439376508436372558|
+|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>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|
+
+## Задача 3
+
+Получавате редица цифри.
+Ако имаме поне 3 повтарящи се цифри една след друга, можем да ги премахнем.
+Тоест редицата `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`.
+
+Не е нужно да гледате напред за възможно най-много премахване.
+Тоест в случая `8 1 3 4 4 4 5 5 5 5 4 4` не се очаква да предвидите, че ако първо премахнете 5-те, после ще може да премахнете всички 4ки.
+Премахвате първата валидна повтаряща се редица, връщате се малко назад, поглеждате дали някоя нова редица не се е появила, премахвате нея или отивате на следващата.
+
+От входа първо получавате броя `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|
+
+## Задача 4
+
+Получавате редица числа.
+Всяко число е индекс към друго число в редицата (индексите започва от 0).
+Започвайки от всяка цифра, проследяваме всички "скоци", тоест ако имаме `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) и накрая връщате при кой начален индекс имаме най-много скока и колко са тези скоци.
+
+**Примери:**
+
+|Вход|Изход|
+|----|-----|
+|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|
+
+## Задача 5
+
+sim картите са типове smart-card, това означава че в себе си имат един миниатюрен компютър с миниатюрна памет.
+Нека да имплементираме съвсем опростено една сим карта.
+
+Трябва да запазите един четири-цифрен ПИН код и един еднобуквен отблокиращ код.
+В тази задача се изисква коректно валидиране на входни данни, така че ще направим:
+
+### а) валидационни функции
+
+- `isUnblockCode`, приема буква и връща дали е отблокиращ код
+ Само главни, малки и цифри са валидни отблокиращи кодове
+- `isPhoneNumber`, приема число (10 цифрено) и поглежда най-левите 3 цифри
+ Те трябва да са валиден код на държава.
+ Нужно е да приемате поне кодовете за България (359) и за Франция (033).
+ Ако искате може и други да приемате, пълен списък има [тук](https://en.wikipedia.org/wiki/List_of_country_calling_codes#Alphabetical_order).
+
+### б) вход и команди
+
+От входа първо получавате ПИН кода и отблокиращия код.
+Ако отблокиращия е в невалиден формат, връщате съответно съобщение за грешка и спирате програмата.
+
+След това получавате команди, всяка команда се определя с букви и още някакви стойности.
+**Всяка команда трябва да бъде изкарана в отделна функция!**
+
+- `v` - пробвате се да се "логнете" в сим картата.
+ След буквата получавате и едно число, което е въведения ПИН код.
+ Ако е правилен, следващите 5 команди, които изискват упълномощение могат да се изпълнят.
+ След 5те команди, упълномощението се "премахва" и трябва пак да се въведе ПИН код при упълномощени команди.
+ Ако е грешен, общо има 3 опита, и след тях картата се блокира.
+- `u` - отпблокиране на блокирана карта.
+ След буквата получавате отблокиращ код и нов ПИН код.
+ Ако отблокиращия код е в грешен формат или е грешната стойност, премахваме един опит.
+ При 10 неуспешни опита, изкарвате съобщение, че картата е перманентно блокирана и спирате програмата.
+ Ако е успешно отблокирана, тогава променяте ПИН кода и сте се "логнали" автоматично.
+- `i` - връща информация за СИМ картата, това са общо броя команди които са изпълнявани до сега
+
+### в) команди с упълномощение
+
+Всички от следните команди изискват упълномощение.
+Ако преди това сме били логнати, директно изпълняваме командата (и декрементираме броя упълномощени команди), ако обаче не сме упълномощени, трябва да поискаме ПИН код и след това да продължим както нормално.
+
+Ако някоя търсена стойност е невалидна или не съществува, връщате съответната грешка.
+
+- `c` - променя ПИН код.
+ Получавате нов ПИН код и го променяте.
+- `a` - добавя контакт в паметта, общо може да имаме 10 контакта.
+ Всеки контакт се определя с буква, неговото "име", и 10-цифрен мобилен номер.
+ Приема допълнително неговото име и тел. номер.
+ Добавяме контакта в първото незаето място, а ако всички са заети, връщаме съобщение с грешка.
+- `r` - приема и още една буква (име), връща телефонния номер на съответния контакт.
+ Ако той не съществува или телефонния номер е невалиден, връщаме съответно съобщение с грешка.
+- `d` - приема и още една буква (име), изтрива съответния контакт.
+ Ако той не съществува, връщаме съответно съобщение с грешка.
+- `o` - променя контакт, приема допълнително две имена на контакти и телефонен номер.
+ Променя контакта с първото име, като второто име и тел. номер стават новите му стойности.