Sumos Mistos

Sumos Mistos

Exercício de aprendizagem

Introdução

Ciclos while

Com um ciclo while, podes executar código repetidamente enquanto uma determinada condição se verificar. Escreve-se com a palavra-chave while seguida de uma condição entre parênteses e de um bloco de código que contém o corpo do ciclo, delimitado por chavetas.

while (condition) {
  // code that is executed repeatedly as long as the condition is true
}

O JavaScript também tem um ciclo do-while. Aqui, a condição é verificada depois de o corpo do ciclo ser executado. Isto é útil quando a condição depende de avaliações feitas no corpo.

do {
  // The code here will always be executed once and then
  // repeatedly while the condition is true.
} while (condition);

Dentro do corpo de um ciclo, podes usar a palavra-chave break para interromper completamente a execução do ciclo. Em contraste, a palavra-chave continue apenas interrompe a execução da iteração atual e continua para a seguinte. Com o continue, podes muitas vezes evitar envolver grandes partes do corpo do ciclo numa condicional.

let i = 0;

while (i < 100) {
  i = i + 2;

  if (i % 3 === 0) {
    continue;
  }

  // The code here will only be executed when i was not divisible
  // by 3 in the check above.
}

Instruções switch

Além da condicional, o JavaScript também tem uma instrução switch para executar lógica condicionalmente. É usada quando é preciso comparar uma única variável com várias alternativas. A comparação é feita através da verificação de igualdade estrita (===), vê comparação de conceitos. Para uma variável x, a instrução switch em JavaScript tem a seguinte sintaxe.

switch (x) {
  case option1:
    // code that is executed when "x === option1" is true
    break;
  case option2:
    // code that is executed when "x === option2" is true
    break;
  default:
    // code that is executed when x does not equal any of the options
}

O caso default é opcional e é usado caso queiras executar algum código se nenhuma das outras opções corresponder à variável.

As instruções break acima são necessárias porque, por predefinição, todos os casos são "fallthrough" em JavaScript. Isso significa que, sem qualquer break, todo o código nos casos abaixo da primeira opção correspondente seria executado, mesmo que x não correspondesse a essas opções. Este comportamento de "fallthrough" por predefinição é uma armadilha comum quando usas switch em JavaScript. Dentro de uma função, também podes usar return em vez de break para evitar este problema.

Instruções

A tua amiga Li Mei tem um bar de sumos onde vende deliciosos sumos de fruta misturados. És um cliente frequente na loja dela e apercebeste-te de que podias facilitar a vida à tua amiga. Decides usar os teus conhecimentos de programação para ajudar a Li Mei no trabalho dela.

1. Determina quanto tempo demora a misturar um sumo

A Li Mei gosta de avisar os clientes, com antecedência, de quanto tempo têm de esperar pelo sumo que encomendaram do menu. Tem dificuldade em memorizar os números exatos, porque o tempo de mistura dos sumos varia. 'Pure Strawberry Joy' demora 0,5 minutos, 'Energizer' e 'Green Garden' demoram 1,5 minutos cada, 'Tropical Island' demora 3 minutos e 'All or Nothing' demora 5 minutos. Para todas as outras bebidas (por exemplo, promoções especiais) podes assumir um tempo de preparação de 2,5 minutos.

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

timeToMixJuice('Tropical Island');
// => 3

timeToMixJuice('Berries & Lime');
// => 2.5

2. Reabastece a reserva de gomos de lima

Muitas das criações da Li Mei levam gomos de lima, seja como ingrediente, seja como parte da decoração. Por isso, quando começa o turno de manhã, tem de garantir que o recipiente dos gomos de lima está cheio para o resto do dia.

Implementa a função limesToCut, 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 antecipadamente quantas limas precisa de cortar. A função limesToCut deve devolver o número de limas a cortar.

limesToCut(25, ['small', 'small', 'large', 'medium', 'small']);
// => 4

3. Termina o turno

A Li Mei trabalha sempre até às 15 horas. Depois, é o seu funcionário Dmitry que assume o turno. Muitas vezes há bebidas que já foram encomendadas mas 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 remainingOrders, que recebe o número de minutos que faltam para o fim do turno da Li Mei e um array de sumos que já foram encomendados mas 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 fim do turno 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ça a misturar um determinado sumo, acaba-o sempre, mesmo que tenha de trabalhar um pouco mais. Se não sobrarem pedidos de que o Dmitry tenha de tratar, deve ser devolvido um array vazio.

remainingOrders(5, ['Energizer', 'All or Nothing', 'Green Garden']);
// => ['Green Garden']
Editar via GitHub A ligação abre numa nova janela ou separador
JavaScript Exercism

Estás pronto para começar Sumos Mistos?

Inscreve-te no Exercism para aprenderes e dominares JavaScript com 37 conceitos159 exercícios, e mentoria humana real, tudo grátis.