Rutas
/
Julia
Julia
/
Ejercicios
/
Zumos variados
Zumos variados

Zumos variados

Ejercicio de aprendizaje

Introducción

Básicamente, hay dos tipos de bucles:

  1. Bucle hasta que se cumpla una condición.
  2. Bucle sobre los elementos de una colección.

Ambos son posibles en Julia, aunque puede que el segundo sea más común.

El bucle while

Para problemas abiertos en los que no se conoce de antemano cuántas veces se recorrerá el bucle, Julia dispone del bucle while.

La forma básica es bastante sencilla:

while condition
    do_something()
end

En este caso, el programa seguirá recorriendo el bucle hasta que condition deje de ser true.

Hay dos formas de salir del bucle antes de tiempo:

  • Un break provoca la salida del bucle, y la ejecución continúa en la línea siguiente al end del bucle.
  • Un return x detiene la ejecución de la función actual y pasa el valor devuelto x a quien la llamó.

Con estas opciones disponibles, a veces puede resultar útil crear un bucle «infinito» con while true ... end y confiar en encontrar una condición de parada dentro del cuerpo del bucle que active un break o un return.

Bucle sobre una colección

La ilustración más sencilla consiste en recorrer un rango.

Si queremos hacer algo 10 veces:

for n in 1:10
    do_something(n)
end

Si la iteración actual no cumple alguna condición, es posible saltar inmediatamente a la siguiente iteración con un continue:

for n in 1:10
    if is_useless(n)
        continue
    end
    
    # we decided this iteration could be useful
    do_something_slow(n)
end

En una forma más corta, el bloque if podría sustituirse por is_useless(n) && continue.

Se puede iterar con un bucle sobre muchos otros tipos de colecciones: elementos de un array, caracteres de un string, claves de un diccionario...

Los ejemplos vistos hasta ahora recorren el rango 1:10, donde el valor es también el índice del bucle.

De forma más general, puede que se necesite el índice y no solo el valor. Para esto se utiliza la función eachindex(), por ejemplo for i in eachindex(my_array) ... end.

Instrucciones

Tu amiga Li Mei regenta una barra de zumos en la que vende deliciosos zumos de frutas mezcladas. Eres un cliente habitual de su tienda y te has dado cuenta de que podrías hacerle la vida más fácil a tu amiga. Decides usar tus dotes de programación para ayudar a Li Mei con su trabajo.

1. Determinar cuánto se tarda en mezclar un zumo

A Li Mei le gusta decir a sus clientes con antelación cuánto tienen que esperar por un zumo del menú que han pedido. Le cuesta recordar las cifras exactas porque el tiempo que se tarda en mezclar los zumos varía. "Pure Strawberry Joy" tarda 0,5 minutos, "Energizer" y "Green Garden" tardan 1,5 minutos cada uno, "Tropical Island" tarda 3 minutos y "All or Nothing" tarda 5 minutos. Para el resto de bebidas (por ejemplo, ofertas especiales) puedes suponer un tiempo de preparación de 2,5 minutos.

Para ayudar a tu amiga, escribe una función time_to_mix_juice que reciba un zumo del menú como argumento y devuelva el número de minutos que se tarda en mezclar esa bebida.

julia> time_to_mix_juice("Tropical Island")
3

julia> time_to_mix_juice("Berries & Lime")
2.5

2. Reponer el suministro de gajos de lima

Muchas de las creaciones de Li Mei incluyen gajos de lima, ya sea como ingrediente o como parte de la decoración. Así que cuando empieza su turno por la mañana, necesita asegurarse de que el recipiente de gajos de lima esté lleno para el resto del día.

Implementa la función limes_to_cut, que recibe el número de gajos de lima que Li Mei necesita cortar y un array que representa el suministro de limas enteras que tiene a mano. Puede sacar 6 gajos de una lima "small", 8 gajos de una lima "medium" y 10 de una lima "large". Siempre corta las limas en el orden en que aparecen en el array, empezando por el primer elemento. Sigue cortando hasta alcanzar el número de gajos que necesita o hasta que se quede sin limas.

A Li Mei le gustaría saber de antemano cuántas limas necesita cortar. La función limes_to_cut debe devolver el número de limas que hay que cortar.

julia> limes_to_cut(25, ["small", "small", "large", "medium", "small"])
4

3. Listar los tiempos de mezcla de cada pedido en la cola

A Li Mei le gusta llevar un registro de cuánto se tardará en mezclar los pedidos que los clientes están esperando.

Implementa la función order_times, que recibe una cola de pedidos y devuelve un vector de tiempos de mezcla.

julia> order_times(["Energizer", "Tropical Island"])
[1.5, 3.0]

4. Terminar el turno

Li Mei siempre trabaja hasta las 3 de la tarde. Luego su empleado Dmitry toma el relevo. A menudo hay bebidas que se han pedido pero que aún no están preparadas cuando termina el turno de Li Mei. Entonces Dmitry prepara los zumos restantes.

Para facilitar el relevo, implementa una función remaining_orders que recibe el número de minutos que quedan del turno de Li Mei y un array de zumos que se han pedido pero aún no se han preparado. La función debe devolver los pedidos que Li Mei no puede empezar a preparar antes del final de su jornada laboral.

El tiempo que queda del turno siempre será mayor que 0. El array de zumos que hay que preparar nunca estará vacío. Además, los pedidos se preparan en el orden en que aparecen en el array. Si Li Mei empieza a mezclar un zumo, siempre lo termina aunque tenga que trabajar un poco más. Si no queda ningún pedido pendiente del que Dmitry tenga que encargarse, debe devolverse un vector vacío.

julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Julia Exercism

¿Listo para empezar Zumos variados?

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