# Задачи - УПП, Седмица 12, 18.12.2025 'define expected-reading 14 min 'define created 17 December 2025 'define edited 17 December 2025 [$pagenav] GitHub Classroom: [url https://classroom.github.com/a/zvYPAVPS] ## За решаване ### Задача 1 [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 От входа получавате един ред текст. След това получавате положително число: брой колони (където всяка една колона съдържа един знак). Трябва да изкарате текста, "побран" в броя колони, като можете да разделяте реда само на празни разстояния. С други думи, не може да разделяте думи (полета) на повече от един ред! Ако има поле, което е по-дълго от броя колони, то ще запълни цял ред и ще "прелее" извън броя колони. :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 От входа получавате две полета (низове, които не съдържат шпации). След това получавате положително число: брой колони (където една колона съдържа един знак). Трябва да разположите двете полета в колоните така, че разстоянието между полетата и разтоянията между всяко поле и краищата са еднакви. С други думи, ако сме получили `[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 От входа получавате едно поле (последователност от букви, която не съдържа шпация). Трябва да върнете типа на полето, спрямо тези правила: .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 Модерните текстови редактори са визуални редактори: редактираш текста, който едновременно виждаш (подобно на лист хартия). Предшественик на тези редактори са [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:]= ``` *[Изход от "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"]* 4 curved from the pine-covered 5 island to the south. *[Изход от ".n"]* 2 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.