diff options
| Commit | 7d9808f9606b96ef23468dfa41055f2ff395c1af (patch) | |
|---|---|---|
| Author | 2025-12-10 22:42:15 +0200 | |
| Committer | 2025-12-10 22:42:15 +0200 | |
| Files | 2b6afa43fcce4476501e5530b0004c0c3e7dd45c /src | |
| syndamia.com-7d9808f9606b96ef23468dfa41055f2ff395c1af.tar syndamia.com-7d9808f9606b96ef23468dfa41055f2ff395c1af.tar.gz syndamia.com-7d9808f9606b96ef23468dfa41055f2ff395c1af.zip | ||
| Parent | c74c9ea17f39fc0c55045dd72fd2b1da06757c4a (diff) | |
feat(teaching/upp-2025/w11): Add exercises
2 files changed, 411 insertions, 0 deletions
| -rw-r--r-- | src/teaching/upp-2025/index.du | 10 | ||||
| -rw-r--r-- | src/teaching/upp-2025/week11/index.du | 401 |
diff --git a/src/teaching/upp-2025/index.du b/src/teaching/upp-2025/index.du index 21e09c7..3014d73 100644 --- a/src/teaching/upp-2025/index.du +++ b/src/teaching/upp-2025/index.du @@ -143,3 +143,13 @@ [url ./week10 Задачи] || [url https://github.com/Syndamia/upp-2025-solutions/tree/main/Week10 Решения] || [url https://classroom.github.com/a/kDfmWmy7 GitHub Classroom] + +|: 11 +|: 11.12.2025 +|: Низове + +|: +|: +|: +[url ./week11 Задачи] +|| [url https://classroom.github.com/a/z_C3UMi8 GitHub Classroom] diff --git a/src/teaching/upp-2025/week11/index.du b/src/teaching/upp-2025/week11/index.du new file mode 100644 index 0000000..0cbb10a --- /dev/null +++ b/src/teaching/upp-2025/week11/index.du @@ -0,0 +1,401 @@ +# Задачи - УПП, Седмица 11, 11.12.2025 + +'define expected-reading 7 min +'define created 10 December 2025 +'define edited 10 December 2025 +[$pagenav] + +:question + +Има два начина да приемем низ от входа: + +```c++ +cin.getline(char*, size_t, char); + +```c++ +cin.get(char&); + +Кога бихме избрали всеки от тях? + + +GitHub Classroom: [url https://classroom.github.com/a/z_C3UMi8] + +## За решаване + +### Задача 1 + +От входа получавате 20 буквен низ: име. +Трябва да изкарате съобщението "Hello *[[име]]*!" + +:table_2 +|= Вход +|= Изход + +|: John +|: Hello John! + +|: Aleksandur +|: Hello Aleksandur! + + +### Задача 2 + +От входа получавате изречение: низ, завършващ на точка. +Трябва да изкарате броя букви (малки или големи) в изречението. + +:table_2 +|= Вход +|= Изход + +|: This is a very long sentence. +|: 23 + +|: I'm 73 years old. +|: 10 + + +### Задача 3 + +От входа получавате изречение: низ, завършващ на точка. +Трябва да изкарате броя полета в низа. + +Поле наричаме всяка последователност от букви, която не съдържа знака шпация. + +:table_2 +|= Вход +|= Изход + +|: `[first second third fourth]` +|: 4 + +|: `[I'm glad you're here!]` +|: 4 + +|: `[ a b c d 8 k * * ]` +|: 8 + + + +### Задача 4 + +От входа получавате текст, докато не срещнете първия празен ред. +Трябва да изкарате броя редове в текста. + +:table_2 +|= Вход +|= Изход + +|: +``` +First line +Second line +Third line + +|: 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. + +|: 4 + + +### Задача 5 + +От входа получавате низ, завършващ на двоеточие и след това две реални числа. +За всяко срещане на думата "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 + +От входа получавате ред, обозначаващ число в 16-тича бройна система. +Тоест, реда започва с `[0x]` и останалото са 16-тични цифри. + +Трябва да изкарате стойността на числото в 10-тична бройна система, =[като направите конвертирането ръчно!]= +Тоест =[не е позволено да използвате функционалност от стандартната библиотека!]= + +Приемете, че буквите A-F са главни и че няма да имате водещи нули (напр. `[0x0001]`). + +:table_2 +|= Вход +|= Изход + +|: 0x8 +|: 8 + +|: 0x9 +|: 9 + +|: 0xA +|: 10 + +|: 0xF +|: 15 + +|: 0x10 +|: 16 + +|: 0xFF +|: 255 + +|: 0xABCDEF +|: 11259375 + +|: 0x5F3759DF +|: 1597463007 + + +### Задача 7 + +От входа получавате 5 буквен низ и след това един ред текст. +Трябва да изкарате всички срещания на първия низ във втория (като препокривания са позволени). + +:table_2 +|= Вход +|= Изход + +|: +``` +abcde +One abcde twoabcdethree four five abcde + +|: 3 + +|: +``` +aaaaa +aaaaaaaaaaaaaaaaaaaa + +|: 16 + + +### Задача 8 + +От входа получавате букви, докато не срещнете низа "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 + +От входа получавате две полета, съставени от главни и малки латински букви. +Трябва да върнете общата бройка срещания на всяка буква от второто поле в първото. + +:table_2 +|= Вход +|= Изход + +|: aAAbbbb aA +|: 3 + +|: z ZZ +|: 0 + + +## За упражнение + +### Задача 10 + +От входа получавате ред с текст. +Трябва да върнете дали е [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 + +От входа получавате два реда. +Трябва да премахнете всяко срещане на втория ред в първия и да изкарате резултата. + +: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 + +От входа получавате ред с текст. +Зачитайки го за парола, трябва да върнете колко силна е паролата. + +Това са следните критерии, като всеки критерии добавя единица към общата оценка на паролата: +.numbered +1. Съдържа поне 15 букви +2. Не съдържа съседни еднакви знаци +3. Да съдържа поне една малка и главна латинска буква +4. Да съдържа поне една цифра +5. Да съдържа поне един знак, различен от цифра или буква + +Накрая тряба да върнете оценката на паролата. + +:table_2 +|= Вход +|= Изход + +|: hi +|: 1 + +|: aa +|: 0 + +|: Hello@World15 +|: 4 + +|: Ny$wtgYH62uTy@d +|: 5 + + +### Задача 13 + +Хешираща функция е функция, която превръща низ в число. +Една много често използвана е функцията на [url https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function Fowler-Noll-Vo]. + +Тя работи по следния начин: +.bulleted +- началната стойност за хеша се нарича "offset basis" +- за всяка буква (без терминиращата нула): + .numbered + 1. умножаваме текущия хеш по простото число на FNV (и обновяваме текущя хеш) + 2. на текущия хеш, пресмятаме неговото побитово изключващо или с текущата буква + +Използвайки 32-битовите offset basis (2166136261) и FNV простото число (16777619), изкарайте хешираната стойност на подадения ред текст. + +:table_2 +|= Вход +|= Изход + +|: `[Hello World]` +|: 310551791 + +|: `[Nothing]` +|: 383317984 + +|: `[!]` +|: 84696382 + +|: `[The most effective debugging tool is still careful thought, coupled with judiciously placed print statements.]` +|: 2174003109 + + +### Задача 14 + +От входа получавате два реда с текст. +Трябва да върнете дали първия ред е [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 + - първия низ и остатъка на втория низ (без първата буква) + - остатъка на първия низ (без първата буква) и втория низ + - остатъците на двата низа (без първите им букви) |