# Задачи - УПП, Седмица 12, 18.12.2025 'define expected-reading 14 min 'define created 17 December 2025 'define edited 23 December 2025 [$pagenav] 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. [=Тип "integer":=] може да започне с [`+`] или [`-`] и всички останали букви са цифри 2. [=Тип "float":=] може да започне с [`+`] или [`-`] и след това съдържа цифри и точка, която точка трябва да се намира между цифри (т.е. не е преди или след всички цифри) 3. [=Тип "word":=] ако съдържа само латински букви (главни или малки) 4. [=Тип "time":=] може да започне или завърши с "AM" или "PM", след това (допускайки че е започва с низа) съдържа 1-2 цифри (часа), които са между 0 и 24 вкл., знака двоеточие [`:`] и накрая завършва на две цифри (минутите), които са между 0 и 59 вкл. 5. [=Тип "percentage":=] започва с поне една цифра, като след първите цифри може да има точка и още цифри, и накрая завършва на знака [`%`] 6. [=Тип "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 https://www.gnu.org/software/ed/manual/ed_manual.html ed] #### Обсег и текущия ред Аргумента преди командата определя реда (редовете) върху който работим. За удобство ще наричаме това "обсега". Да се има впредвид, че броим редовете от 1. Ако обсега е изпуснат, командата се изпълнява върху "текущия ред". Това е просто номер на ред. Текущия ред по подразбиране е 0 ако няма въведен текст. Иначе, спрямо командата, най-често е реда, който последно сме добавили. Вижте командите за повече информация. Обсега за един ред е една от 3 типа стойности: .numbered 1. цяло число (последователност от цифри), която определя реда в текущия текст 2. [`.`], което обозначава текущия ред 3. [`$`], което обозначава последния ред във файла Ако въведем [=само=] обсег за един ред, то това обновява текущия ред. Имаме и обсег за няколко реда, който е във формата [`начало,край`]. [`начало`] и [`край`] са в същия формат като обсега за един ред. Тоест, това са два обсега за един ред, слепени със запетая. [`начало`] може да бъде пропуснато, в който случай по подразбиране е 1 (първия ред). [`край`] може да бъде пропуснато, в който случай по подразбиране е [`$`] (последния ред). Трябва да върнете съобщение за грешка, ако е подаден невалиден обсег за текущия текст. ### Командите Както казахме, всяка команда е една буква (след обсега) и потенциално има аргументи. Това са всички команди: .numbered 1. [`p`] - изкарва редовете в обсега 2. [`n`] - изкарва редовете в обсега, като преди всеки е поставен неговия номер на реда 3. [`d`] - изтрива редовете в обсега 4. [`а`] - добавя текст [=след=] всеки ред в обсега 5. [`i`] - добавя текст [=преди=] всеки ред в обсега 6. [`q`] - прекратява програмата Буквите, след командите [`a`] и [`i`] са текста, който трябва да бъде вмъкнат. Може да се вмъкне само по един ред текст. След въвеждане на ред чрез [`a`] или [`i`], текущия ред автоматично се обновява на ново-добавения ред. След изтриване на ред чрез [`d`], трябва да обновите текущия ред, само когато има смисъл. Например, ако текущия ред е 10 и изтриете ред 20, няма нужда от промяна. Ако текущия ред е 10 и изтриете редове 2 и 3, тогава текущия ред трябва да се намали с броя изтрите редове, а имменно, с 2, от 10 на 8. ### Примери Вход и изход не са смесени. Наклонения текст е допълнителен коментар на това, което се случва (тоест, вие не трябва да го подавате на вашата програма). [=Вход 1:=] ``` 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 [=Изход 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] [=Вход 2:=] ``` 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 [=Изход 2:=] ``` [*Изход от ",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. [*Изход от първото "p"*] On top of this ice were as many feet of snow. It was all pure white. [*Изход от второто "p"*] The Yukon lay a mile wide and hidden under three feet of ice. [*Изход от ",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] [=Вход 3:=] ``` 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 [=Изход 3:=] .note [=(23.12.2025)=] Поправен този изход ``` [*Изход от "3,5p"*] The one thing that relieved the whiteness was a thin dark line that cruved from the pine-covered [*Изход от ",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. [*Изход от ".,$p"*] curved from the pine-covered the whiteness was a thin dark line that island to the south. [*Изход от ".n"*] 3 curved from the pine-covered [*Изход от ",p"*] The one thing that relieved the whiteness was a thin dark line that curved from the pine-covered island to the south.