Sumos Mistos

Sumos Mistos

Exercício de aprendizagem

Introdução

Existem basicamente dois tipos de ciclos:

  1. Repetir até que se verifique uma condição.
  2. Iterar sobre os elementos de uma coleção.

Ambos são possíveis em Julia, embora o segundo seja provavelmente mais comum.

O ciclo while

Para problemas em aberto, em que o número de repetições do ciclo é desconhecido à partida, Julia tem o ciclo while.

A forma básica é bastante simples:

while condition
    do_something()
end

Neste caso, o programa continua a repetir o ciclo até que condition deixe de ser true.

Existem duas formas de sair do ciclo mais cedo:

  • Um break faz com que o ciclo termine, e a execução continua na linha seguinte ao end do ciclo.
  • Um return x interrompe a execução da função atual e devolve o valor x a quem a chamou.

Com estas opções disponíveis, por vezes é prático criar um ciclo "infinito" com while true ... end e depois contar com uma condição de paragem dentro do corpo do ciclo para acionar um break ou um return.

Iterar sobre uma coleção

O exemplo mais simples é iterar sobre um intervalo.

Se quisermos fazer algo 10 vezes:

for n in 1:10
    do_something(n)
end

Se a iteração atual não satisfizer determinada condição, é possível saltar imediatamente para a iteração seguinte com um continue:

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

Numa forma mais curta, o bloco if pode ser substituído por is_useless(n) && continue.

Podes iterar sobre muitos outros tipos de coleção: elementos de um array, carateres de uma string, chaves de um dicionário...

Os exemplos até agora iteram sobre o intervalo 1:10, em que o valor é também o índice do ciclo.

De forma mais geral, podemos precisar do índice e não apenas do valor. Para isso, usa-se a função eachindex(), por exemplo for i in eachindex(my_array) ... end.

Instruções

A tua amiga Li Mei tem um bar de sumos onde vende deliciosos sumos de fruta misturada. És um cliente frequente na loja dela e percebeste que podias facilitar a vida à tua amiga. Decides usar as tuas competências de programação para ajudar a Li Mei no seu trabalho.

1. Determina quanto tempo demora a misturar um sumo

A Li Mei gosta de dizer aos clientes, com antecedência, quanto tempo têm de esperar por um sumo do menu que encomendaram. Tem dificuldade em lembrar-se dos números exatos, porque o tempo que cada sumo leva a misturar varia. O "Pure Strawberry Joy" demora 0,5 minutos, o "Energizer" e o "Green Garden" demoram 1,5 minutos cada, o "Tropical Island" demora 3 minutos e o "All or Nothing" demora 5 minutos. Para todas as outras bebidas (por exemplo, ofertas especiais) podes assumir um tempo de preparação de 2,5 minutos.

Para ajudares a tua amiga, escreve uma função time_to_mix_juice que recebe um sumo do menu como argumento e devolve o número de minutos que demora a misturar essa bebida.

julia> time_to_mix_juice("Tropical Island")
3

julia> time_to_mix_juice("Berries & Lime")
2.5

2. Reabastece a reserva de gomos de lima

Muitas das criações da Li Mei incluem gomos de lima, tanto como ingrediente como para decoração. Por isso, quando começa o turno de manhã, tem de se certificar de que a caixa de gomos de lima está cheia para o resto do dia.

Implementa a função limes_to_cut, que recebe o número de gomos de lima que a Li Mei precisa de cortar e um array que representa as limas inteiras que tem à mão. Consegue obter 6 gomos de uma lima "small", 8 gomos de uma lima "medium" e 10 de uma lima "large". Corta sempre as limas pela ordem em que aparecem na lista, começando pelo primeiro item. Continua até atingir o número de gomos de que precisa ou até ficar sem limas.

A Li Mei gostaria de saber com antecedência quantas limas precisa de cortar. A função limes_to_cut deve devolver o número de limas a cortar.

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

3. Lista os tempos de mistura de cada pedido na fila

A Li Mei gosta de saber quanto tempo vai demorar a misturar os pedidos pelos quais os clientes estão à espera.

Implementa a função order_times, que recebe uma fila de pedidos e devolve um vetor de tempos de mistura.

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

4. Termina o turno

A Li Mei trabalha sempre até às 15 horas. Depois, o empregado dela, o Dmitry, assume o turno. Muitas vezes há bebidas que já foram encomendadas mas que ainda não estão preparadas quando o turno da Li Mei termina. O Dmitry prepara então os sumos que faltam.

Para facilitar a passagem de turno, implementa uma função remaining_orders que recebe o número de minutos que faltam para o turno da Li Mei terminar e um array de sumos que já foram encomendados mas que ainda não estão preparados. A função deve devolver os pedidos que a Li Mei não consegue começar a preparar antes do fim do seu dia de trabalho.

O tempo que falta para o turno terminar será sempre maior do que 0. O array de sumos a preparar nunca estará vazio. Além disso, os pedidos são preparados pela ordem em que aparecem no array. Se a Li Mei começar a misturar um determinado sumo, acaba-o sempre, mesmo que tenha de trabalhar um pouco mais. Se não houver pedidos restantes de que o Dmitry tenha de tratar, deve ser devolvido um vetor vazio.

julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
Editar via GitHub A ligação abre numa nova janela ou separador
Julia Exercism

Estás pronto para começar Sumos Mistos?

Inscreve-te no Exercism para aprenderes e dominares Julia com 35 conceitos128 exercícios, e mentoria humana real, tudo grátis.