Un Set es una colección de elementos con las siguientes propiedades:
Créalos con el constructor Set(), usando cualquier iterador como parámetro.
julia> s1 = Set(1:4)
Set([4, 2, 3, 1])
Añade nuevos elementos con push!() (igual que con los arrays), y elimínalos con 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
Al igual que con otros tipos de colecciones, comprueba la pertenencia con el operador in o ∈ (usa \in y luego tabulador para obtener el símbolo).
julia> 3 ∈ s1
true
Se admiten las siguientes operaciones sobre pares de Sets (los atajos al símbolo del operador se muestran entre paréntesis).
union(A, B) o A ∪ B (\cup): todos los elementos que están en A o en B o en ambos.intersect(A, B) o A ∩ B (\cap): todos los elementos comunes a A y a B.setdiff(A, B) (sin símbolo): los elementos que están en A pero no en B.symdiff(A, B) (sin símbolo): los elementos que están en A o en B, pero no en ambos.issubset(A, B) o A ⊆ B (\subseteq) o B ⊇ A (\supseteq): true si todos los elementos de A están también en B.issetequal(A, B) (sin símbolo): true si A y B contienen exactamente los mismos elementos.isdisjoint(A, B) (sin símbolo): true si A y B no tienen ningún elemento en común (es decir, si la intersección está vacía).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
También hay versiones mutables de muchas de estas operaciones, con un ! añadido al nombre de la función.
Consulta el manual para ver la lista completa de funciones.
Tú y tus socios tenéis una pequeña empresa de catering. Acabas de aceptar organizar un evento para un club de cocina local en el que se servirán platos «favoritos del club». El club no tiene experiencia organizando eventos grandes y necesita ayuda para organizar, comprar, preparar y servir. Has decidido escribir algunas funciones pequeñas de Julia para agilizar todo el proceso de planificación.
Las recetas del evento se añadieron desde distintas fuentes y sus ingredientes parecen tener entradas duplicadas (o incluso más). ¡No quieres acabar comprando productos de más! Antes de que puedan empezar las compras y la cocina, hay que «limpiar» la lista de ingredientes de cada plato.
Implementa la función clean_ingredients(dish_name, dish_ingredients), que recibe el nombre de un plato y un Vector de ingredientes.
Esta función debe devolver una Tuple con el nombre del plato como primer elemento, seguido del Set de ingredientes sin duplicados.
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"]))
El evento incluirá tanto cócteles como «cócteles sin alcohol»: bebidas mezcladas sin alcohol. Tienes que asegurarte de que las bebidas «sin alcohol» no contengan alcohol de verdad y de que los cócteles sí incluyan alcohol.
Implementa la función check_drinks(drink_name, drink_ingredients), que recibe el nombre de una bebida y un Vector de ingredientes.
La función debe devolver el nombre de la bebida seguido de «Mocktail» si la bebida no tiene ingredientes alcohólicos, y el nombre de la bebida seguido de «Cocktail» si la bebida incluye alcohol.
A efectos de este ejercicio, los cócteles solo incluirán alcoholes de la 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"
La lista de invitados incluye comensales con distintas necesidades dietéticas, y tu personal tendrá que separar los platos en Vegan, Vegetarian, Paleo, Keto y Omnivore.
Implementa la función categorize_dish(dish_name, dish_ingredients), que recibe el nombre de un plato y un set con los ingredientes de ese plato.
La función debe devolver un String con la forma dish name: CATEGORY (a qué categoría de comida pertenece el plato).
Todos los platos encajarán en una de las categorías: VEGAN, VEGETARIAN, PALEO, KETO u 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"
Algunos invitados tienen alergias y restricciones dietéticas adicionales. Hay que etiquetar o anotar estos ingredientes en cada plato para que no causen problemas.
Implementa la función tag_special_ingredients(dish), que recibe una Tuple con el nombre del plato en la primera posición y un Vector o un Set con los ingredientes de ese plato en la segunda posición.
Devuelve el nombre del plato seguido del Set de ingredientes que requieren una nota especial en la descripción del plato.
Los ingredientes de un plato dentro de un Vector pueden tener duplicados o no.
A efectos de este ejercicio, todos los alérgenos o ingredientes especiales que hay que etiquetar están en la 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 preparar los pedidos y las compras, tendrás que compilar una «lista maestra» de ingredientes de todo lo que hay en el menú (las cantidades se rellenan más adelante).
Implementa la función compile_ingredients(dishes), que recibe un Vector de platos y devuelve un conjunto con todos los ingredientes de todos los platos de la lista.
Cada plato individual se representa mediante su 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"])
Los anfitriones te han dado una lista de platos que quieren preparar como aperitivos «de un bocado» para servir en bandejas. Tienes que sacarlos de la lista principal de platos que se preparan como raciones más grandes.
Implementa la función separate_appetizers(dishes, appetizers), que recibe un Vector de nombres de platos y un Vector de nombres de aperitivos.
La función debe devolver un Vector con la lista de nombres de platos a la que se han quitado los nombres de los aperitivos.
Tanto el Vector dishes como el appetizers pueden contener duplicados y quizá haya que eliminarlos.
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 categoría (VEGAN, VEGETARIAN, PALEO, KETO u OMNIVORE), vas a sacar los ingredientes que aparecen en un solo plato.
A estos ingredientes «únicos» se les asignará un comprador especial para asegurarse de que no se olvidan en la prisa por terminar todo lo demás.
Implementa la función singleton_ingredients(dishes, intersection), que recibe un Vector de platos y una constante CATEGORY_INTERSECTION de la misma categoría.
Cada plato se representa mediante un Set con sus ingredientes.
Cada CATEGORY_INTERSECTION es un Set de ingredientes que aparecen en más de un plato de la categoría.
Usando operaciones de conjuntos, tu función debe devolver un Set de ingredientes «únicos» (ingredientes que aparecen en un solo plato de la categoría).
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"])
Regístrate en Exercism para aprender y dominar Julia con 35 conceptos128 ejercicios y mentoría humana real, todo gratis.