diff options
| Commit | 804e466bd01a907eca21b70060f35a24c5469233 (patch) | |
|---|---|---|
| Author | 2023-12-01 09:20:29 +0200 | |
| Committer | 2023-12-01 09:20:29 +0200 | |
| Files | a3a349cfef4851b7ea19d0b0dc731e7079502e0c | |
| syndamia.com-804e466bd01a907eca21b70060f35a24c5469233.tar syndamia.com-804e466bd01a907eca21b70060f35a24c5469233.tar.gz syndamia.com-804e466bd01a907eca21b70060f35a24c5469233.zip | ||
| Parent | 11a6c3776e148e89387fdda7e90867661cecded5 (diff) | |
[te/upp-2023/w9] Added exercises
2 files changed, 175 insertions, 0 deletions
| -rw-r--r-- | src/teaching/upp-2023/index.md | 1 | ||||
| -rw-r--r-- | src/teaching/upp-2023/week9/index.md | 174 |
diff --git a/src/teaching/upp-2023/index.md b/src/teaching/upp-2023/index.md index 7c12f19..651df4e 100644 --- a/src/teaching/upp-2023/index.md +++ b/src/teaching/upp-2023/index.md @@ -26,3 +26,4 @@ |6 |10.11.2023|[Задачи](./week6) \|\| [GitHub classroom](https://classroom.github.com/a/BBLlWMOy)| |7 |17.11.2023|[Задачи](./week7) \|\| [GitHub classroom](https://classroom.github.com/a/m5M2_CWD)| |8 |24.11.2023|[Задачи](./week8) \|\| [GitHub classroom](https://classroom.github.com/a/Big7FRUG)| +|9 |01.12.2023|[Задачи](./week9) \|\| [GitHub classroom](https://classroom.github.com/a/lGXxCRZO)| diff --git a/src/teaching/upp-2023/week9/index.md b/src/teaching/upp-2023/week9/index.md new file mode 100644 index 0000000..86e7cca --- /dev/null +++ b/src/teaching/upp-2023/week9/index.md @@ -0,0 +1,174 @@ +# Задачи - УПП, Седмица 9, 01.12.2023 + +GitHub classroom: [classroom.github.com/a/lGXxCRZO](https://classroom.github.com/a/lGXxCRZO) + +&&warn Освен ако не е казано друго, може да зачитате, че максималната дължина на един низ е 1024 знака. + +## Задача 1 + +Получавате от входа два низа. +Трябва да изкарате на екрана низ, при който има знакът "\_" на индексите, където буквите между двата низа се различават, и съответната буква, когато не се различават. + +**Пример:** + +|Вход|Изход| +|----|-----| +|ABCDE<br>AKDDCP|A\_\_D\_\_| + +## Задача 2 + +От входа получавате число N и на следващия ред получавате низ с толкова на брой знака. +Изкарайте на екрана втората половина от низа и след това директно долепена първата половина. +Ако низа е с нечетна дължина, зачитаме средния елемент като част от втората половина. + +&&important Трябва да използвате динамична памет + +**Примери:** + +|Вход|Изход| +|----|-----| +|6<br>A CM N|M NA C| +|7<br>ABCKLMN|KLMNABC| + +## Задача 3 + +От входа получаввате един низ, трябва да изкарате броя думи в него. +Думите се разделят с една или повече шпации, като знаци (точка, запетая, удивителна, ...) не са думи. + +**Примери:** + +|Вход|Изход| +|----|-----| +|abc|1| +|abc def|2| +|<pre>This , is , a , sentence .!</pre>|4| + +## Задача 4 + +Една от ранните програми за Apple I компютърът, написана от Steve Wozniak в упътването на компютъра, е така наречената "Woz Monitor", или wozmon за картко. +Тя позволява да погледнеш стойностите в клетки от паметта, да запишеш стойности и да стартираш програми. + +Игнорирайки последната му възможност, нека да го имплементираме. +За нашите цели, паметта на компютъра е просто един масив, които ще расте **когато е нужно**. +Ще адресираме (индексираме) стойностите от масива с числа от 16-тична бройна система. + +Когато въведем низ във формата: + +- "адрес", без нищо друго на реда, изкарваме "X: V", където X е конкретния адрес (пак в 16-тична бройна система) и V е стойността на клетката в този адрес. + +- "адрес.адрес", връщаме стойностите между тези адреси (включително) във формата "X: V ...", където X е начален адрес и "V ..." са стойностите на всяка клетка. + + Допълнително, ако изкарваме повече от 8 адреса, трябва да продължим на нов ред, като изкараме в същия формат. + Пример: вход: "0.А", изход: + + ``` + 0: 0 0 0 0 0 0 0 0 + 8: 0 0 0 + ``` + +- "адрес: стойност", записваме "стойност" на дадения адрес. + Стойноста също е 16-тично число. + Трябва да върнем старата стойност в адреса (във формата "X: V"). + +- "адрес: стойност ...", като предходното, обаче може да определим стойностите на сегашната и на следващите клетки (пак изкарваме във формата "X: V ...") + +**Примери:** + +|Вход|Изход| +|----|-----| +|0 |0: 0 | +|2.8 |2: 0 0 0 0 0 0 0| +|2: FF<br>2|2: 0<br>2: FF| +|2: FF 0 A 5<br>2.5|2: 0 0 0 0<br>2: FF 0 A 5| +|1: FA 0 9 3 5 6 1 2 ABB 8A 99<br>1.12|1: 0 0 0 0 0 0 0 0<br>9: 0 0 0<br>1: FA 0 9 3 5 6 1 2<br>9: ABB 8A 99 0| + +## Задача 5 + +Перфокартите са стар формат за съхраняване на текст (код) върху хартиен носител, който е четим от машини. +Разделени са на някакъв брой редове и колони, всяка колона определя една буква, и всеки ред определя битовите стойности на всяка буква, като дупката означава бит 1, а липсата и бит 0. + + + +За удобство на програмиста, почти винаги най-отгоре на колоната се изписва с мастило каква е буквата на съответната колона. + +Трябва да имплементирате програма, която получава перфо карти в стандартния IBM формат: 12 реда и 80 колони и изкарва съответния ред, който е закодиран. + +Тоест, от входа получавате 12 низа, всеки низ е с дължина 80, и са съставени от 0 и 1. +Стойностите **по колони**: + +- от "100000000000" до "000000000001" (със само една 1ца) съответстват на знаците "&", "-", "0", "1", ... "9". +- от "100100000000" до "100000000001" (с две 1ци, едната която е винаги първата) съответстват на знаците от "A" до "I". +- от "010100000000" до "010000000001" (с две 1ци, едната която е винаги втората) съответстват на знаците от "J" до "R". +- от "001100000000" до "001000000001" (с две 1ци, едната която е винаги третата) съответстват на знаците "/", "S", ... "Z". + +**Пример:** + +|Вход|Изход| +|----|-----| +|100000000000111111111000000000000000000<br>010000000000000000000111111111000000000<br>001000000000000000000000000000111111111<br>000100000000100000000100000000100000000<br>000010000000010000000010000000010000000<br>000001000000001000000001000000001000000<br>000000100000000100000000100000000100000<br>000000010000000010000000010000000010000<br>000000001000000001000000001000000001000<br>000000000100000000100000000100000000100<br>000000000010000000010000000010000000010<br>000000000001000000001000000001000000001<br>|&-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ| + +## Задача 6 + +Регулярните изрази са низове, които позволяват да опишем шаблони, с които да филтрираме/приемаме низове. +Вие ще ги изучавате много подробно в "Езици, автомати и изчислимост", но за нашите цели ще се абстрахираме от детайлите. + +Правилата за регулярни изрази са следните: + +- ако е буквата "\*", значи предходната буква може да се повтаря 0 или повече пъти +- ако е буквата "?", значи предходната буква може да се повтаря 0 или 1 пъти +- ако не е някой от горните знаци, тогава искаме сегашната буква да бъде равна на тази в израза + +1. Какво описва регулярният израз `aa*bcd`? + + Първата буква от нашия низ трябва да бъде `а`. + След това имаме `a*`, след тази първа буква може да имаме 0 или повече `a`-та. + Тоест втората буква може да бъде `a` или `b`, ако е `a`, третата буква може да бъде `a` или `b`, обаче ако втората буква е `b`, тогава продължаваме напред и останалите букви трябва да са `bcd`. + + Тоест, този регулярен израз приема низове, които започват с `a`, след това имат 0 или повече `a`-та и завършват на `bcd`. + Следните низове ще бъдат приети: "abcd", "aabcd", "aaabcd", "aaaabcd" и так. нат. + +2. Какво описва регулярният израз `b*cd?`? + + В началото имаме `b` нула или повече пъти, след това имаме `c` и накрая имаме нула или едно `d`. + Следните низове ще бъдат приети: "c", "bc", "bbc", "bbbc", ..., "cd", "bcd", "bbcd", ... + +От входа получавате число N и след това ще получите 2N на брой редове. +Един ред ще бъде регулярен израз, следващия ще бъде низ за проверка, след това пак регулярен израз, след това пак низ за проверка и така се редуват. + +След всеки регулярен израз и низ за проверка, проверявате дали низа се приема от регулярния израз, и изкарвате "Matched". +В противен случай изкарвате "No match". +Ако регулярния израз е в грешен формат (срещнете "?" или "\*" като първи знак), трябва да изкарате "Bad regex". + +**Пример:** +*Смесен вход/изход* + +``` +9 +text +text +Matched +text +test +No match +a* +a +Matched +ca* +c +Matched +ca* +caaaa +Matched +n? +n +Matched +mn? +m +Matched +0*573 +0000005723 +No match +*abc +ops +Bad regex +``` |