المسارات
/
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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.