Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit96e54f8fc044459ba8e00d196ccbc4bb45fdd948 (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-11-24 09:03:42 +0200
Committer
 Syndamia <kamen@syndamia.com>
2023-11-24 09:03:42 +0200
Files382ea34db3061d86de6eef8c1f8f0bf712fc1721
syndamia.com-4.0.tar
syndamia.com-4.0.tar.gz
syndamia.com-4.0.zip
Parentb290c4add75e39969dcaeccb2a4d4862f514cd24 (diff)
[te/upp-2023/w8] Added exercises v4.0
2 files changed, 168 insertions, 0 deletions
-rw-r--r--src/teaching/upp-2023/index.md1
-rw-r--r--src/teaching/upp-2023/week8/index.md167
diff --git a/src/teaching/upp-2023/index.md b/src/teaching/upp-2023/index.md
index 2d4da43..7c12f19 100644
--- a/src/teaching/upp-2023/index.md
+++ b/src/teaching/upp-2023/index.md
@@ -25,3 +25,4 @@
||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) \|\| [GitHub classroom](https://classroom.github.com/a/BBLlWMOy)|
|7 |17.11.2023|[Задачи](./week7) \|\| [GitHub classroom](https://classroom.github.com/a/m5M2_CWD)|
+|8 |24.11.2023|[Задачи](./week8) \|\| [GitHub classroom](https://classroom.github.com/a/Big7FRUG)|
diff --git a/src/teaching/upp-2023/week8/index.md b/src/teaching/upp-2023/week8/index.md
new file mode 100644
index 0000000..e21dbdd
--- /dev/null
+++ b/src/teaching/upp-2023/week8/index.md
@@ -0,0 +1,167 @@
+# Задачи - УПП, Седмица 8, 23.11.2023
+
+GitHub classroom: [classroom.github.com/a/Big7FRUG](https://classroom.github.com/a/Big7FRUG)
+
+&&warn **Трябва** да използвате възможно най-малко памет във всички задачи!
+
+## Задача 1
+
+В началото получавате цяло неотрицателно число N.
+След това получавате N на брой цели числа.
+
+Трябва да изкарате едно след друго всяко второ число, и след това всяко трето число.
+Броим позициите на числата от 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|
+
+## Задача 2
+
+Получавате и запазвате цели числа, докато не получите числото 0.
+След 0-та ще получите още едно цяло число R.
+
+Трябва да направите "ротация" на числата: отмествате позицията на всяко число с R на брой позиции (напред или назад) и ако новия индекс на число е твърде голям или малък, вмъкваме числото в другия край на масива.
+
+Тоест, ако имаме масив с числата "9 1 3 5" и имаме отместване 2, тогава 9 ще отиде на индекс 2, 1 на индекс 3, 3 трябва да отиде на индекс 4, обаче това ще е извън масива, затова то отива на индекс 0, 5 трябва да отиде на индекс 5, обаче ще е извън масива, затова отива на индекс 1.
+
+След ротацията трябва да изкарате числата на екрана.
+
+**Примери:**
+
+|Вход|Изход|
+|----|-----|
+|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|
+
+
+## Задача 4
+
+Започвате с масив с размер 4.
+Получавате цели числа от входа, докато не получите числото 0.
+Първо вкарвате числата на четните индекси, след като се запълнят, вкарвате на нечетните, и след като и те се запълнят, удвоявате размера на масива и продължавате вкарването както преди (в празната част на масива).
+
+Накрая трябва да изкарате получената редица стойности.
+При изкарване трябва да пропуснете незапълнени клетки.
+
+**Примери:**
+
+|Вход|Изход|
+|----|-----|
+|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".
+
+Друг начин по който да го разберем, е че първото число е на първа позиция, второто число е на последната, третото число е на втора позиция, четвъртото е на предпоследна и так. нат.
+Обаче ние не знаем финалния размер на масива, затова се нуждаем от логиката с чертата.
+
+&&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|
+
+## Задача 6
+
+Трябва да направите интерпретатор за програмния език [brainfuck](https://en.wikipedia.org/wiki/Brainfuck).
+В него имате 8 команди/инструкции, всяка от които се изразява с един знак.
+
+Запазвате в паметта няколко неща: вашата brainfuck програма, паметта на "машината", къде се намирате в програмата и къде се намирате в паметта на "машината".
+Започвате, като се намирате на първи знак от brainfuck програмата, и първа позиция във вашата памет.
+Поглеждате знак от brainfuck програмата, изпълнявате действието му и (с две изключения) отивате на следващия знак в програмата и така.
+За предпочитане е, типа данни в паметта на "машината" да запазва само един байт информация.
+
+Самите команди (знаци), които съставят една brainfuck програма са:
+
+- `>`: сегашната клетка (къде се намирате в паметта на "машината") става тази в дясно
+- `<`: сегашната клетка става тази в ляво
+- `+`: инкрементира стойността в сегашната клетка с едно
+- `-`: декрементира стойността в сегашната клетка с едно
+- `.`: изкарва стойността в сегашната клетка (като число)
+- `,`: приема от входа едно число и го записва в сегашната клетка
+- `[`: ако стойността в сегашната клетка е 0, тогава програмата "скача" напред към знака след съответната `]`
+- `]`: ако стойността в сегашната клетка не е 0, тогава програмата "скача" назад към знака след съответната `[`
+
+От входа ще получавате редица знаци, които ще съставят вашата brainfuck програма, като при знака `$` входът спира и трябва да започнете изпълнение на brainfuck кода.
+Не знаете колко памет на "машината" ще ви трябва, затова бъдете готови да я разширявате при нужда.
+
+**Пример:**
+
+|Вход|Изход|
+|----|-----|
+|+ + > + + + + + [ < + > - ] < . $|7|
+
+## Задача 7
+
+Нека да направим една игра, ще я наричамe "коридорен dungeon".
+Вие сте един герой и изследвате една редица от стаи.
+Всяка стая има врата към предходната и към следващата стая.
+
+Има три четири стаи: празна стая, стая със съкровище, стая с чудовище и стая, която има коридор към някоя друга далечна стая.
+
+Играчът започва с 10 точки живот и с меч, който взема 2 точки живот, когато използван.
+На всеки ход играчът има няколко възможни действия:
+
+- да отиде в следващата или предходната стая
+
+- ако има коридор, да отиде в другия край на коридора
+
+- ако в стаята има съкровище, може да го отвори.
+ Има 50% шанс да получи нов меч или точки живот.
+ Мечът може да взема между 1 и 30 точки живот.
+ Точките живот, които могат да се прибавят към досегашните, е между -5 и 20.
+ Има еднакъв шанс да се падне който и да е меч и какъвто и да е брой точки живот.
+ Ако изберете меч, той ще замени сегашния ви.
+
+- ако в стаята има чудовище, може да го атакува.
+ В един ход, играчът атакува чудовището и чудовището атакува играчът.
+ Няма как да знаете колко точки живот отнема една атака на чудовището, преди да ви е ударило.
+ Ако изберете да отидете в друга стая, никой няма да атакува никой.
+
+ На всеки ход, всяко живо чудовище избира на случаен принцип дали да остане в своята стая, дали да отиде в лявата или в дясната (шансът за всяка опция е еднакъв).
+ След като убиете едно чудовище, имате 25% шанс да получите телепортер, с него може да излезете от коридорния dungeon и да свършите играта.
+
+ Ако чудовище влезе в стая със съкровище, то го плячкосва и се губи.
+
+- ако притежавате телепортер, може да спрете играта
+
+Има 20% шанс една стая да има съкровище, 20% шанс да има чудовище, 10% шанс да има коридор и 50% шанс да бъде празна.
+При "създаване" на едно чудовище, то ще има между 20 и 30 точки живот, и оръжието му ще взема между 5 и 20 точки живот.
+Шанса за всяка от тези стойности е еднакъв.
+
+След всяко действие, вашият брой точки се увеличава.
+От съкровище, прибавяте броя точки при прибавяне към живот или броя живот който новият ви меч отнема.
+Прибавяте също всяка точка чивот, която сте отнели от чудовище, като убиване на чудовище ви носи допълнителни 10 точки.
+За всяка точка живот, която сте отнели от чудовище, получавате толкова на брой точки.
+Всеки допълнителен телепортер, извън първоначалния с който спирате играта, ви носи още 50 точки.
+
+На всеки ход трябва да изкарате броя точки живот на играча, броя точки живот които меча му отнема, сегашната стая в която се намира, левите 5 стаи и десните 5 стаи.
+Една стая е изобразена със знака `?` ако не е посетена, ` ` ако е празна, `c` ако има съкровище, `m` ако има чудовище и `t` ако има тунел.