diff options
| Commit | b18ee19d02e2c29e057b896df9ae8b3dfca2777c (patch) | |
|---|---|---|
| Author | 2025-12-17 22:47:10 +0200 | |
| Committer | 2025-12-17 22:47:10 +0200 | |
| Files | ca559f9c93d1705776f9aca48998497a0a299956 /src/teaching | |
| syndamia.com-b18ee19d02e2c29e057b896df9ae8b3dfca2777c.tar syndamia.com-b18ee19d02e2c29e057b896df9ae8b3dfca2777c.tar.gz syndamia.com-b18ee19d02e2c29e057b896df9ae8b3dfca2777c.zip | ||
| Parent | ac143884288299e251444b2d617f9275eafc8513 (diff) | |
feat(teaching/upp-2025/w12): Add exercises
2 files changed, 453 insertions, 0 deletions
| -rw-r--r-- | src/teaching/upp-2025/index.du | 10 | ||||
| -rw-r--r-- | src/teaching/upp-2025/week12/index.du | 443 |
diff --git a/src/teaching/upp-2025/index.du b/src/teaching/upp-2025/index.du index c7f9ce2..1d952a2 100644 --- a/src/teaching/upp-2025/index.du +++ b/src/teaching/upp-2025/index.du @@ -154,3 +154,13 @@ [url ./week11 Задачи] || [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11 Решения] || [url https://classroom.github.com/a/z_C3UMi8 GitHub Classroom] + +|: 12 +|: 18.12.2025 +|: Низове + +|: +|: +|: +[url ./week12 Задачи] +|| [url https://classroom.github.com/a/zvYPAVPS GitHub Classroom] diff --git a/src/teaching/upp-2025/week12/index.du b/src/teaching/upp-2025/week12/index.du new file mode 100644 index 0000000..50dae61 --- /dev/null +++ b/src/teaching/upp-2025/week12/index.du @@ -0,0 +1,443 @@ +# Задачи - УПП, Седмица 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. |