'def title Задачи - УПП, Седмица 6, 10.11.2023 'def desc Условия на задачите за упражнение # {title} \n GitHub classroom: {url classroom.github.com/a/BBLlWMOy;https://classroom.github.com/a/BBLlWMOy} ## Задача 1 Първо получавате две цели положителни числа: N и M. След това ще получите редица числа, първите ще отговарят на матрица NxM (N реда, M стълба), вторите на матрица MxN. Трябва да умножите първата матрица по втората, както следва обикновенното правило за умножение ред по стълб и да изкарате резултата на екрана. N и M са между 1 и 60. {b Пример:} :table :2 |= Вход |= Изход |: ``` 4 3 8 1 9 0 3 0 4 7 5 6 9 0 9 5 7 3 6 7 2 0 1 3 3 7 |: ``` 87 74 85 87 18 21 6 0 83 84 57 47 108 93 60 18 ## Задача 2 Разглеждаме числатата от 0 до N. За всяко число знаем колко интервала го включват (покриват). Тоест в {` 0 1 1 0} означава, че 0 интервала "покриват" числото 0, един интервал покрива числото 1, един интервал покрива числото 2 и 0 покриват числото 3. Търси се колко различни интервала имаме. Не различаваме между два долепени интервала и един дълъг интервал. От входа получаввате N (от 1 до 30), и след това N на брой числа: броя покриващи интервали за всички числа от 0 до N-1. {b Примери:} :table :2 |= Вход |= Изход |: ``` 5 1 1 0 1 1 |: 2 |: ``` 5 1 2 1 2 1 |: 3 |: ``` 5 9 5 2 9 0 |: 16 |: ``` 11 1 1 2 3 2 2 4 2 1 1 1 |: 5 ## Задача 3 Трябва да имплементирате дигитална версия на морски шах. Всяка клетка е номерирана от 1 до 9, както на мобилен телефон или калкулатор. В началото изкарвате (празното) игрално поле, първо играе Х, след това О, и се редуват докато не завърши играта. След като един играч избере своя ход, трябва да покажете игралното поле. Ако след това излезе, че някой играч е спечелил, трябва да изкарате "PLAYER wins!" (където PLAYER е X или O) и да спрете програмата. В случай, че игралното поле се запълни и никой не е спечелил, след последното му изкарване трябва да върнете "Draw!" и да спрете програмата. {b Пример:} {i Смесен вход/изход, вход е означен с "$ " преди него} ``` 'snippet 1 $ ./ex3-io.txt {b Бонус:} направете го да работи с NxN брой клетки, като N е число между 1 и 50. ## Задача 4 Имплементирайте играта {url chomp;https://en.wikipedia.org/wiki/Chomp}: представете си, че имаме един шоколад, разделен на NxM квадратчета. Всеки играч избира квадратче (координати), след това изяжда всички парчета, които са в дясно или надолу от квадратчето. Играчът, който изяде квадратчето в горния ляв ъгъл губи играта. От входа получавате две числа, N и M, това е броя редове и колони в шоколада. След това изкарвате шоколада, като с # маркирате неизядено квадратче, а с шпация - изядено. Редуват се първия и втория играч, като всеки въвежда две числа - координати в шоколада (между 1 и N за реда и 1 и M за колоната). Когато някой изяде парчето в горния ляв ъгъл, програмата изкарва "PLAYER wins!" (PLAYER е 1 или 2) и спира изпълнение. {b Пример} {i Смесен вход/изход, вход е означен с "$ " преди него} ``` 'snippet 1 $ ex4-io.txt ## Задача 5 {b Тази задача е много трудна, proceed with caution!} Ще имплементираме програма, която "симулира" един елементарен компютър. Компютъра ни, като всеки друг, работи само и единствено с цели неотрицателни числа. Неговата (използваема) памет е разделена на две части: два "регистъра", наречени А и B, и "RAM" памет (един масив) с 128 стойности. В началото въвеждаме програма (разбира се това са числа), която трябва да бъде поставена в RAM паметта. Първото число е инструкция, следващите няколко числа са нейни аргументи, и след това имаме друга инструкция. Започваме изпълнение от началото на паметта, след като изпълним една инструкция, изпълняваме тази директно до нея, и така докато не стигнем инструкцията "EXT". В такъв случай, изкарваме стойността в регистър B и спираме програмата. Това са командите, описани във формата "D - {` A B C}", като D е число, съответстващо на инструкцията с име {` A} (името го използваме за нас, в кода то не присъства) и аргументи след името {` B} и {` C}. {` MEMORY} е число, съответстващо на индекс (адрес) в паметта на компютъра (между 0 и 127), а {` VALUE} е произволна числова стойност. :unordered - 0 - {` EXT} - край на изпълнението на програмата в симулирания компютър - 1 - {` INC MEMORY} - инкрементира стойността на индекс {` MEMORY}\n Пример: {` 0 2} - инкрементира стойността на индекс 2 - 2 - {` RIN VALUE MEMORY} - инкрементира стойността на индекс {` VALUE + MEMORY}\n Пример: {` 1 3 6} - инкрементира стойността на адрес {` 3 + 6 = 9} - 3 - {` DEC MEMORY} - декрементира стойността на индекс {` MEMORY} - 4 - {` RDE VALUE MEMORY} - декрементира стойността на индекс {` VALUE + MEMORY} - 5 - {` STA MEMORY} - запазва стойността на индекс {` MEMORY} в регистъра А\n Пример: {` 4 19} - запазва стойността на индекс 19 в регистъра А - 6 - {` RST VALUE MEMORY} - запазва стойността на адрес {` VALUE + MEMORY} в регистър А\n Пример: {` 5 2 14} - запазва стойността на индекс {` 2 + 14 = 16} в регистър А - 7 - {` STB MEMORY} - запазва стойността на индекс {` MEMORY} в регистъра B - 8 - {` BEQ MEMORY} - продължава изпълнение от индекс {` MEMORY}, ако стойността в регистъра А е нула\n Пример: {` 7 8} - продължава изпълнение от индекс 8, ако стойността в регистър А е нула - 9 - {` BNE MEMORY} - продължава изпълнение от индекс {` MEMORY}, ако стойността в регистъра А не е нула В началото получавате N, това са броя числа, които съставят цялата програма. След това се въвеждат N числа, които са цялата програма. Ако по време на изпълнение стигнете до инструкция, която не е дефинирана, изкарвате "Error: undefined instruction!" и спирате програмата. Ако някой аргумент е индекс в паметта, обаче стойността му е извън обхвата на паметта, изкарвате "Error: invalid memory address!" и спирате програмата. Ако няма грешка и програмата успешно стигне до {` EXT} инструкция, както беше казано, изкарваме на екрана стойността в регистъра B. {b Примери:} :table :2 |= Вход |= Изход |: 3 10 8 0 |: Error: undefined instruction! |: 3 5 8000 0 |: Error: invalid memory address! |: 6 1 3 7 3 0 958 |: 959 |: 17 5 9 8 6 1 8 3 9 5 9 9 2 7 8 0 91461 772000 |: 863461 .question Какво прави последната програма? {b Бонус:} направете програми за симулаторния компютър, които .ordered 1. умножават числата 87401 и 37 2. намира сумата на числата 87, 305, 2, 612, 222