From 96e54f8fc044459ba8e00d196ccbc4bb45fdd948 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Fri, 24 Nov 2023 09:03:42 +0200 Subject: [te/upp-2023/w8] Added exercises --- src/teaching/upp-2023/index.md | 1 + src/teaching/upp-2023/week8/index.md | 167 +++++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+) create mode 100644 src/teaching/upp-2023/week8/index.md 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
19 6 2 100 96 54 56 39|6 100 54 39
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
78 97 21
67 9 37
67 11 89|13990 8670 7096| +|4
46 34 26 61
30 58 81 27
50 69 26 83
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` ако има тунел. -- cgit v1.3.1-23-gd82d