تسلل أنالين

تسلل أنالين

تمرين تعلّمي

مقدمة

القيم المنطقية في Clojure تُمثَّل بـ true أو false.

الدوال المنطقية (الدوال التي تُرجع قيمة منطقية) تنتهي عادةً بعلامة استفهام (?)، لكن هذا مجرد اصطلاح.

تتضمن المكتبة الأساسية دوالّ للعوامل المنطقية مثل not وand وor.

التعليمات

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

بعد أن أمضت وقتًا في تتبّع الأثر، تكتشف أنالين المخيّم الذي يُحتجز فيه صديقها. ويتبيّن أن هناك خاطفَين اثنين: فارس قوي ورامي سهام ماكر.

بعد أن وجدت الخاطفَين، تفكّر أنالين في أي من الإجراءات التالية يمكنها القيام بها:

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

لديك أربع مهام: تنفيذ المنطق الذي يحدد ما إذا كانت الإجراءات أعلاه متاحة بناءً على حالة الشخصيات الثلاث الموجودة في الغابة وما إذا كان كلب أنالين حاضرًا أم لا.

1. تحقّق مما إذا كان يمكن شن هجوم سريع

نفّذ الدالة can-fast-attack? التي تأخذ قيمة منطقية تشير إلى ما إذا كان الفارس مستيقظًا. تُرجع الدالة true إذا كان يمكن شن هجوم سريع بناءً على حالة الفارس. وإلا فتُرجع false:

(def knight-awake? true)

(can-fast-attack? knight-awake?)
;;=> false

2. تحقّق مما إذا كان يمكن التجسس على المجموعة

نفّذ الدالة can-spy? التي تأخذ ثلاث قيم منطقية، تشير على الترتيب إلى ما إذا كان الفارس ورامي السهام والسجين مستيقظين. تُرجع الدالة true إذا كان يمكن التجسس على المجموعة بناءً على حالة الشخصيات الثلاث. وإلا فتُرجع false:

(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)

(can-spy? knight-awake? archer-awake? prisoner-awake?)
;;=> true

3. تحقّق مما إذا كان يمكن إعطاء السجين إشارة

نفّذ الدالة can-signal-prisoner? التي تأخذ قيمتين منطقيتين، تشير على الترتيب إلى ما إذا كان رامي السهام والسجين مستيقظين. تُرجع الدالة true إذا كان يمكن إعطاء السجين إشارة بناءً على حالة الشخصيتين. وإلا فتُرجع false:

(def archer-awake? false)
(def prisoner-awake? true)

(can-signal-prisoner? archer-awake? prisoner-awake?)
;;=> true

4. تحقّق مما إذا كان يمكن تحرير السجين

نفّذ الدالة can-free-prisoner? التي تأخذ أربع قيم منطقية. تشير المعاملات الثلاثة الأولى على الترتيب إلى ما إذا كان الفارس ورامي السهام والسجين مستيقظين. ويشير المعامل الأخير إلى ما إذا كان كلب أنالين حاضرًا. تُرجع الدالة true إذا كان يمكن تحرير السجين بناءً على حالة الشخصيات الثلاث ووجود كلب أنالين. وإلا فتُرجع false:

(def knight-awake? false)
(def archer-awake? true)
(def prisoner-awake? false)
(def dog-present? false)

(can-free-prisoner? knight-awake? archer-awake? prisoner-awake? dog-present?)
;;=> false
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Clojure Exercism

مستعد لبدء تسلل أنالين؟

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