مسیرها
/
Julia
Julia
/
تمرین‌ها
/
پیشخدمت پذیرایی
پیشخدمت پذیرایی

پیشخدمت پذیرایی

تمرین یادگیری

مقدمه

یک 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 بنویسید تا کل فرآیند برنامه‌ریزی را سریع‌تر کنید.

1. پاکسازی مواد اولیه‌ی غذا

دستورهای پخت این رویداد از منابع مختلفی اضافه شده‌اند و به‌نظر می‌رسد مواد اولیه‌ی آن‌ها ورودی‌های تکراری (یا بیشتر) داشته باشند؛ نمی‌خواهید در نهایت اقلام اضافی بخرید! پیش از آنکه خرید و پخت شروع شود، فهرست مواد اولیه‌ی هر غذا باید «پاکسازی» شود.

تابع 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"]))

2. کوکتل‌ها و ماکتل‌ها

این رویداد هم کوکتل و هم «ماکتل» را شامل می‌شود؛ نوشیدنی‌های مخلوطی که الکل ندارند. باید مطمئن شوید که نوشیدنی‌های «ماکتل» واقعاً بدون الکل هستند و کوکتل‌ها به‌راستی الکل دارند.

تابع 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"

3. دسته‌بندی غذاها

فهرست مهمانان شامل افرادی با نیازهای غذایی متفاوت است و کارکنان‌تان باید غذاها را به 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"

4. برچسب‌گذاری آلرژن‌ها و غذاهای محدود

برخی مهمانان آلرژی و محدودیت‌های غذایی دیگری دارند. این مواد اولیه باید برای هر غذا برچسب‌گذاری یا یادداشت‌گذاری شوند تا مشکلی ایجاد نکنند.

تابع 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"]))

5. تهیه‌ی یک «فهرست اصلی» از مواد اولیه

برای آماده شدن جهت سفارش و خرید، باید یک «فهرست اصلی» از مواد اولیه برای همه‌ی موارد موجود در منو تهیه کنید (مقادیر بعداً پر می‌شوند).

تابع 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"])

6. جدا کردن پیش‌غذاها برای سرو در سینی

میزبانان فهرستی از غذاها به شما داده‌اند که می‌خواهند به عنوان پیش‌غذاهای «لقمه‌ای» برای سرو در سینی آماده شوند. باید این‌ها را از فهرست اصلی غذاهایی که به عنوان وعده‌های بزرگ‌تر آماده می‌شوند جدا کنید.

تابع 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"]

7. یافتن موادی که تنها در یک دستور پخت استفاده شده‌اند

درون هر دسته (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"])
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Julia Exercism

آماده‌اید پیشخدمت پذیرایی را شروع کنید؟

در Exercism ثبت‌نام کنید تا Julia را همراه با 35 مفهوم128 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.