トラック
/
JavaScript
JavaScript
/
演習
/
ミックスジュース
ミックスジュース

ミックスジュース

学習演習

はじめに

whileループ

whileループを使うと、ある条件が満たされている間、コードを繰り返し実行できます。 whileキーワードのあとに、丸括弧(())で囲んだ条件と、波括弧({})で囲まれたループの_本体_を含むブロックを書きます。

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

JavaScriptには、do-whileループもあります。 こちらは、ループの本体が実行されたあとに条件がチェックされます。 条件がループの本体で行われた評価に依存する場合に便利です。

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

ループの本体の中では、breakキーワードを使ってループを完全に抜けることができます。 これとは対照的に、continueキーワードは現在の繰り返しの実行だけを止め、次の繰り返しへ進みます。 continueを使うと、ループの本体の大部分をif文で囲むのを避けられることがよくあります。

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.
}

switch文

if文のほかに、JavaScriptには条件によって処理を分岐させるswitch文もあります。 switch文は、1つの変数を複数の値と比較する必要があるときに使います。 比較は厳密等価(===)かどうかで行われます。詳しくは比較の概念を参照してください。 ある変数xに対する、JavaScriptのswitch文の構文は次のとおりです。

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
}

defaultケースは省略可能で、ほかのどの値も変数と一致しないときに何らかのコードを実行したい場合に使います。

上のbreak文が必要なのは、JavaScriptではデフォルトですべてのケースが「フォールスルー」するからです。 つまり、break文がないと、最初に一致した値より下にあるケースのコードが、xがそれらの値と一致していなくてもすべて実行されてしまいます。 この「デフォルトでフォールスルーする」という動作は、JavaScriptでswitchを使うときによくある落とし穴です。 関数の中では、この問題を避けるためにbreakの代わりにreturnを使うこともできます。

説明

友人のLi Meiは、おいしいミックスフルーツジュースを売るジュースバーを営んでいます。 その店によく通ううちに、自分のコーディングスキルで友人の負担を減らせるかもしれない、と思いつきました。 そこで、Li Meiの仕事を手伝うことにしました。

1. ジュースを混ぜるのにかかる時間を求める

Li Meiは、お客さんがメニューから注文したジュースについて、どれくらい待てばよいかを前もって伝えるのが好きです。 ジュースを混ぜるのにかかる時間はそれぞれ違うので、正確な数字を覚えておくのは大変です。 'Pure Strawberry Joy'は0.5分、'Energizer'と'Green Garden'はそれぞれ1.5分、'Tropical Island'は3分、'All or Nothing'は5分かかります。 それ以外の飲み物(たとえばおすすめメニューなど)は、準備に2.5分かかると考えておけば大丈夫です。

友人の助けになるよう、メニューのジュースを入力として受け取り、その飲み物を混ぜるのにかかる分数を戻す関数timeToMixJuiceを書いてみましょう。

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

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

2. ライムのくし形切りを補充する

Li Meiが作るものの多くには、材料としてであれ飾りとしてであれ、ライムのくし形切りが入っています。 そのため、朝シフトに入るときには、その日の分のライムのくし形切りが入った容器がいっぱいになっていることを確かめる必要があります。

切る必要のあるライムのくし形切りの数と、手元にあるまるごとのライムの在庫を表す配列を入力として受け取る関数limesToCutを実装しましょう。 'small'のライムからは6切れ、'medium'のライムからは8切れ、'large'のライムからは10切れ取れます。 Li Meiはいつも、リストに並んでいる順番どおり、最初のものから順にライムを切ります。 必要な数のくし形切りに届くまで、またはライムがなくなるまで、切り続けます。

Li Meiは、あらかじめ何個のライムを切ればよいかを知りたいと思っています。 limesToCut関数は、切るライムの個数を戻すようにします。

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

3. シフトを終える

Li Meiはいつも15時まで働きます。 その後は、従業員のDmitryが引き継ぎます。 Li Meiのシフトが終わる時点で、注文は入っているけれどまだ準備できていない飲み物がよくあります。 そうした残りのジュースは、Dmitryが準備します。

引き継ぎを楽にするために、Li Meiのシフトに残っている分数と、注文済みでまだ準備できていないジュースの配列を入力として受け取る関数remainingOrdersを実装しましょう。 この関数は、Li Meiが勤務時間の終わりまでに準備を始められない注文を戻すようにします。

シフトの残り時間は、常に0より大きくなります。 準備するジュースの配列が空になることはありません。 さらに、注文は配列に並んでいる順番どおりに準備されます。 Li Meiが何かのジュースを混ぜ始めたら、少し長く働くことになっても、必ず最後まで作り上げます。 Dmitryが引き受ける必要のある残りの注文がなければ、空の配列を戻すようにします。

remainingOrders(5, ['Energizer', 'All or Nothing', 'Green Garden']);
// => ['Green Garden']
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
JavaScript Exercism

ミックスジュースを始める準備はできましたか?

Exercismに登録すれば、37個のコンセプト159個の演習、そして本物の人間によるメンタリングとともに、JavaScriptを学んでマスターできます。すべて無料です。