یک Set مجموعهای از عناصر است با این ویژگیها:
آنها را با سازندهی Set() بسازید و از هر تکرارگری بهعنوان پارامتر استفاده کنید.
julia> s1 = Set(1:4)
Set([4, 2, 3, 1])
عناصر جدید را با push!() (دقیقاً مانند آرایهها) اضافه کنید و آنها را با delete!() حذف کنید.
julia> push!(s1, 5)
Set([5, 4, 2, 3, 1])
# Duplicates are ignored
julia> push!(s1, 3)
Set([5, 4, 2, 3, 1])
julia> delete!(s1, 5)
Set([4, 2, 3, 1])
julia> length(s1) # length counts entries, despite the non-sequential type
4
مانند چندین نوع مجموعهی دیگر، عضویت را با عملگر in یا ∈ بررسی کنید (برای نوشتن نماد، \in را وارد کنید و سپس Tab بزنید).
julia> 3 ∈ s1
true
عملیات زیر روی جفتهایی از مجموعهها پشتیبانی میشوند (میانبرهای نوشتن نماد عملگر در پرانتز آمدهاند).
union(A, B) یا A ∪ B (\cup): همهی عناصری که در A یا B یا هر دو هستند.intersect(A, B) یا A ∩ B (\cap): همهی عناصری که هم در A و هم در B هستند.setdiff(A, B) (بدون نماد): عناصری که در A هستند اما در B نیستند.symdiff(A, B) (بدون نماد): عناصری که در A یا B هستند اما نه در هر دو.issubset(A, B) یا A ⊆ B (\subseteq) یا B ⊇ A (\supseteq): true اگر همهی عناصر A در B هم باشند.issetequal(A, B) (بدون نماد): true اگر A و B دقیقاً عناصر یکسانی داشته باشند.isdisjoint(A, B) (بدون نماد): true اگر A و B هیچ عنصر مشترکی نداشته باشند (بنابراین اشتراکشان خالی است).julia> s1 = Set(1:4);
julia> s2 = Set(3:6);
julia> s1 ∪ s2 # union
Set([5, 4, 6, 2, 3, 1])
julia> s1 ∩ s2 # intersect
Set([4, 3])
julia> setdiff(s1, s2)
Set([2, 1])
julia> symdiff(s1, s2)
Set([5, 6, 2, 1])
julia> s1 ⊇ s2 # issubset
false
نسخههای تغییردهندهای هم از بسیاری از اینها وجود دارد که در آنها ! به اسم تابع اضافه میشود.
برای فهرست کامل توابع، راهنما را ببینید.
شما و شرکای تجاریتان یک شرکت پذیرایی کوچک را اداره میکنید. همین حالا توافق کردهاید که رویدادی را برای یک باشگاه آشپزی محلی برگزار کنید که در آن غذاهای «محبوب باشگاه» سرو میشود. این باشگاه در میزبانی رویدادهای بزرگ بیتجربه است و در سازماندهی، خرید، آمادهسازی و سرو به کمک نیاز دارد. تصمیم گرفتهاید چند تابع کوچک Julia بنویسید تا کل فرآیند برنامهریزی را سریعتر کنید.
دستورهای پخت این رویداد از منابع مختلفی اضافه شدهاند و بهنظر میرسد مواد اولیهی آنها ورودیهای تکراری (یا بیشتر) داشته باشند؛ نمیخواهید در نهایت اقلام اضافی بخرید! پیش از آنکه خرید و پخت شروع شود، فهرست مواد اولیهی هر غذا باید «پاکسازی» شود.
تابع clean_ingredients(dish_name, dish_ingredients) را پیادهسازی کنید که اسم یک غذا و یک Vector از مواد اولیه را میگیرد.
این تابع باید یک Tuple برگرداند که اسم غذا به عنوان اولین عنصر در آن قرار دارد و پس از آن Set مواد اولیهی بدون تکرار میآید.
julia> clean_ingredients("Punjabi-Style Chole", ["onions", "tomatoes", "ginger paste", "garlic paste", "ginger paste", "vegetable oil", "bay leaves", "cloves", "cardamom", "cilantro", "peppercorns", "cumin powder", "chickpeas", "coriander powder", "red chili powder", "ground turmeric", "garam masala", "chickpeas", "ginger", "cilantro"])
("Punjabi-Style Chole", Set(["garam masala", "bay leaves", "ground turmeric", "ginger", "garlic paste", "peppercorns", "ginger paste", "red chili powder", "cardamom", "chickpeas", "cumin powder", "vegetable oil", "tomatoes", "coriander powder", "onions", "cilantro", "cloves"]))
این رویداد هم کوکتل و هم «ماکتل» را شامل میشود؛ نوشیدنیهای مخلوطی که الکل ندارند. باید مطمئن شوید که نوشیدنیهای «ماکتل» واقعاً بدون الکل هستند و کوکتلها بهراستی الکل دارند.
تابع check_drinks(drink_name, drink_ingredients) را پیادهسازی کنید که اسم یک نوشیدنی و یک Vector از مواد اولیه را میگیرد.
این تابع باید اگر نوشیدنی هیچ مادهی الکلی ندارد، اسم نوشیدنی را به همراه «Mocktail» برگرداند و اگر نوشیدنی الکل دارد، اسم نوشیدنی را به همراه «Cocktail».
برای اهداف این تمرین، کوکتلها فقط الکلهای موجود در ثابت ALCOHOLS را شامل میشوند:
julia> check_drinks("Honeydew Cucumber", ["honeydew", "coconut water", "mint leaves", "lime juice", "salt", "english cucumber"])
"Honeydew Cucumber Mocktail"
julia> check_drinks("Shirley Tonic", ["cinnamon stick", "scotch", "whole cloves", "ginger", "pomegranate juice", "sugar", "club soda"])
"Shirley Tonic Cocktail"
فهرست مهمانان شامل افرادی با نیازهای غذایی متفاوت است و کارکنانتان باید غذاها را به Vegan، Vegetarian، Paleo، Keto و Omnivore دستهبندی کنند.
تابع categorize_dish(dish_name, dish_ingredients) را پیادهسازی کنید که اسم یک غذا و یک set از مواد اولیهی آن غذا را میگیرد.
این تابع باید یک String به شکل dish name: CATEGORY برگرداند (دستهی غذایی که غذا به آن تعلق دارد).
همهی غذاها در یکی از این دستهها «جای میگیرند»: VEGAN، VEGETARIAN، PALEO، KETO یا OMNIVORE.
julia> categorize_dish("Sticky Lemon Tofu", Set(["tofu", "soy sauce", "salt", "black pepper", "cornstarch", "vegetable oil", "garlic", "ginger", "water", "vegetable stock", "lemon juice", "lemon zest", "sugar"]))
"Sticky Lemon Tofu: VEGAN"
julia> categorize_dish("Shrimp Bacon and Crispy Chickpea Tacos with Salsa de Guacamole", Set(["shrimp", "bacon", "avocado", "chickpeas", "fresh tortillas", "sea salt", "guajillo chile", "slivered almonds", "olive oil", "butter", "black pepper", "garlic", "onion"]))
"Shrimp Bacon and Crispy Chickpea Tacos with Salsa de Guacamole: OMNIVORE"
برخی مهمانان آلرژی و محدودیتهای غذایی دیگری دارند. این مواد اولیه باید برای هر غذا برچسبگذاری یا یادداشتگذاری شوند تا مشکلی ایجاد نکنند.
تابع tag_special_ingredients(dish) را پیادهسازی کنید که یک Tuple میگیرد که اسم غذا در جایگاه اول آن و یک Vector یا Set از مواد اولیهی آن غذا در جایگاه دوم آن قرار دارد.
اسم غذا را به همراه Set موادی برگردانید که به یادداشت ویژهای روی توضیحات غذا نیاز دارند.
مواد اولیهی غذا درون یک Vector ممکن است تکراری باشند یا نباشند.
برای اهداف این تمرین، همهی آلرژنها یا مواد اولیهی ویژهای که باید برچسبگذاری شوند در ثابت SPECIAL_INGREDIENTS قرار دارند.
julia> tag_special_ingredients(("Ginger Glazed Tofu Cutlets", ["tofu", "soy sauce", "ginger", "corn starch", "garlic", "brown sugar", "sesame seeds", "lemon juice"]))
("Ginger Glazed Tofu Cutlets", Set(["garlic","soy sauce","tofu"]))
julia> tag_special_ingredients(("Arugula and Roasted Pork Salad", ["pork tenderloin", "arugula", "pears", "blue cheese", "pine nuts", "balsamic vinegar", "onions", "black pepper"
]))
("Arugula and Roasted Pork Salad", Set(["pork tenderloin", "blue cheese", "pine nuts", "onions"]))
برای آماده شدن جهت سفارش و خرید، باید یک «فهرست اصلی» از مواد اولیه برای همهی موارد موجود در منو تهیه کنید (مقادیر بعداً پر میشوند).
تابع compile_ingredients(dishes) را پیادهسازی کنید که یک Vector از غذاها میگیرد و مجموعهای از همهی مواد اولیهی موجود در همهی غذاهای فهرستشده را برمیگرداند.
هر غذای منفرد با Set مواد اولیهاش نمایش داده میشود.
julia> dishes = [Set(["tofu", "soy sauce", "ginger", "corn starch", "garlic", "brown sugar", "sesame seeds", "lemon juice"]), Set(["pork tenderloin", "arugula", "pears", "blue cheese", "pine nuts","balsamic vinegar", "onions", "black pepper"]), Set(["honeydew", "coconut water", "mint leaves", "lime juice", "salt", "english cucumber"])];
julia> compile_ingredients(dishes)
Set(["arugula", "brown sugar", "honeydew", "coconut water", "english cucumber", "balsamic vinegar", "mint leaves", "pears", "pork tenderloin", "ginger", "blue cheese", "soy sauce", "sesame seeds", "black pepper", "garlic", "lime juice", "corn starch", "pine nuts", "lemon juice", "onions", "salt", "tofu"])
میزبانان فهرستی از غذاها به شما دادهاند که میخواهند به عنوان پیشغذاهای «لقمهای» برای سرو در سینی آماده شوند. باید اینها را از فهرست اصلی غذاهایی که به عنوان وعدههای بزرگتر آماده میشوند جدا کنید.
تابع separate_appetizers(dishes, appetizers) را پیادهسازی کنید که یک Vector از اسم غذاها و یک Vector از اسم پیشغذاها میگیرد.
این تابع باید یک Vector برگرداند که فهرست اسم غذاها را بدون اسم پیشغذاها در بر دارد.
هر یک از Vectorهای dishes یا appetizers ممکن است تکراری داشته باشد و به حذف تکرار نیاز پیدا کند.
julia> dishes = ["Avocado Deviled Eggs","Flank Steak with Chimichurri and Asparagus", "Kingfish Lettuce Cups", "Grilled Flank Steak with Caesar Salad","Vegetarian Khoresh Bademjan","Avocado Deviled Eggs", "Barley Risotto","Kingfish Lettuce Cups"];
julia> appetizers = ["Kingfish Lettuce Cups","Avocado Deviled Eggs","Satay Steak Skewers", "Dahi Puri with Black Chickpeas","Avocado Deviled Eggs","Asparagus Puffs", "Asparagus Puffs"];
julia> separate_appetizers(dishes, appetizers)
["Vegetarian Khoresh Bademjan", "Barley Risotto", "Flank Steak with Chimichurri and Asparagus", "Grilled Flank Steak with Caesar Salad"]
درون هر دسته (VEGAN، VEGETARIAN، PALEO، KETO یا OMNIVORE)، موادی را جدا میکنید که تنها در یک غذا ظاهر میشوند.
به این مواد «تکنمونه» یک خریدار ویژه اختصاص داده میشود تا مطمئن شوید در میان شتاب انجام دادن بقیهی کارها فراموش نمیشوند.
تابع singleton_ingredients(dishes, intersection) را پیادهسازی کنید که یک Vector از غذاها و یک ثابت CATEGORY_INTERSECTION برای همان دسته میگیرد.
هر غذا با Set مواد اولیهاش نمایش داده میشود.
هر CATEGORY_INTERSECTION یک Set از موادی است که در بیش از یک غذای آن دسته ظاهر میشوند.
با استفاده از عملیات مجموعهها، تابع شما باید یک Set از مواد «تکنمونه» برگرداند (موادی که تنها در یک غذای آن دسته ظاهر میشوند).
julia> singleton_ingredients(example_dishes, EXAMPLE_INTERSECTION)
Set(["garlic powder", "sunflower oil", "mixed herbs", "cornstarch", "celeriac", "honey", "mushrooms", "bell pepper", "rosemary", "parsley", "lemon", "yeast", "vegetable oil", "vegetable stock", "silken tofu", "tofu", "cashews", "lemon zest", "smoked tofu", "spaghetti", "ginger", "breadcrumbs", "tomatoes", "barley malt", "red pepper flakes", "oregano", "red onion", "fresh basil"])