المسارات
/
Julia
Julia
/
التمارين
/
عصائر مشكّلة
عصائر مشكّلة

عصائر مشكّلة

تمرين تعلّمي

مقدمة

هناك أساسًا نوعان من الحلقات:

  1. حلقة تتكرر حتى يتحقق شرط.
  2. حلقة تمر على عناصر مجموعة.

كلا النوعين ممكن في Julia، رغم أن الثاني قد يكون أكثر شيوعًا.

حلقة while

للمشكلات المفتوحة التي لا يُعرف فيها عدد مرات الدوران حول الحلقة مسبقًا، توفّر Julia حلقة while.

الصيغة الأساسية بسيطة إلى حد كبير:

while condition
    do_something()
end

في هذه الحالة، سيستمر البرنامج في الدوران حول الحلقة حتى تتوقف condition عن كونها true.

هناك طريقتان للخروج من الحلقة مبكرًا:

  • يؤدي break إلى الخروج من الحلقة، ويستمر التنفيذ عند السطر التالي بعد end الخاص بالحلقة.
  • توقف return x تنفيذ الدالة الحالية، وتُرجع قيمة الإرجاع x إلى الجهة المستدعية.

مع توفّر هذين الخيارين، قد يكون من المناسب أحيانًا إنشاء حلقة "لا نهائية" باستخدام while true ... end، ثم الاعتماد على إيجاد شرط إيقاف داخل جسم الحلقة لتفعيل break أو return.

الحلقة على مجموعة

أبسط مثال هو الحلقة على نطاق.

إذا أردنا فعل شيء ما 10 مرات:

for n in 1:10
    do_something(n)
end

إذا لم تحقق التكرار الحالية شرطًا ما، فمن الممكن الانتقال فورًا إلى التكرار التالية باستخدام continue:

for n in 1:10
    if is_useless(n)
        continue
    end
    
    # we decided this iteration could be useful
    do_something_slow(n)
end

في صيغة أقصر، يمكن استبدال كتلة if بـ is_useless(n) && continue.

يمكن تكرار الحلقة على العديد من أنواع المجموعات الأخرى: عناصر في مصفوفة، ومحارف في سلسلة نصية، ومفاتيح في قاموس...

تتكرر الأمثلة حتى الآن على النطاق 1:10، حيث تكون القيمة أيضًا فهرس الحلقة.

وبشكل أعم، قد نحتاج إلى الفهرس وليس القيمة فقط. لهذا تُستخدم الدالة eachindex()، على سبيل المثال for i in eachindex(my_array) ... end.

التعليمات

صديقتك 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 دقيقة.

لمساعدة صديقتك، اكتب دالة time_to_mix_juice تأخذ عصيرًا من القائمة كوسيط وتُرجع عدد الدقائق اللازمة لخلط ذلك المشروب.

julia> time_to_mix_juice("Tropical Island")
3

julia> time_to_mix_juice("Berries & Lime")
2.5

2. أعد تعبئة مخزون شرائح الليمون الأخضر

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

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

تريد Li Mei أن تعرف مسبقًا كم حبة ليمون تحتاج إلى تقطيعها. وينبغي أن تُرجع الدالة limes_to_cut عدد حبات الليمون المطلوب تقطيعها.

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

3. اسرد أوقات خلط كل طلب في الطابور

تحب Li Mei أن تتابع المدة التي سيستغرقها خلط الطلبات التي ينتظرها الزبائن.

نفّذ الدالة order_times التي تأخذ طابورًا من الطلبات وتُرجع متجهًا بأوقات الخلط.

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

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

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

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

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

julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Julia Exercism

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

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