Предизвикателства > Пазарски списъци


Пазарски списъци
Краен срок: 27.02.2026 23:59
Точки: 1

Въпреки, че изпуснахме Свети Валентин / Трифон Зарезан, искаме да отразим повода чрез едно малко предизвикателство. ### Пазаруване за празника От тук насетне си представете, че се връщаме 11 дни назад във времето в последните часове преди празника _(по избор)_, когато осъзнаваме, че пак сме оставили подготовката за последния възможен момент и трескаво започваме да се чудим какво да напазаруваме! Някои от нас празнуват Свети Валентин, някои от нас - Трифон Зарезан. Съответно, подготовката за празниците преминава по различен начин. И тъй като времето на преподавателите е заето с подготовка за курса, ще сме ви благодарни, ако ни улесните с приготовленията. За целта създайте следното _(като абстракция)_: - Списък с продукти за Свети Валентин, който не може да се променя - за Костадин, тъй като алкохолът не го блазни, а китарата си е свършила работата. - Списък с продукти за Трифон Зарезан, който може да се променя - за Виктор, тъй като до последно е нямал планове за Свети Валентин и е решил да се наслади на съботната вечер по нашенски. - Списък с продукти и за двете - за Йоан, тъй като he parties hard. Този списък ще е комбинация на горните два списъка, както и някои допълнителни неща и ще може да се допълва, тъй като нещо може да изникне в последния момент. - Колекция от уникалните елементи в горните списъци _(т.е. всеки елемент от горните списъци да присъства само по веднъж)_. - За да е по-лесно пазаруването, финалният пазарски "списък" - речник, който съдържа уникалните елементи, а за да е по-лесно пазаруването _(ние ще си ги разделим по-късно)_ - всичко купуваме по 5 броя. - А, и добавете един _(един = `1`, а не 5)_ `'skyr'` накрая, за да има Виктор какво да закусва. - И за да сме по-ефективни, накрая искаме информация за това колко точно "продукта" ще трябва да купим. ### В [Python](https://www.youtube.com/watch?v=pfRdur8GLBM) код Това беше на ниво абстракция. За да имате адекватно условие, а ние да можем да тестваме, ще ви опишем имената, съдържанията и тук-таме типовете на отделните елементи. - `costadines_requirements` - **кортеж** от следните продукти (всеки от които - низ на кирилица) - вино, презервативи, струни за китара, презервативи, перце за китара, презервативи, пица, бонбони, презервативи - `victors_requirements` - **списък** от следните продукти (всеки от които - низ на кирилица) - вино, баница, цяло пиле, туршия, кисело зеле, зехтин, картофи, вино, кисели краставички, яйца - `joans_requirements` - комбинация от двете горни колекции, която съдържа първо нещата за Костадин, после нещата за Виктор и накрая добавя и няколко индивидуални изисквания - лубрикант, хавлия, маска на кон _П.П. "Комбинация"_ ще рече - `a = [1, 2]; b = [3, 4] -> [1, 2, 3, 4]`, с други думи искаме да е плоска структура - `unique_requirements` - всички елементи от горните списъци без повторение (напр. `a = [1, 2, 2, 3, 4, 1, 3] # уникалните са - 1, 2, 3, 4`) - `shopping_quantities` - **речник**, който ще ползваме докато пазаруваме, който съдържа всички неща, които трябва да купим, като ключове, и числото 5 за стойности - `total_items_to_buy` - число, което указва колко са **уникалните** неща, които **ще трябва да купим** ### Не забравяйте, ако имате въпроси - питайте в коментарите.
 1import unittest
 2
 3import solution
 4
 5
 6class TestSanity(unittest.TestCase):
 7    """Check if all data is present."""
 8
 9    def test_requirements(self):
10        names = [
11            "costadines_requirements",
12            "victors_requirements",
13            "joans_requirements",
14            "unique_requirements",
15            "shopping_quantities",
16            "total_items_to_buy",
17        ]
18        unimported = [name for name in names if name not in dir(solution)]
19        self.assertEqual(
20            unimported, [], "\n\nЕлементите по-горе липсват (проверете си имената)!"
21        )
22
23
24if __name__ == "__main__":
25    unittest.main()
  1import unittest
  2
  3from solution import *
  4
  5
  6class TestPreparation(unittest.TestCase):
  7    """Test that all the neccessary preparations for the occasion are in place."""
  8
  9    def test_costadines_requirements(self):
 10        """Costadine's requirements should match the recipe."""
 11        self.assertEqual(
 12            costadines_requirements,
 13            (
 14                "вино",
 15                "презервативи",
 16                "струни за китара",
 17                "презервативи",
 18                "перце за китара",
 19                "презервативи",
 20                "пица",
 21                "бонбони",
 22                "презервативи",
 23            ),
 24        )
 25
 26    def test_victors_requirements(self):
 27        """Victor's requirements should match the recipe."""
 28        self.assertEqual(
 29            victors_requirements,
 30            [
 31                "вино",
 32                "баница",
 33                "цяло пиле",
 34                "туршия",
 35                "кисело зеле",
 36                "зехтин",
 37                "картофи",
 38                "вино",
 39                "кисели краставички",
 40                "яйца",
 41            ],
 42        )
 43
 44    def test_costadines_requirements_type(self):
 45        """Victor's requirements should be in a list."""
 46        self.assertIsInstance(costadines_requirements, tuple)
 47
 48    def test_victors_requirements_type(self):
 49        """Victor's requirements should be in a tuple."""
 50        self.assertIsInstance(victors_requirements, list)
 51
 52    def test_joans_requirements(self):
 53        """Joan's requirements should be a combination of both lists above and then some."""
 54        self.assertEqual(
 55            joans_requirements,
 56            [
 57                "вино",
 58                "презервативи",
 59                "струни за китара",
 60                "презервативи",
 61                "перце за китара",
 62                "презервативи",
 63                "пица",
 64                "бонбони",
 65                "презервативи",
 66                "вино",
 67                "баница",
 68                "цяло пиле",
 69                "туршия",
 70                "кисело зеле",
 71                "зехтин",
 72                "картофи",
 73                "вино",
 74                "кисели краставички",
 75                "яйца",
 76                "лубрикант",
 77                "хавлия",
 78                "маска на кон",
 79            ],
 80        )
 81
 82    def test_unique_requirements(self):
 83        """The unique requirement list should contain all unique requirements."""
 84        # Make a more roundabout comparison, so that it's indepentent
 85        # from the type of unique_requirements
 86        expected_requirements = {
 87            "кисели краставички",
 88            "зехтин",
 89            "пица",
 90            "струни за китара",
 91            "кисело зеле",
 92            "вино",
 93            "картофи",
 94            "презервативи",
 95            "баница",
 96            "цяло пиле",
 97            "лубрикант",
 98            "бонбони",
 99            "туршия",
100            "яйца",
101            "маска на кон",
102            "хавлия",
103            "перце за китара",
104        }
105        for item in expected_requirements:
106            self.assertIn(item, unique_requirements)
107        self.assertEqual(len(expected_requirements), len(unique_requirements))
108
109    def test_shopping_quantities(self):
110        """All requirements should have a quantity of 5, except for skyr (1)."""
111        self.assertEqual(
112            shopping_quantities,
113            {
114                "бонбони": 5,
115                "презервативи": 5,
116                "баница": 5,
117                "хавлия": 5,
118                "перце за китара": 5,
119                "пица": 5,
120                "лубрикант": 5,
121                "струни за китара": 5,
122                "зехтин": 5,
123                "вино": 5,
124                "картофи": 5,
125                "кисело зеле": 5,
126                "яйца": 5,
127                "маска на кон": 5,
128                "цяло пиле": 5,
129                "кисели краставички": 5,
130                "туршия": 5,
131                "skyr": 1,
132            },
133        )
134
135    def test_number_of_requirements_to_buy(self):
136        """The number of requirements to buy should be 18."""
137        # Extended a bit, due to a little ambiguity
138        self.assertIn(total_items_to_buy, (18, 86, 90))
139
140
141if __name__ == "__main__":
142    unittest.main()
Дискусия
Гергана Панделиева
28.02.2026 08:31

Най накрая като общ брой ли трябваше да са принтира, тоест: print(total_items_to_buy*5 - 4) или само броя на видовете неща, които ще се пазаруват
Нишка
Виктор Бечев
02.03.2026 12:43

Принтирането изобщо не е задължително. На теория трябваше да е само видовете неща, но тъй като се оказа малко двузначно - променихме тестовете, така че да приемат и двата варианта за правилни.
Боян Байданов
26.02.2026 22:24

Само на мен ли ми се струва че в описанието на условието и python имплементацията има разминаване? Първо на Костадин се иска да може да му се променя списъка, след това се иска да е кортеж. Съответно и при Виктор така. На кое условие да вярвам???
Нишка
Милан Георгиев
27.02.2026 21:50

Прегледах отново и двете части и аз не виждам разминаване. И в абстракцията, и в 'python код' при Костадин имаме 'tuple' или 'кортеж', а другите два са list.
Боян Байданов
01.03.2026 10:21

Ок, при четвърти прочит наистина няма разминаване. Явно аз съм бил неадекватен. 🥴
Виктор Бечев
01.03.2026 19:07

Истината е, че, без да видя твоя коментар, по някое време корегирах грешката, защото и аз я забелязах. :grin:
Панайот Пощов
26.02.2026 08:28

Бихте ли, моля, споделили как да предаваме предизвикателства? Уви, често не мога да посещавам лекции/практика, защото работя. Благодаря Ви.
Нишка
Виктор Бечев
26.02.2026 11:26

Горе вляво имаш следните два бутона: ![Качи домашно](/media/resources/Screenshot_2026-02-26_112026.png) Оттам насетне би следвало да е интуитивно, имаш място за качване на файл: ![Качване](/media/resources/Screenshot_2026-02-26_112122.png) Както и [по-подробни инструкции за качване на домашни](https://py-fmi.org/info/code).