Um Set é uma coleção de itens com as seguintes propriedades:
Para criar um, use o construtor Set(), passando qualquer iterador como parâmetro.
julia> s1 = Set(1:4)
Set([4, 2, 3, 1])
Adicione novos elementos com push!() (do mesmo jeito que com arrays) e remova-os com 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
Como em vários outros tipos de coleção, você pode verificar se um elemento pertence ao conjunto com o operador in ou ∈ (digite \in e depois tab para inserir o símbolo).
julia> 3 ∈ s1
true
As seguintes operações com pares de conjuntos são suportadas (os atalhos para o símbolo do operador aparecem entre parênteses).
union(A, B) ou A ∪ B (\cup): todos os elementos em A ou B, ou em ambos.intersect(A, B) ou A ∩ B (\cap): todos os elementos comuns a A e B.setdiff(A, B) (sem símbolo): os elementos em A, mas não em B.symdiff(A, B) (sem símbolo): os elementos em A ou em B, mas não em ambos.issubset(A, B) ou A ⊆ B (\subseteq) ou B ⊇ A (\supseteq): true se todos os elementos de A também estão em B.issetequal(A, B) (sem símbolo): true se A e B contêm exatamente os mesmos elementos.isdisjoint(A, B) (sem símbolo): true se A e B não têm elementos em comum (ou seja, a interseção é vazia).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
Também existem versões mutantes de muitas dessas operações, com ! adicionado ao nome da função.
Consulte o manual para ver a lista completa de funções.
Você e seus sócios administram uma pequena empresa de catering. Vocês acabaram de aceitar organizar um evento para um clube de culinária local, com pratos "favoritos do clube". O clube não tem experiência em sediar eventos grandes e precisa de ajuda com organização, compras, preparo e serviço. Você decidiu escrever algumas pequenas funções em Julia para agilizar todo o processo de planejamento.
As receitas do evento foram adicionadas de várias fontes e seus ingredientes parecem ter entradas duplicadas (ou mais). Você não quer acabar comprando itens em excesso! Antes que as compras e o preparo possam começar, a lista de ingredientes de cada prato precisa ser "limpa".
Implemente a função clean_ingredients(dish_name, dish_ingredients), que recebe o nome de um prato e um Vector de ingredientes.
Essa função deve retornar um Tuple com o nome do prato como primeiro item, seguido do Set de ingredientes sem duplicatas.
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"]))
O evento vai incluir tanto coquetéis quanto "mocktails": bebidas mistas sem álcool. Você precisa garantir que as bebidas "mocktail" sejam realmente sem álcool e que os coquetéis de fato incluam álcool.
Implemente a função check_drinks(drink_name, drink_ingredients), que recebe o nome de uma bebida e um Vector de ingredientes.
A função deve retornar o nome da bebida seguido de "Mocktail" se a bebida não tiver ingredientes alcoólicos, e o nome da bebida seguido de "Cocktail" se a bebida incluir álcool.
Para os fins deste exercício, os coquetéis só incluirão álcoois da constante 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"
A lista de convidados inclui pessoas com necessidades alimentares diferentes, e sua equipe vai precisar separar os pratos entre Vegan, Vegetarian, Paleo, Keto e Omnivore.
Implemente a função categorize_dish(dish_name, dish_ingredients), que recebe o nome de um prato e um set com os ingredientes desse prato.
A função deve retornar uma String no formato dish name: CATEGORY (a qual categoria de refeição o prato pertence).
Todos os pratos vão se encaixar em uma das categorias: VEGAN, VEGETARIAN, PALEO, KETO ou 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"
Alguns convidados têm alergias e restrições alimentares adicionais. Esses ingredientes precisam ser marcados/anotados em cada prato para que não causem problemas.
Implemente a função tag_special_ingredients(dish), que recebe um Tuple com o nome do prato na primeira posição e um Vector ou Set de ingredientes desse prato na segunda posição.
Retorne o nome do prato seguido do Set de ingredientes que exigem uma observação especial na descrição do prato.
Os ingredientes de um prato dentro de um Vector podem ou não ter duplicatas.
Para os fins deste exercício, todos os alérgenos ou ingredientes especiais que precisam ser rotulados estão na constante 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"]))
Para se preparar para os pedidos e as compras, você vai precisar compilar uma "lista mestra" de ingredientes para tudo que está no cardápio (quantidades a preencher depois).
Implemente a função compile_ingredients(dishes), que recebe um Vector de pratos e retorna um conjunto com todos os ingredientes de todos os pratos listados.
Cada prato individual é representado pelo seu Set de ingredientes.
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"])
Os anfitriões entregaram a você uma lista de pratos que gostariam que fossem preparados como aperitivos "em porções pequenas", para serem servidos em bandejas. Você precisa tirá-los da lista principal de pratos que estão sendo preparados em porções maiores.
Implemente a função separate_appetizers(dishes, appetizers), que recebe um Vector de nomes de pratos e um Vector de nomes de aperitivos.
A função deve retornar um Vector com a lista de nomes de pratos sem os nomes dos aperitivos.
Tanto o Vector dishes quanto o appetizers podem conter duplicatas e talvez precisem ser deduplicados.
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"]
Dentro de cada categoria (VEGAN, VEGETARIAN, PALEO, KETO ou OMNIVORE), você vai separar os ingredientes que aparecem em apenas um prato.
Esses ingredientes "singleton" serão atribuídos a um comprador especial para garantir que não sejam esquecidos na correria de fazer todo o resto.
Implemente a função singleton_ingredients(dishes, intersection), que recebe um Vector de pratos e uma constante CATEGORY_INTERSECTION da mesma categoria.
Cada prato é representado por um Set de seus ingredientes.
Cada CATEGORY_INTERSECTION é um Set de ingredientes que aparecem em mais de um prato da categoria.
Usando operações de conjuntos, sua função deve retornar um Set de ingredientes "singleton" (ingredientes que aparecem em apenas um prato da categoria).
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"])
Crie sua conta no Exercism para aprender e dominar Julia com 35 conceitos128 exercícios e mentoria humana de verdade, tudo de graça.