Предизвикателства > Мемник


Мемник
Краен срок: 14.03.2026 18:00
Точки: 2

Тъй като днес е вечер за "Мамник", било то и подранили с няколко часа, искаме да ви сблъскаме със следното предизвикателство: ### Memnick (memorize nicknames) ###### /не "Мамник", за да избегнем проблем с авторски права/ Да се направи функция `memnick`, която приема произволен брой позиционни аргументи, като поведението ѝ зависи от този брой. #### Без аргументи Ако функцията се извика без аргументи, тя трбва да връща декоратор, който предполага да декорира функции, които връщат стрингове. Стринговете ще бъдат във формата `"<обръщение>, <фраза>"`. Функцията `memnick` трябва да "помни" всички стрингове, които са били връщани от декорирани функции, взимайки предвид обръщението от всяка фраза. С други думи, Мамникът запомня фрази, които са адресирани до определени хора. Това е важно за следващия вариант на извикване, а именно... #### С позиционни аргументи Ако функцията бъде извикана с позиционни аргументи, очаква се всеки от тези аргументи да е функция _(не е нужно да проверявате, гарантираме ви, че ще е така)_ - `memnick(func_1, func_2, func_3, ...)`. При този случай функцията ни трябва да връща списък от всички стрингове, които са били връщани от декорирани функции, в които обръщението съвпада с името на фукцията, подадена като аргумент. Това е свързано със "запомнянето" от горната точка, т.е. Мамникът се опитва да мами човека, зад името на функцията, с фрази, които е "чул" да се отправят към него. Фразите се допълват от текст от типа `"С гласа на <човек>: "`. #### Пример: ``` @memnick() def божана(): return "Почекаин, ти си луд!" божана() @memnick() def бай_венци(): return "Емил, айде да играем шах!" бай_венци() @memnick() def бай_венци(): return "Емил, гладен съм!" бай_венци() @memnick() def емил(): return "Божана, намери сина ми." емил() @memnick() def емил(): return "Почекаин, нищо не става от тебе." емил() @memnick() def почекаин(): return "Божана, ще те любя." почекаин() print(memnick(емил, божана)) # ["С гласа на Бай Венци: Емил, айде да играем шах!", # "С гласа на Бай Венци: Емил, гладен съм!", # "С гласа на Емил: Божана, намери сина ми.", # "С гласа на Почекаин: Божана, ще те любя."] print(memnick(бай_венци)) # [] - никой не се е обръщал към Бай Венци в никоя от горните фрази print(memnick(почекаин)) # ["С гласа на Божана: Почекаин, ти си луд!", # "С гласа на Емил: Почекаин, нищо не става от тебе."] ``` #### Уговорки: - Имена на функции, които показват имена от две **или повече** думи (`"бай_венци"`), се транслират в стринговете `"С гласа на <човек>"` като `"Бай Венци"` (разделени на отделни думи, с главни букви). - Нямате гаранция какво ще приема декорираната с `memnick()` функция, единственото, което знаете е, какво ще връща - стринг. - Повторни извиквания на декорираните с `memnick()` функции с един и същ върнат резултат **не се** запазват като отделни фрази, Мамника го интересуват само уникалните фрази. - Понеже не сме го казвали, жокер за това как да вземете / запишете име на функция - `func.__name__`: ``` def баба(): pass func = баба print(func.__name__) # баба func.__name__ = "дядо" print(баба.__name__) # дядо ```
 1import unittest
 2
 3import solution
 4
 5
 6class TestSanity(unittest.TestCase):
 7    """Check if all data is present."""
 8
 9    def test_lyutenitsa_data(self):
10        names = [
11            "memnick",
12        ]
13        unimported = [name for name in names if name not in dir(solution)]
14        self.assertEqual(
15            unimported, [], "\n\nЕлементите по-горе липсват (проверете си имената)!"
16        )
17
18
19if __name__ == "__main__":
20    unittest.main()
  1import unittest
  2from importlib import reload
  3
  4import solution
  5
  6
  7# Pre-define functions to decorate
  8def бай_венци():
  9    return "Емил, айде да играем шах!"
 10
 11
 12def божана():
 13    return "Почекаин, ти си луд!"
 14
 15
 16def емил():
 17    return "Бай Венци, кажи ми за рисунката."
 18
 19
 20def лазар():
 21    return "Божана, може би ще те любя."
 22
 23
 24def митака():
 25    return "Божана, на този етап не съм сигурен дали искам да те любя."
 26
 27
 28def на_жанчето_майка_ѝ():
 29    return "Лазар, едни мекички съм направила да хапнеш."
 30
 31
 32def почекаин():
 33    return "Божана, ще те любя."
 34
 35
 36class TestMemnick(unittest.TestCase):
 37    """Test that all the neccessary preparations for the occasion are in place."""
 38
 39    def setUp(self):
 40        global solution
 41        solution = reload(solution)
 42
 43    def test_memnick_memorizes(self):
 44        solution.memnick()(бай_венци)()
 45        solution.memnick()(божана)()
 46        solution.memnick()(емил)()
 47        solution.memnick()(лазар)()
 48        solution.memnick()(митака)()
 49        solution.memnick()(на_жанчето_майка_ѝ)()
 50        solution.memnick()(почекаин)()
 51        self.assertEqual(
 52            [
 53                "С гласа на Лазар: Божана, може би ще те любя.",
 54                "С гласа на Митака: Божана, на този етап не съм сигурен дали искам да те любя.",
 55                "С гласа на Почекаин: Божана, ще те любя.",
 56                "С гласа на Бай Венци: Емил, айде да играем шах!",
 57            ],
 58            solution.memnick(божана, емил),
 59        )
 60        self.assertEqual(
 61            [],
 62            solution.memnick(митака),
 63        )
 64        self.assertEqual(
 65            ["С гласа на Божана: Почекаин, ти си луд!"],
 66            solution.memnick(почекаин),
 67        )
 68
 69    def test_memnick_does_not_memorize_repetitions(self):
 70        solution.memnick()(бай_венци)()
 71        solution.memnick()(бай_венци)()
 72        solution.memnick()(бай_венци)()
 73        solution.memnick()(бай_венци)()
 74        solution.memnick()(бай_венци)()
 75        solution.memnick()(бай_венци)()
 76        self.assertEqual(
 77            ["С гласа на Бай Венци: Емил, айде да играем шах!"],
 78            solution.memnick(емил),
 79        )
 80
 81    def test_memnick_preserves_result(self):
 82        self.assertEqual(божана(), solution.memnick()(божана)())
 83
 84    def test_memnick_splits_properly(self):
 85        solution.memnick()(бай_венци)()
 86        solution.memnick()(емил)()
 87        solution.memnick()(лазар)()
 88        solution.memnick()(на_жанчето_майка_ѝ)()
 89        self.assertEqual(
 90            ["С гласа на Емил: Бай Венци, кажи ми за рисунката."],
 91            solution.memnick(бай_венци),
 92        )
 93        self.assertEqual(
 94            ["С гласа на Бай Венци: Емил, айде да играем шах!"],
 95            solution.memnick(емил),
 96        )
 97        self.assertEqual(
 98            [],
 99            solution.memnick(на_жанчето_майка_ѝ),
100        )
101
102    def test_memnick_decorates_variable_functions(self):
103        def граматиков(фото_капан_1, фото_капан_2, *птици, утрепан_от_мамника=False):
104            if not утрепан_от_мамника:
105                return f"Жители на Вракола, на {фото_капан_1} и {фото_капан_2} са заснети {птици}."
106            return "Жители на Вракола, ибаси."
107
108        solution.memnick()(граматиков)("Капан 1", "Капан 2", "кос", "друг кос", утрепан_от_мамника=True)
109
110
111if __name__ == "__main__":
112    unittest.main()
Дискусия
Виктор Бечев
15.03.2026 14:54

Оправихме един от тестовете и ви оставихме обратна връзка. Вече не би следвало точките, които имате, да се променят.