ট্র্যাক
/
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 লিখে তারপর ট্যাব চাপলে সিম্বলটি পাবেন)।

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): A-র সব এন্ট্রি B-তেও থাকলে true।
  • issetequal(A, B) (কোনো সিম্বল নেই): A ও B-তে হুবহু একই এন্ট্রি থাকলে true।
  • isdisjoint(A, B) (কোনো সিম্বল নেই): A ও B-তে কমন কোনো এন্ট্রি না থাকলে true (অর্থাৎ ইন্টারসেক্ট খালি)।
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 রিটার্ন করবে, যাতে অ্যাপেটাইজারের নামগুলো বাদ দেওয়া খাবারের নামের তালিকা থাকবে। dishes বা appetizers Vector — যেটিই হোক, তাতে ডুপ্লিকেট থাকতে পারে এবং ডুপ্লিকেটমুক্ত করার দরকার হতে পারে।

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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।