'def title Задачи - УПП, Седмица 12, 18.12.2025 'def desc Условията на задачите за упражнение. # {title} {pagenav 14 min;17 December 2025;23 December 2025} GitHub Classroom: {url https://classroom.github.com/a/zvYPAVPS} ## За решаване ### Задача 1 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise01.cpp} {url Шифъра на Цезар;https://en.wikipedia.org/wiki/Caesar_cipher} е античен шифър, при който всяка буква от азбуката се отмества и замества. Например, при отместване от 3, A става D, B става E, Z става C и така нататък. От входа получавате един ред с текст на английски, който е шифриран с шифъра на Цезар. Имплементирайте програма, която го дешифрира (и изкарва резултата). Начина е чрез "brute force", тоест да тествате всички възможни отмествания. Възползвайте се от факта, че петте най-срещани думи в английския език са "the", "be", "to", "of" и "and". Игнорирайте дали буквите са главни или малки във вашите проверки по време на дешифриране. :table :2 |= Вход |= Изход |: Vykly vm aol woluvpe |: Order of the phenoix |: Lg tw gj fgl lg tw |: To be or not to be |: AXV EXA AXTKBA ZLIA XKA DOXV TEBK qeb jxk qrokba xpfab colj qeb jxfk Vrhlk qoxfi |: DAY HAD DAWNED COLD AND GRAY WHEN the man turned aside from the main Yukon trail ### Задача 2 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise02.cpp} От входа получавате един ред текст. След това получавате положително число: брой колони (където всяка една колона съдържа един знак). Трябва да изкарате текста, "побран" в броя колони, като можете да разделяте реда само на празни разстояния. С други думи, не може да разделяте думи (полета) на повече от един ред! Ако има поле, което е по-дълго от броя колони, то ще запълни цял ред и ще "прелее" извън броя колони. :table :2 |= Вход |= Изход |: ``` First second third 9 |: ``` First second third |: ``` Hello World 1 |: ``` Hello World |: ``` a b c d e f g h i j k l 5 |: ``` a b c d e f g h i j k l |: ``` It was nine o'clock in the morning. There was no sun or promise of sun, although there was not a cloud in the sky. It was a clear day. 19 |: ``` It was nine o'clock in the morning. There was no sun or promise of sun, although there was not a cloud in the sky. It was a clear day. ### Задача 3 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise03.cpp} От входа получавате две полета (низове, които не съдържат шпации). След това получавате положително число: брой колони (където една колона съдържа един знак). Трябва да разположите двете полета в колоните така, че разстоянието между полетата и разтоянията между всяко поле и краищата са еднакви. С други думи, ако сме получили {` Hello}, {` World} и 25 колони, трябва да изкараме следния низ (където {` |} обграждат всичките колони): ``` | Hello World | Разстоянието между {` |} и {` H} е същото като между {` o} и {` W}, и между {` d} и {` |}, а иммено 5 шпации. Когато разстоянията не могат да са точни, трябва или средното да е по-късото, или и двата края да са по-къси. Ако буквите в думите са повече от броя колоните, тогава изкарайте думите слепени. :table :2 |= Вход |= Изход |: Hello World 24 |: ``` Hello World |: Hello World 23 |: ``` Hello World |: Hello World 22 |: ``` Hello World |: Today Is 20 |: ``` Today Is |: Lorem ipsum 3 |: ``` Loremipsum |: Lorem ipsum 11 |: ``` Lorem ipsum ### Задача 4 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise04.cpp} От входа получавате едно поле (последователност от букви, която не съдържа шпация). Трябва да върнете типа на полето, спрямо тези правила: .ordered 1. {b Тип "integer":} може да започне с {` +} или {` -} и всички останали букви са цифри 2. {b Тип "float":} може да започне с {` +} или {` -} и след това съдържа цифри и точка, която точка трябва да се намира между цифри (т.е. не е преди или след всички цифри) 3. {b Тип "word":} ако съдържа само латински букви (главни или малки) 4. {b Тип "time":} може да започне или завърши с "AM" или "PM", след това (допускайки че е започва с низа) съдържа 1-2 цифри (часа), които са между 0 и 24 вкл., знака двоеточие {` :} и накрая завършва на две цифри (минутите), които са между 0 и 59 вкл. 5. {b Тип "percentage":} започва с поне една цифра, като след първите цифри може да има точка и още цифри, и накрая завършва на знака {` %} 6. {b Тип "other"}, когато не можем да го свържем с никое от горните правила :table :2 |= Вход |= Изход |: 5 |: integer |: +582 |: integer |: -83 |: integer |: +5.55 |: float |: 70. |: other |: -.99 |: other |: Hello |: word |: w*rld |: other |: 12:00 |: time |: PM1:08 |: time |: 4:04AM |: time |: 55:28 |: other |: 16:60 |: other |: 0% |: percentage |: 99.99% |: percentage |: .95% |: other |: 50.% |: other ### Задача 5 От входа получавате две положителни цели числа: месец и година. Трябва да изкарате календарния месец в следния формат: ``` Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Като дните трябва да са коректно подравнени. :table :2 |= Вход |= Изход |: 12 2025 |: ``` Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |: 8 2024 |: ``` Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |: 9 2001 |: ``` Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |: 2 2020 |: ``` Mo Tu We Th Fr Sa Su 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ## За самоподготовка ### Задача 6 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week12/Exercise06.cpp} Модерните текстови редактори са визуални редактори: редактираш текста, който едновременно виждаш (подобно на лист хартия). Предшественик на тези редактори са {url редовите редактори;https://en.wikipedia.org/wiki/Line_editor}: пускаш редица команди, всяка от които променя текста по някакъв начин. Минуса е, че не нямаш курсор с който да правиш промените директно, това да видиш текста и да го редактираш са отделни команди, които трябва да изписваш всеки път. Плюса е, че реализацията е много по-проста и лесно се правят автоматизации/скриптове. От входа получавате редове с команди. Всяка команда е еднобуквена и може да има аргументи преди и след себе си. Трябва да изпълните всяка команда или да изкарате съобщение за грешка, ако командата е невалидна. .question За любознателните: дизайна на този редактор е базиран на {url ed;https://www.gnu.org/software/ed/manual/ed_manual.html} #### Обсег и текущия ред Аргумента преди командата определя реда (редовете) върху който работим. За удобство ще наричаме това "обсега". Да се има впредвид, че броим редовете от 1. Ако обсега е изпуснат, командата се изпълнява върху "текущия ред". Това е просто номер на ред. Текущия ред по подразбиране е 0 ако няма въведен текст. Иначе, спрямо командата, най-често е реда, който последно сме добавили. Вижте командите за повече информация. Обсега за един ред е една от 3 типа стойности: .numbered 1. цяло число (последователност от цифри), която определя реда в текущия текст 2. {` .}, което обозначава текущия ред 3. {` $}, което обозначава последния ред във файла Ако въведем {b само} обсег за един ред, то това обновява текущия ред. Имаме и обсег за няколко реда, който е във формата {` начало,край}. {` начало} и {` край} са в същия формат като обсега за един ред. Тоест, това са два обсега за един ред, слепени със запетая. {` начало} може да бъде пропуснато, в който случай по подразбиране е 1 (първия ред). {` край} може да бъде пропуснато, в който случай по подразбиране е {` $} (последния ред). Трябва да върнете съобщение за грешка, ако е подаден невалиден обсег за текущия текст. ### Командите Както казахме, всяка команда е една буква (след обсега) и потенциално има аргументи. Това са всички команди: .numbered 1. {` p} - изкарва редовете в обсега 2. {` n} - изкарва редовете в обсега, като преди всеки е поставен неговия номер на реда 3. {` d} - изтрива редовете в обсега 4. {` а} - добавя текст {b след} всеки ред в обсега 5. {` i} - добавя текст {b преди} всеки ред в обсега 6. {` q} - прекратява програмата Буквите, след командите {` a} и {` i} са текста, който трябва да бъде вмъкнат. Може да се вмъкне само по един ред текст. След въвеждане на ред чрез {` a} или {` i}, текущия ред автоматично се обновява на ново-добавения ред. След изтриване на ред чрез {` d}, трябва да обновите текущия ред, само когато има смисъл. Например, ако текущия ред е 10 и изтриете ред 20, няма нужда от промяна. Ако текущия ред е 10 и изтриете редове 2 и 3, тогава текущия ред трябва да се намали с броя изтрите редове, а имменно, с 2, от 10 на 8. ### Примери Вход и изход не са смесени. Наклонения текст е допълнителен коментар на това, което се случва (тоест, вие не трябва да го подавате на вашата програма). {b Вход 1:} ``` 'emplace aThe man looked along the way he had come. aThe Yukon lay a mile wide and hidden under three feet of ice. aOn top of this ice were as many feet of snow. It was all pure white. ,p q 'endemplace {b Изход 1:} ``` The man looked along the way he had come. The Yukon lay a mile wide and hidden under three feet of ice. On top of this ice were as many feet of snow. It was all pure white. {br1} {b Вход 2:} ``` 'emplace aThe Yukon lay a mile wide and hidden under three feet of ice. iThe man looked along the way he had come. $aOn top of this ice were as many feet of snow. It was all pure white. ,2n p 2 p ,i ,p q 'endemplace {b Изход 2:} ``` {i Изход от ",2n"} 1 The man looked along the way he had come. 2 The Yukon lay a mile wide and hidden under three feet of ice. {i Изход от първото "p"} On top of this ice were as many feet of snow. It was all pure white. {i Изход от второто "p"} The Yukon lay a mile wide and hidden under three feet of ice. {i Изход от ",p"}\n The man looked along the way he had come.\n The Yukon lay a mile wide and hidden under three feet of ice.\n On top of this ice were as many feet of snow. It was all pure white. {br1} {b Вход 3:} ``` 'emplace aNorth and south, as far as his eye could see, ait was unbroken white. aThe one thing that relieved athe whiteness was a thin dark line that acruved from the pine-covered aisland to the south. 3,5p 5 d ,n icurved from the pine-covered .,$p 1,2d .n ,p q 'endemplace {b Изход 3:} .note {b (23.12.2025)} Поправен този изход ``` {i Изход от "3,5p"} The one thing that relieved the whiteness was a thin dark line that cruved from the pine-covered {i Изход от ",n"} 1 North and south, as far as his eye could see, 2 it was unbroken white. 3 The one thing that relieved 4 the whiteness was a thin dark line that 5 island to the south. {i Изход от ".,$p"} curved from the pine-covered the whiteness was a thin dark line that island to the south. {i Изход от ".n"} 3 curved from the pine-covered {i Изход от ",p"} The one thing that relieved the whiteness was a thin dark line that curved from the pine-covered island to the south.