Домашни > Октомврийска лютеница


Октомврийска лютеница
Краен срок: 15.10.2024 18:00
Точки: 4

### Здравейте! Въпреки, че малко сме закъснели и на борсата вероятно няма чушки - искахме да направим домашно, свързано с лютеница. ![Лютеница?!](/media/resources/lyutenitsa.png "Не ни съдете, нямахме време за добро Photoshop изпълнение") Затова и домашното ни ще е простичко, може би в подготовка за догодина, може би просто ей така. Основно за да се запознаете със системата за предаване на домашните и да понапишете някой друг ред __супер прост__ Python. ### Готварска абстракция От вас ще искаме да дефинирате следните данни в код: - Списък с продукти за лютеница по рецепта на Виктор, тъй като рецептата му постоянно еволюира - Tuple с продукти за лютеница по рецепта на Георги, тъй като рецептата му се предава през поколенията и всяко отклонение би довело до това родът му да се отрече от нарушителят - Пазарски списък, който е комбинация от двете горни колекции, като първо е тази за лютеницата на Виктор, после - за Георги (по азбучен ред, не защото лютеницата на един от двамата е по-хубава) - Опа, ще ни трябва да обърнем пазарския списък наобратно (първият елемент става последен, вторият предпоследен и така нататък - `a = [1, 2, 3] # обратният е [3, 2, 1]`), наша грешка, сигурни сме, че ще се справите - Колекция от уникалните продукти в пазарски списък - Тъй като не ни се занимава с прецизни мерки, искаме речник, в който присъства всеки от уникалните продукти, а за стойности на всеки имаме числото 5 (за да знаем да купим по 5 килограма от всичко) - Добавете ключ 'skyr' със стойност 1 към горния речник, за да има Виктор какво да закусва - Георги не закусва - Финално, за да преценим колко време ще ни е необходимо, искаме ориентир колко уникални продукта имаме да купим, изразяващ се в число, което показва дължината на речникът по-горе ### В Python код Това беше абстрактното описание. За да можем да тестваме, ще фиксираме имената (и тук-таме типовете) на гореописаните данни, които трябва да дефинирате, но отвъд това няма да поставяме ограничения на това как точно ги дефинирате. Важното е накрая да имате следното: - `viktors_ingredients` - **списък** от следните продукти (всеки от които - низ на кирилица) - чушки, домати, моркови, ябълки, сол, черен пипер, кимион, зехтин - `georgis_ingredients` - **кортеж** от следните продукти (всеки от които - низ на кирилица) - чушки, домати, патладжан, люти чушки, олио, захар, чубрица, черен пипер, врачанска ракия - `shopping_list` - комбинация от двете горни колекции, първо тази на Виктор, след това тази на Георги... След което списъкът е обърнат - `unique_ingredients` - колекция от елементите на 'shopping_list' без повторение (напр. `a = [1, 2, 2, 3, 4, 1, 3] # уникалните са - 1, 2, 3, 4`) - `ingredient_quantities` - **речник**, чиито ключове са съставките от горната колекция (`unique_ingredients`), а стойности за всеки е числото 5, както и ключът `'skyr'` със стойност числото 1 - `number_of_ingredients_to_buy` - число, което указва дължината на `ingredient_quantities` #### Не забравяйте, ако имате въпроси - питайте в коментарите.
 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 = ['viktors_ingredients', 'georgis_ingredients', 'shopping_list', 'unique_ingredients', 'ingredient_quantities', 'number_of_ingredients_to_buy']
11        unimported = [name for name in names if name not in dir(solution)]
12        self.assertEqual(unimported, [], '\n\nЕлементите по-горе липсват (проверете си имената)!')
13
14
15if __name__ == '__main__':
16    unittest.main()
 1import unittest
 2
 3from solution import *
 4
 5
 6class TestLyutenitsa(unittest.TestCase):
 7    """Test that all the neccessary data for making lyutenitsa is good."""
 8
 9    def test_viktors_ingredients(self):
10        """Viktor's ingredients should match the recipe."""
11        self.assertEqual(viktors_ingredients,
12                         ['чушки', 'домати', 'моркови', 'ябълки', 'сол',
13                          'черен пипер', 'кимион', 'зехтин'])
14
15    def test_georgis_ingredients(self):
16        """Georgi's ingredients should match the recipe."""
17        self.assertEqual(georgis_ingredients,
18                         ('чушки', 'домати', 'патладжан', 'люти чушки', 'олио',
19                          'захар', 'чубрица', 'черен пипер', 'врачанска ракия'))
20
21    def test_viktors_ingredients_type(self):
22        """Viktor's ingredients should be in a list."""
23        self.assertIsInstance(viktors_ingredients, list)
24
25    def test_georgis_ingredients_type(self):
26        """Georgi's ingredients should be in a tuple."""
27        self.assertIsInstance(georgis_ingredients, tuple)
28
29    def test_shopping_list(self):
30        """The shopping list should contain all elements (reversed)."""
31        self.assertEqual(shopping_list,
32                         ['врачанска ракия', 'черен пипер', 'чубрица', 'захар',
33                          'олио', 'люти чушки', 'патладжан', 'домати', 'чушки',
34                          'зехтин', 'кимион', 'черен пипер', 'сол', 'ябълки',
35                          'моркови', 'домати', 'чушки'])
36
37    def test_unique_ingredients(self):
38        """The unique ingredient list should contain all unique ingredients."""
39        # Make a more roundabout comparison, so that it's indepentent
40        # from the type of unique_ingredients
41        expected_ingredients = {'врачанска ракия', 'черен пипер', 'чубрица',
42                                'захар', 'олио', 'люти чушки', 'патладжан',
43                                'домати', 'чушки', 'зехтин', 'кимион',
44                                'ябълки', 'моркови', 'сол'}
45        for item in expected_ingredients:
46            self.assertIn(item, unique_ingredients)
47        self.assertEqual(len(expected_ingredients), len(unique_ingredients))
48
49    def test_ingredient_quantities(self):
50        """All ingredients should have a quantity of 5, except for skyr (1)."""
51        self.assertEqual(ingredient_quantities,
52                         {'врачанска ракия': 5, 'черен пипер': 5, 'чубрица': 5,
53                          'захар': 5, 'олио': 5, 'люти чушки': 5, 'чушки': 5,
54                          'патладжан': 5, 'домати': 5, 'зехтин': 5, 'кимион': 5,
55                          'ябълки': 5, 'моркови': 5, 'сол': 5, 'skyr': 1})
56
57    def test_number_of_ingredients_to_buy(self):
58        """The number of ingredients to buy should be 14."""
59        self.assertEqual(number_of_ingredients_to_buy, 15)
60
61
62if __name__ == '__main__':
63    unittest.main()
Дискусия
Виктор Бечев
11.10.2024 15:36

@Илиан_Запрянов - второто. @Никола_Георгиев - ако нашият отговор ще спойлне решението - ние и на теб няма да отговорим. Ако въпросът ти ще го спойлне - сигурен ли си, че е въпрос по условието? Като цяло - въпросите е окей да си пишат тук във всички случаи, освен когато не става въпрос за нещо, което, както ти отбеляза, би дало на колегите ти част от решението на задачата. Алтернативно - остави коментар в собственото си решение ако не си сигурен. :)
Никола Георгиев
11.10.2024 13:53

Имам въпрос. Ама не знам дали тук да го задам или на ЛС, защото може да спойлне репението. Като цяло в какви ситуации е ок да се пишат въпросите тук и какви са алтернативите
Илиан Запрянов
11.10.2024 13:27

"Пазарски списък, който е комбинация от двете горни колекции, като първо е тази за лютеницата на Виктор, после - за Георги (по азбучен ред, не защото лютеницата на един от двамата е по-хубава)" Комбинация означава [["чушки", "домати", "моркови", "ябълки", "сол", "черен пипер", "кимион", "зехтин"], ("чушки", "домати", "патладжан", "люти чушки", "олио", "захар", "чубрица", "черен пипер", "врачанска ракия",)] или ["чушки", "домати", "моркови", "ябълки", "сол", "черен пипер", "кимион", "зехтин", "чушки", "домати", "патладжан", "люти чушки", "олио", "захар", "чубрица", "черен пипер", "врачанска ракия"]