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
Setの演算他のいくつかのコレクション型と同様に、要素が含まれているかどうかはinまたは∈演算子で確認します(記号を入力するには\inと入力してからTabキーを押します)。
julia> 3 ∈ s1
true
2つのSetに対する次の演算がサポートされています(演算子記号へのショートカットは括弧(())内に示します)。
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に共通する要素が1つもない場合(つまり共通部分が空の場合)に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で小さな関数をいくつか書くことにしました。
イベント用のレシピはさまざまな情報源から集めたもので、その材料には重複した(あるいはそれ以上の)記載があるようです。余分な食材を買い込むのは避けたいですよね。 買い出しと調理を始める前に、各料理の材料リストを「整理」しておく必要があります。
clean_ingredients(dish_name, dish_ingredients)関数を実装してください。この関数は、料理名と材料のVectorを受け取ります。
この関数は、最初の要素に料理名、それに続けて重複を除いた材料のSetを持つTupleを返します。
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を受け取ります。
この関数は、dish name: CATEGORY(その料理がどの食事カテゴリーに属するか)の形式のStringを返します。
どの料理も、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)関数を実装してください。この関数は、最初の要素に料理名、2番目の要素にその料理の材料のVectorまたはSetを持つTupleを受け取ります。
料理名と、その料理の説明に特記事項が必要な材料の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で返します。
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"]
各カテゴリー(VEGAN、VEGETARIAN、PALEO、KETO、OMNIVORE)で、1つの料理にしか登場しない材料を取り出します。
こうした「シングルトン」の材料には専任の買い物係を割り当てて、他の作業に追われる中で買い忘れないようにします。
singleton_ingredients(dishes, intersection)関数を実装してください。この関数は料理のVectorと、同じカテゴリーのCATEGORY_INTERSECTION定数を受け取ります。
それぞれの料理は、その材料のSetで表されます。
それぞれのCATEGORY_INTERSECTIONは、そのカテゴリー内で複数の料理に登場する材料のSetです。
集合演算を使って、関数は「シングルトン」の材料(そのカテゴリー内で1つの料理にしか登場しない材料)の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"])