Existem basicamente dois tipos de laços:
Os dois são possíveis em Julia, embora o segundo seja mais comum.
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:
break faz o laço terminar, e a execução continua na linha seguinte ao end do laço.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.
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.
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.
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
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
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]
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"]
Crie sua conta no Exercism para aprender e dominar Julia com 35 conceitos128 exercícios e mentoria humana de verdade, tudo de graça.