'def title Задачи - УПП, Седмица 11, 11.12.2025 'def desc Условията на задачите за упражнение. # {title} {pagenav 7 min;10 December 2025;14 December 2025} :question Има два начина да приемем низ от входа: ```cpp cin.getline(char*, size_t, char); ```cpp cin.get(char&); Кога бихме избрали всеки от тях? GitHub Classroom: [url https://classroom.github.com/a/z_C3UMi8] ## За решаване ### Задача 1 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise01.cpp} От входа получавате 20 буквен низ: име. Трябва да изкарате съобщението "Hello {i [име]}!" :table :2 |= Вход |= Изход |: John |: Hello John! |: Aleksandur |: Hello Aleksandur! ### Задача 2 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise02.cpp} От входа получавате изречение: низ, завършващ на точка. Трябва да изкарате броя букви (малки или големи) в изречението. :table :2 |= Вход |= Изход |: This is a very long sentence. |: 23 |: I'm 73 years old. |: 10 ### Задача 3 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise03.cpp} От входа получавате изречение: низ, завършващ на точка. Трябва да изкарате броя полета в низа. Поле наричаме всяка последователност от букви, която не съдържа знака шпация. Изключвайте крайната точка в бройката на полетата. .note {i (14.12.2025)} Добавени точки в края на изреченията. :table :2 |= Вход |= Изход |: {` first second third fourth.} |: 4 |: {` I'm glad you're here.} |: 4 |: {` a b c d 8 k * * .} |: 8 ### Задача 4 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise04.cpp} От входа получавате текст, докато не срещнете първия празен ред. Трябва да изкарате броя редове в текста. :table :2 |= Вход |= Изход |: ``` First line Second line Third line\n |: 3 |: ``` Day had broken cold and grey, exceedingly cold and grey, when the man turned aside from the main Yukon trail and climbed the high earth-bank, where a dim and little-travelled trail led eastward through the fat spruce timberland.\n |: 4 ### Задача 5 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise05.cpp} От входа получавате низ, завършващ на двоеточие и след това две реални числа. За всяко срещане на думата "sum" в низа, трябва да изкарате сумата на числата, и за всяко срещане на "sub" в низа, трябва да изкарате разликата на числата. :table :2 |= Вход |= Изход |: sum: 5.5 0.5 |: 6 |: sub: 2 3 |: -1 |: Here is the sum of the two numbers: 3.14 4.13 |: 7.27 |: We can sum, subtract and sum again: 1 2 |: 3 -1 3 ### Задача 6 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise06.cpp} От входа получавате ред, обозначаващ число в 16-тича бройна система. Тоест, реда започва с {` 0x} и останалото са 16-тични цифри. Трябва да изкарате стойността на числото в 10-тична бройна система, {b като направите конвертирането ръчно!} Тоест {b не е позволено да използвате функционалност от стандартната библиотека!} Приемете, че буквите A-F са главни и че няма да имате водещи нули (напр. {` 0x0001}). :table :2 |= Вход |= Изход |: 0x8 |: 8 |: 0x9 |: 9 |: 0xA |: 10 |: 0xF |: 15 |: 0x10 |: 16 |: 0xFF |: 255 |: 0xABCDEF |: 11259375 |: 0x5F3759DF |: 1597463007 ### Задача 7 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise07.cpp} От входа получавате 5 буквен низ и след това един ред текст. Трябва да изкарате всички срещания на първия низ във втория (като препокривания са позволени). :table :2 |= Вход |= Изход |: ``` abcde One abcde twoabcdethree four five abcde |: 3 |: ``` aaaaa aaaaaaaaaaaaaaaaaaaa |: 16 ### Задача 8 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise08.cpp} От входа получавате букви, докато не срещнете низа "end". Трябва да изкарате всички полета в обратен ред. Поле наричаме всяка последователност от букви, която не съдържа шпация. :table :2 |= Вход |= Изход |: One two three end |: end three two One |: They said he is free on the weekend |: weekend the on free is he said They ### Задача 9 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise09.cpp} От входа получавате две полета, съставени от главни и малки латински букви. Трябва да върнете общата бройка срещания на всяка буква от второто поле в първото. :table :2 |= Вход |= Изход |: aAAbbbb aA |: 3 |: z ZZ |: 0 ## За упражнение ### Задача 10 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise10.cpp} От входа получавате ред с текст. Трябва да върнете дали е {url панграма;https://bg.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BD%D0%B3%D1%80%D0%B0%D0%BC%D0%B0} на латинската азбука: дали всяка буква се среща поне веднъж (без значение дали е главна или малка). :table :2 |= Вход |= Изход |: The quick brown fox jumps over the lazy dog. |: Pangram |: Pack my box with five dozen liquor jugs. |: Pangram |: Echo-changes every Thursday |: Not a pangram ### Задача 11 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise11.cpp} От входа получавате два реда. Трябва да премахнете всяко срещане на втория ред в първия и да изкарате резултата. :table :2 |= Вход |= Изход |: ``` This is a very nice evening i |: ``` Ths s a very nce evenng |: ``` Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo buffalo |: ``` Buffalo Buffalo Buffalo ### Задача 12 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise12.cpp} От входа получавате ред с текст. Зачитайки го за парола, трябва да върнете колко силна е паролата. Това са следните критерии, като всеки критерии добавя единица към общата оценка на паролата: .numbered 1. Съдържа поне 15 букви 2. Не съдържа съседни еднакви знаци 3. Да съдържа поне една малка и главна латинска буква 4. Да съдържа поне една цифра 5. Да съдържа поне един знак, различен от цифра или буква Накрая тряба да върнете оценката на паролата. .note {i (14.12.2025)} Оправени оценки в примерите :table :2 |= Вход |= Изход |: hi |: 2 |: aa |: 1 |: Hello@World15 |: 3 |: Ny$wtgYH62uTy@d |: 5 ### Задача 13 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise13.cpp} Хешираща функция е функция, която превръща низ в число. Една много често използвана е функцията на {url Fowler-Noll-Vo;https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function}. Тя работи по следния начин: .bulleted - началната стойност за хеша се нарича "offset basis" - за всяка буква (без терминиращата нула): .numbered 1. умножаваме текущия хеш по простото число на FNV (и обновяваме текущя хеш) 2. на текущия хеш, пресмятаме неговото побитово изключващо или с текущата буква Използвайки 32-битовите offset basis (2166136261) и FNV простото число (16777619), изкарайте хешираната стойност на подадения ред текст. .note {i (14.12.2025)} Поправен хеш на последния пример. :table :2 |= Вход |= Изход |: {` Hello World} |: 310551791 |: {` Nothing} |: 383317984 |: {` !} |: 84696382 |: {` The most effective debugging tool is still careful thought, coupled with judiciously placed print statements.} |: 2408366471 ### Задача 14 .solution-link {url Решение;https://github.com/Syndamia/upp-2025-solutions/tree/main/Week11/Exercise14.cpp} От входа получавате два реда с текст. Трябва да върнете дали първия ред е {url анаграма;https://en.wikipedia.org/wiki/Anagram} на втория, тоест дали втория низ може да се получи след някакво разместване на всички (латински) букви в първия низ. Игнорирайте дали буквата е главна или малка. :table :2 |= Вход |= Изход |: ``` New York Times monkeys write |: Anagram |: ``` barn yarn |: Not an anagram |: ``` evil vile |: Anagram |: ``` manually by hand |: Not an anagram |: ``` Tom Marvolo Riddle I am Lord Voldemort |: Anagram ## За любознателните ### Задача 15 От входа получавате два реда с текст. Трябва да пресметнете {url разстоянието на Ливенщайн;https://en.wikipedia.org/wiki/Levenshtein_distance} между тях. То се пресмята така: .numbered 1. Ако един от двата текущи низа е празен, връщаме 0 2. Ако първата буква от двата низа е еднаква, връщаме разстоянието на Ливенщайн от остатъка от низовете 3. Иначе, връщаме 1 плюс най-малкото от разстоянията на Лиевнщайн между: .bulleted - първия низ и остатъка на втория низ (без първата буква) - остатъка на първия низ (без първата буква) и втория низ - остатъците на двата низа (без първите им букви)