Tracks
/
Julia
Julia
/
Ejercicios
/
Mesero de banquetes
Mesero de banquetes

Mesero de banquetes

Ejercicio de aprendizaje

Introducción

Un Set es una colección de elementos con las siguientes propiedades:

  • Sin orden.
  • Los elementos son únicos, por lo que los intentos de agregar duplicados se ignoran silenciosamente.
  • Admite muchas de las operaciones habituales de los conjuntos matemáticos.

Créalos con el constructor Set(), usando cualquier iterador como parámetro.

julia> s1 = Set(1:4)
Set([4, 2, 3, 1])

Agrega 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

Operaciones con conjuntos

Al igual que con otros tipos de colecciones, comprueba la pertenencia con el operador in o ∈ (usa \in y luego tab para obtener el símbolo).

julia> 3 ∈ s1
true

Se admiten las siguientes operaciones sobre pares de Sets (los atajos para el símbolo del operador se muestran entre paréntesis).

  • union(A, B) o A ∪ B (\cup): todos los elementos que están en A, en B o en ambos.
  • intersect(A, B) o A ∩ B (\cap): todos los elementos comunes a A y 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 también está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 elementos en común (es decir, 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 existen versiones mutables de muchas de estas, con ! agregado al nombre de la función. Consulta el manual para ver la lista completa de funciones.

Instrucciones

Tú y tus socios dirigen una pequeña empresa de catering. Acaban de aceptar organizar un evento para un club de cocina local que presenta platillos «favoritos del club». El club no tiene experiencia organizando eventos grandes y necesita ayuda con la organización, las compras, la preparación y el servicio. Decidiste escribir unas pequeñas funciones de Julia para agilizar todo el proceso de planificación.

1. Limpia los ingredientes de los platillos

Las recetas del evento se agregaron desde diversas fuentes y sus ingredientes parecen tener entradas duplicadas (o más). ¡No quieres terminar comprando artículos de más! Antes de que puedan comenzar las compras y la cocina, hay que «limpiar» la lista de ingredientes de cada platillo.

Implementa la función clean_ingredients(dish_name, dish_ingredients) que toma el nombre de un platillo y un Vector de ingredientes. Esta función debe devolver una Tuple con el nombre del platillo como primer elemento, seguida 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"]))

2. Cócteles y mocktails

El evento incluirá tanto cócteles como «mocktails», bebidas mezcladas sin alcohol. Necesitas asegurarte de que las bebidas «mocktail» sean realmente sin alcohol y de que los cócteles sí incluyan alcohol.

Implementa la función check_drinks(drink_name, drink_ingredients) que toma 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. Para los fines 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"

3. Categoriza los platillos

La lista de invitados incluye comensales con diferentes necesidades dietéticas, y tu personal tendrá que separar los platillos en Vegan, Vegetarian, Paleo, Keto y Omnivore.

Implementa la función categorize_dish(dish_name, dish_ingredients) que toma el nombre de un platillo y un set de los ingredientes de ese platillo. La función debe devolver un String con el dish name: CATEGORY (a qué categoría de comida pertenece el platillo). Todos los platillos «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"

4. Etiqueta los alérgenos y los alimentos restringidos

Algunos invitados tienen alergias y restricciones dietéticas adicionales. Estos ingredientes deben etiquetarse/anotarse para cada platillo para que no causen problemas.

Implementa la función tag_special_ingredients(dish) que toma una Tuple con el nombre del platillo en la primera posición y un Vector o Set de ingredientes de ese platillo en la segunda posición. Devuelve el nombre del platillo seguido del Set de ingredientes que requieren una nota especial en la descripción del platillo. Los ingredientes de un platillo dentro de un Vector pueden tener duplicados o no. Para los fines de este ejercicio, todos los alérgenos o ingredientes especiales que deben etiquetarse 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"]))

5. Compila una «lista maestra» de ingredientes

Para preparar el pedido y las compras, necesitarás compilar una «lista maestra» de ingredientes de todo lo que está en el menú (las cantidades se completarán después).

Implementa la función compile_ingredients(dishes) que toma un Vector de platillos y devuelve un conjunto de todos los ingredientes de todos los platillos listados. Cada platillo individual está representado por 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"])

6. Separa los aperitivos para pasarlos en bandejas

Los anfitriones te dieron una lista de platillos que quieren preparar como aperitivos «de un bocado» para servir en bandejas. Necesitas quitarlos de la lista principal de platillos que se preparan como porciones más grandes.

Implementa la función separate_appetizers(dishes, appetizers) que toma un Vector de nombres de platillos y un Vector de nombres de aperitivos. La función debe devolver un Vector con la lista de nombres de platillos a la que se le quitaron los nombres de los aperitivos. Tanto el Vector dishes como el appetizers podrían contener duplicados y podrían requerir que se eliminen.

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. Encuentra los ingredientes que se usan en una sola receta

Dentro de cada categoría (VEGAN, VEGETARIAN, PALEO, KETO u OMNIVORE), vas a separar los ingredientes que aparecen en un solo platillo. A estos ingredientes «singleton» se les asignará un comprador especial para asegurar que no se olviden en la prisa por terminar todo lo demás.

Implementa la función singleton_ingredients(dishes, intersection) que toma un Vector de platillos y una constante CATEGORY_INTERSECTION para la misma categoría. Cada platillo está representado por un Set de sus ingredientes. Cada CATEGORY_INTERSECTION es un Set de ingredientes que aparecen en más de un platillo de la categoría. Usando operaciones de conjuntos, tu función debe devolver un Set de ingredientes «singleton» (ingredientes que aparecen en un solo platillo 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"])
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Julia Exercism

¿Todo listo para empezar Mesero de banquetes?

Regístrate en Exercism para aprender y dominar Julia con 35 conceptos128 ejercicios y mentoría humana real, todo gratis.