Задачи - УПП, Седмица 8, 24.11.2023

GitHub classroom: 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. В него имате 8 команди/инструкции, всяка от които се изразява с един знак.

Запазвате в паметта няколко неща: вашата brainfuck програма, паметта на “машината”, къде се намирате в програмата и къде се намирате в паметта на “машината”. Започвате, като се намирате на първи знак от brainfuck програмата, и първа позиция във вашата памет. Поглеждате знак от brainfuck програмата, изпълнявате действието му и (с две изключения) отивате на следващия знак в програмата и така. За предпочитане е, типа данни в паметта на “машината” да запазва само един байт информация.

Самите команди (знаци), които съставят една brainfuck програма са:

От входа ще получавате редица знаци, които ще съставят вашата brainfuck програма, като при знака $ входът спира и трябва да започнете изпълнение на brainfuck кода. Не знаете колко памет на “машината” ще ви трябва, затова бъдете готови да я разширявате при нужда.

Пример:

Вход Изход
+ + > + + + + + [ < + > - ] < . $ 7

Задача 7

Нека да направим една игра, ще я наричамe “коридорен dungeon”. Вие сте един герой и изследвате една редица от стаи. Всяка стая има врата към предходната и към следващата стая.

Има три четири стаи: празна стая, стая със съкровище, стая с чудовище и стая, която има коридор към някоя друга далечна стая.

Играчът започва с 10 точки живот и с меч, който взема 2 точки живот, когато използван. На всеки ход играчът има няколко възможни действия:

Има 20% шанс една стая да има съкровище, 20% шанс да има чудовище, 10% шанс да има коридор и 50% шанс да бъде празна. При “създаване” на едно чудовище, то ще има между 20 и 30 точки живот, и оръжието му ще взема между 5 и 20 точки живот. Шанса за всяка от тези стойности е еднакъв.

След всяко действие, вашият брой точки се увеличава. От съкровище, прибавяте броя точки при прибавяне към живот или броя живот който новият ви меч отнема. Прибавяте също всяка точка чивот, която сте отнели от чудовище, като убиване на чудовище ви носи допълнителни 10 точки. За всяка точка живот, която сте отнели от чудовище, получавате толкова на брой точки. Всеки допълнителен телепортер, извън първоначалния с който спирате играта, ви носи още 50 точки.

На всеки ход трябва да изкарате броя точки живот на играча, броя точки живот които меча му отнема, сегашната стая в която се намира, левите 5 стаи и десните 5 стаи. Една стая е изобразена със знака ? ако не е посетена, ако е празна, c ако има съкровище, m ако има чудовище и t ако има тунел.