المسارات
/
Python
Python
/
التمارين
/
التخفيف من الانهيار
التخفيف من الانهيار

التخفيف من الانهيار

تمرين تعلّمي

مقدمة

في Python، تُستخدم عبارات if[^] وelif (وهي اختصار لعبارة 'else and if') وelse من أجل التحكم في مسار التنفيذ واتخاذ القرارات داخل البرنامج. وعلى خلاف كثير من لغات البرمجة الأخرى، لا تقدّم إصدارات Python 3.9 وما دونها عبارة case-switch رسمية، بل تستخدم عدة عبارات elif لتحقيق غرض مشابه.

وتقدّم Python 3.10 صيغة مختلفة من عبارة case-switch تُسمى structural pattern matching، وسنتناولها على حدة في مفهوم آخر.

تستخدم الجمل الشرطية تعبيرات يجب أن تُقيَّم إلى True أو False، إما بإرجاع قيمة من النوع bool مباشرةً، أو بالتقييم باعتبارها "truthy" أو "falsy".

x = 10
y = 5

# The comparison '>' returns the bool 'True',
# so the statement is printed.
if x > y:
    print("x is greater than y")
...
>>> x is greater than y

عند اقترانها بـ if، تُنفَّذ كتلة الكود الاختيارية else عندما تُقيَّم حالة if الأصلية إلى False:

x = 5
y = 10

# The comparison '>' here returns the bool 'False',
# so the 'else' block is executed instead of the 'if' block.
if x > y:
    print("x is greater than y")
else:
    print("y is greater than x")
...
>>> y is greater than x

تتيح elif عمليات تقييم/تفرّعات متعددة.

x = 5
y = 10
z = 20

# The 'elif' statement allows for the checking of more conditions.
if x > y:
    print("x is greater than y and z")
elif y > z:
    print("y is greater than x and z")
else:
    print("z is greater than x and y")
...
>>> z is greater than x and y

يمكن دمج العمليات المنطقية والمقارنات مع الجمل الشرطية لاختبارات أكثر تعقيدًا:

>>> def classic_fizzbuzz(number):
        if number % 3 == 0 and number % 5 == 0:
            say = 'FizzBuzz!'
        elif number % 5 == 0:
            say = 'Buzz!'
        elif number % 3 == 0:
            say = 'Fizz!'
        else:
            say = str(number)
        
        return say

>>> classic_fizzbuzz(15)
'FizzBuzz!'

>>> classic_fizzbuzz(13)
'13'

التعليمات

في هذا التمرين، سنطوّر نظام تحكّم بسيطًا لمفاعل نووي.

لكي يُنتج المفاعل الطاقة، يجب أن يكون في حالة الحالة الحرجة. إذا كان المفاعل في حالة أقل من الحالة الحرجة، فقد يتضرّر. وإذا تجاوزت حالة المفاعل الحالة الحرجة، فقد يزداد الحمل عليه ويؤدي ذلك إلى انصهار. نريد أن نقلّل من احتمالات الانصهار وأن ندير حالة المفاعل بشكل صحيح.

المهام الثلاث التالية كلها متعلقة بكتابة كود للحفاظ على الحالة المثالية للمفاعل.

1. تحقّق من الحالة الحرجة

أول ما يجب أن يفعله نظام التحكّم هو التحقق مما إذا كان المفاعل متوازنًا في الحالة الحرجة. يُقال إن المفاعل متوازن في الحالة الحرجة إذا حقّق الشروط التالية:

  • درجة الحرارة أقل من 800 كلفن.
  • عدد النيوترونات المنبعثة في الثانية أكبر من 500.
  • حاصل ضرب درجة الحرارة في عدد النيوترونات المنبعثة في الثانية أقل من 500000.

نفّذ الدالة is_criticality_balanced() التي تأخذ temperature المقيسة بالكلفن وneutrons_emitted كمعاملات، وتُرجع True إذا تحقّقت شروط الحالة الحرجة، وFalse إذا لم تتحقّق.

>>> is_criticality_balanced(750, 600)
True

2. حدّد نطاق قدرة الخرج

بعد أن يبدأ المفاعل في إنتاج الطاقة، يجب تحديد كفاءته. يمكن تصنيف الكفاءة في 4 نطاقات:

  1. green -> كفاءة 80% أو أكثر،
  2. orange -> كفاءة أقل من 80% ولكن 60% على الأقل،
  3. red -> كفاءة أقل من 60%، ولكنها لا تزال 30% أو أكثر،
  4. black -> كفاءة أقل من 30%.

يمكن حساب قيمة النسبة المئوية كالتالي (generated_power/theoretical_max_power)*100 حيث generated_power = voltage * current. لاحظ أن قيمة النسبة المئوية عادة ليست عددًا صحيحًا، لذا احرص على الاستخدام الصحيح للمقارنتين < و<=.

نفّذ الدالة reactor_efficiency(<voltage>, <current>, <theoretical_max_power>)، بثلاثة معاملات: voltage، وcurrent، وtheoretical_max_power. يجب أن تُرجع هذه الدالة نطاق كفاءة المفاعل: 'green'، أو 'orange'، أو 'red'، أو 'black'.

>>> reactor_efficiency(200,50,15000)
'orange'

3. آلية الأمان عند الفشل

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

نفّذ الدالة المسماة fail_safe()، التي تأخذ 3 معاملات: temperature المقيسة بالكلفن، وneutrons_produced_per_second، وthreshold، وتُخرج رمز حالة للمفاعل.

  • إذا كان temperature * neutrons_produced_per_second < 90% من threshold، فأخرِج رمز حالة 'LOW' للإشارة إلى ضرورة إزالة قضبان التحكم لإنتاج الطاقة.

  • إذا كانت القيمة temperature * neutrons_produced_per_second في حدود 10% من threshold (أي أقل من العتبة بنسبة 0-10%، أو عند العتبة، أو أكبر منها بنسبة 0-10%)، فإن المفاعل في الحالة الحرجة ويجب إخراج رمز الحالة 'NORMAL'، للإشارة إلى أن المفاعل في حالة مثالية وأن قضبان التحكم في موضع مثالي.

  • إذا لم تكن temperature * neutrons_produced_per_second ضمن النطاقات المذكورة أعلاه، فإن المفاعل يتجه نحو الانصهار ويجب تمرير رمز حالة 'DANGER' لإيقاف المفاعل فورًا.

>>> fail_safe(temperature=1000, neutrons_produced_per_second=30, threshold=5000)
'DANGER'
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Python Exercism

مستعد لبدء التخفيف من الانهيار؟

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