عصائر مشكّلة

عصائر مشكّلة

تمرين تعلّمي

مقدمة

حلقات 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 يمكنك غالبًا تجنّب تغليف أجزاء كبيرة من جسم الحلقة داخل جملة شرطية.

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

إلى جانب الجملة الشرطية، لدى JavaScript أيضًا جملة switch لتنفيذ المنطق بشكل شرطي. وتُستخدم عندما يلزم مقارنة متغير واحد بعدة حالات مختلفة. وتتم المقارنة بالتحقق من التساوي الصارم (===)، راجع المقارنة. وبالنسبة لمتغير ما x، تأخذ جملة switch في JavaScript الصيغة التالية.

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 تلك الخيارات. وهذا السلوك، أي "التساقط الافتراضي"، خطأ شائع عند استخدام switch في JavaScript. وداخل دالة، يمكن أيضًا استخدام return بدلًا من break لتجنّب هذه المشكلة.

التعليمات

تدير صديقتك لي مي بار عصائر تبيع فيه عصائر فواكه مشكّلة لذيذة. أنت زبون دائم في متجرها، وقد أدركت أنك تستطيع تسهيل حياة صديقتك. لذلك قررت استخدام مهاراتك في البرمجة لمساعدة لي مي في عملها.

1. حدّد المدة التي يستغرقها خلط عصير

تحب لي مي أن تخبر عملاءها مسبقًا بالمدة التي عليهم انتظارها للحصول على عصير طلبوه من القائمة. ويصعب عليها تذكّر الأرقام الدقيقة لأن الوقت اللازم لخلط العصائر يختلف. خلط '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. جدّد مخزون شرائح الليمون

تشمل كثير من إبداعات لي مي شرائح الليمون، إما كمكوّن وإما كجزء من الزينة. لذلك عندما تبدأ ورديتها في الصباح، عليها أن تتأكد من أن وعاء شرائح الليمون ممتلئ لليوم الذي ينتظرها.

نفّذ الدالة limesToCut التي تأخذ عدد شرائح الليمون التي تحتاج لي مي إلى تقطيعها، ومصفوفة تمثّل مخزون الليمون الكامل المتوفر لديها. يمكنها الحصول على 6 شرائح من ليمونة 'small'، و8 شرائح من ليمونة 'medium'، و10 شرائح من ليمونة 'large'. وهي تقطّع الليمون دائمًا بالترتيب الذي يظهر به في القائمة، بدءًا من العنصر الأول. وتستمر حتى تصل إلى عدد الشرائح الذي تحتاجه أو حتى ينفد الليمون.

تريد لي مي أن تعرف مسبقًا عدد الليمونات التي عليها تقطيعها. ينبغي أن تُرجع الدالة limesToCut عدد الليمونات الواجب تقطيعها.

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

3. أنهِ الوردية

تعمل لي مي دائمًا حتى الساعة 3 مساءً. ثم يتولّى الأمر بعدها موظفها دميتري. غالبًا ما تكون هناك مشروبات طُلبت ولم تُحضَّر بعد عند انتهاء وردية لي مي. عندها يحضّر دميتري العصائر المتبقية.

لتسهيل تسليم العمل، نفّذ دالة remainingOrders تأخذ عدد الدقائق المتبقية من وردية لي مي، ومصفوفة بالعصائر التي طُلبت ولم تُحضَّر بعد. ينبغي أن تُرجع الدالة الطلبات التي لا تستطيع لي مي البدء في تحضيرها قبل نهاية يوم عملها.

سيكون الوقت المتبقي في الوردية دائمًا أكبر من 0. ولن تكون مصفوفة العصائر الواجب تحضيرها فارغة أبدًا. علاوة على ذلك، تُحضَّر الطلبات بالترتيب الذي تظهر به في المصفوفة. وإذا بدأت لي مي في خلط عصير معيّن، فستُنهيه دائمًا حتى إن اضطرت إلى العمل وقتًا أطول قليلًا. وإذا لم تتبقَّ طلبات يحتاج دميتري إلى الاعتناء بها، فينبغي إرجاع مصفوفة فارغة.

remainingOrders(5, ['Energizer', 'All or Nothing', 'Green Garden']);
// => ['Green Garden']
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
JavaScript Exercism

مستعد لبدء عصائر مشكّلة؟

سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.