Задачи - УПП, Седмица 8, 24.11.2023
GitHub classroom: classroom.github.com/a/Big7FRUG
Трябва да използвате възможно най-малко памет във всички задачи!
Задача 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”.
Друг начин по който да го разберем, е че първото число е на първа позиция, второто число е на последната, третото число е на втора позиция, четвъртото е на предпоследна и так. нат. Обаче ние не знаем финалния размер на масива, затова се нуждаем от логиката с чертата.
Моля не правете решенето със запазване на входа и разместване на елементите
Напомням, че тази права само си я представяте. В началото масива е с размер 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. В него имате 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
ако има тунел.