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"
Серед запрошених є гості з різними дієтичними потребами, тож персоналу потрібно розподілити страви на веганські, вегетаріанські, палео, кето та всеїдні.
Реалізуйте функцію 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, і Vector 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"])
Зареєструйтеся на Exercism, щоб вивчати й опановувати Julia, а також 35 концепцій128 вправ та справжнє наставництво від людей, і все це безкоштовно.