Trilhas
/
Julia
Julia
/
Exercícios
/
Mistura de sucos
Mistura de sucos

Mistura de sucos

Exercício de aprendizagem

Introdução

Existem basicamente dois tipos de laços:

  1. Repetir até que uma condição seja satisfeita.
  2. Percorrer os elementos de uma coleção.

Os dois são possíveis em Julia, embora o segundo seja mais comum.

O laço while

Para problemas em aberto, em que o número de repetições do laço não é conhecido de antemão, Julia tem o laço while.

A forma básica é bem simples:

while condition
    do_something()
end

Nesse caso, o programa continua repetindo o laço até que condition não seja mais true.

Há duas formas de sair do laço mais cedo:

  • Um break faz o laço terminar, e a execução continua na linha seguinte ao end do laço.
  • Um return x interrompe a execução da função atual e devolve o valor de retorno x para quem fez a chamada.

Com essas opções disponíveis, às vezes é conveniente criar um laço "infinito" com while true ... end e contar com a descoberta de uma condição de parada dentro do corpo do laço para disparar um break ou um return.

Percorrer uma coleção

A ilustração mais simples é percorrer 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 alguma condição, é possível pular imediatamente para a próxima iteração 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

Em uma forma mais curta, o bloco if poderia ser substituído por is_useless(n) && continue.

Muitos outros tipos de coleção podem ser percorridos: os elementos de um array, os caracteres de uma string, as chaves de um dicionário...

Os exemplos até agora percorrem o intervalo 1:10, em que o valor também é o índice do laço.

De modo mais geral, pode ser que o índice seja necessário, e não apenas o valor. Para isso, usa-se a função eachindex(), por exemplo, for i in eachindex(my_array) ... end.

Instruções

Sua amiga Li Mei tem um bar de sucos onde vende deliciosos sucos mistos de frutas. Você é cliente frequente na loja dela e percebeu que poderia facilitar a vida da sua amiga. Você decide usar suas habilidades de programação para ajudar a Li Mei no trabalho dela.

1. Descubra quanto tempo leva para misturar um suco

Li Mei gosta de avisar os clientes com antecedência quanto tempo vão ter que esperar por um suco do menu que pediram. Ela tem dificuldade de lembrar os números exatos, porque o tempo para misturar os sucos varia. "Pure Strawberry Joy" leva 0,5 minutos, "Energizer" e "Green Garden" levam 1,5 minutos cada, "Tropical Island" leva 3 minutos e "All or Nothing" leva 5 minutos. Para todas as outras bebidas (por exemplo, ofertas especiais), você pode supor um tempo de preparo de 2,5 minutos.

Para ajudar sua amiga, escreva uma função time_to_mix_juice que recebe um suco do menu como argumento e retorna o número de minutos necessários para misturar essa bebida.

julia> time_to_mix_juice("Tropical Island")
3

julia> time_to_mix_juice("Berries & Lime")
2.5

2. Reponha o estoque de gomos de limão

Muitas das criações da Li Mei levam gomos de limão, como ingrediente ou como parte da decoração. Então, quando ela começa o turno pela manhã, precisa garantir que o recipiente de gomos de limão esteja cheio para o dia que vem.

Implemente a função limes_to_cut, que recebe o número de gomos de limão que Li Mei precisa cortar e um array que representa o estoque de limões inteiros que ela tem à mão. Ela consegue 6 gomos de um limão "small", 8 gomos de um limão "medium" e 10 de um limão "large". Ela sempre corta os limões na ordem em que eles aparecem na lista, começando pelo primeiro item. Ela continua até alcançar o número de gomos de que precisa ou até acabarem os limões.

Li Mei gostaria de saber com antecedência quantos limões precisa cortar. A função limes_to_cut deve retornar o número de limões a cortar.

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

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

Li Mei gosta de acompanhar quanto tempo vai levar para misturar os pedidos que os clientes estão esperando.

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

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

4. Termine o turno

Li Mei sempre trabalha até as 15h. Depois, seu funcionário Dmitry assume. Muitas vezes há bebidas que foram pedidas mas ainda não foram preparadas quando o turno da Li Mei termina. Dmitry então prepara os sucos restantes.

Para facilitar a passagem do turno, implemente uma função remaining_orders que recebe o número de minutos restantes no turno da Li Mei e um array de sucos que foram pedidos mas ainda não foram preparados. A função deve retornar os pedidos que Li Mei não consegue começar a preparar antes do fim do seu dia de trabalho.

O tempo restante no turno será sempre maior que 0. O array de sucos a preparar nunca estará vazio. Além disso, os pedidos são preparados na ordem em que aparecem no array. Se Li Mei começa a misturar um determinado suco, ela sempre o termina, mesmo que precise trabalhar um pouco mais. Se não restarem pedidos que Dmitry precise cuidar, deve ser retornado um vetor vazio.

julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
Editar via GitHub O link abre em uma nova janela ou aba
Julia Exercism

Tudo pronto para começar Mistura de sucos?

Crie sua conta no Exercism para aprender e dominar Julia com 35 conceitos128 exercícios e mentoria humana de verdade, tudo de graça.