مسیرها
/
Cairo
Cairo
/
تمرین‌ها
/
نفوذ آنالین
نفوذ آنالین

نفوذ آنالین

تمرین یادگیری

مقدمه

مقدارهای «منطقی» در Cairo با نوع منطقی از پیش تعریف‌شده‌ی bool نمایش داده می‌شوند که مقدارهایش می‌توانند true یا false باشند.

let speeding = true;   // Boolean variable 'speeding' set to 'true'
let has_error = false; // Boolean variable 'has_error' set to 'false' 

Cairo از سه عملگر منطقی پشتیبانی می‌کند که می‌توانند عبارت‌ها را به مقدارهای منطقی ارزیابی کنند و true یا false برگردانند.

عملگر معنی آن
&& (و) اگر هر دو عبارت درست باشند، نتیجه «درست» است.
|| (یا) اگر حداقل یکی از عبارت‌ها درست باشد، نتیجه «درست» است.
! (نه) فقط وقتی نتیجه «درست» است که عبارت «غلط» باشد.

دستورالعمل‌ها

در این تمرین، منطق ماجراجویی یک بازی نقش‌آفرینی جدید را پیاده‌سازی می‌کنید که دوستتان در حال ساخت آن است. شخصیت اصلی بازی آنالین است؛ دختری شجاع که یک سگ خانگی خشن و وفادار دارد. متأسفانه فاجعه رخ می‌دهد: بهترین دوستش در حالی که در جنگل به دنبال توت می‌گشت، ربوده شد. آنالین تلاش می‌کند بهترین دوستش را پیدا کرده و آزاد کند و در این ماجراجویی، به‌طور اختیاری سگش را هم با خود می‌برد.

آنالین پس از مدتی که رد پای بهترین دوستش را دنبال می‌کند، اردوگاهی را پیدا می‌کند که بهترین دوستش در آن زندانی است. معلوم می‌شود دو آدم‌ربا وجود دارند: یک شوالیه‌ی قدرتمند و یک کماندار حیله‌گر.

آنالین پس از یافتن آدم‌رباها، بررسی می‌کند که می‌تواند کدام‌یک از کارهای زیر را انجام دهد:

  • حمله‌ی سریع: اگر شوالیه خواب باشد می‌توان حمله‌ی سریع انجام داد، چون پوشیدن زره برایش زمان می‌برد و در نتیجه آسیب‌پذیر خواهد بود.
  • جاسوسی: اگر دست‌کم یکی از آن‌ها بیدار باشد می‌توان از گروه جاسوسی کرد. در غیر این صورت، جاسوسی اتلاف وقت است.
  • علامت دادن به زندانی: اگر زندانی بیدار و کماندار خواب باشد می‌توان با صداهای پرندگان به زندانی علامت داد، چون کماندارها در علامت‌دهی با پرندگان آموزش دیده‌اند و می‌توانند پیام را رهگیری کنند.
  • آزاد کردن زندانی: آنالین می‌تواند تلاش کند بی‌سروصدا به اردوگاه نفوذ کرده و زندانی را آزاد کند. این کار پرخطر است و تنها به یکی از دو روش زیر می‌تواند موفق شود:
    • اگر آنالین سگ خانگی‌اش را همراه داشته باشد، در صورتی می‌تواند زندانی را نجات دهد که کماندار خواب باشد. شوالیه از سگ می‌ترسد و کماندار فرصت نمی‌کند آماده شود، پیش از آن‌که آنالین و زندانی فرار کنند.
    • اگر آنالین سگش را همراه نداشته باشد، خودش و زندانی باید بسیار بی‌سروصدا عمل کنند! آنالین می‌تواند زندانی را آزاد کند اگر زندانی بیدار باشد و شوالیه و کماندار هر دو خواب باشند، اما اگر زندانی خواب باشد نمی‌توان او را نجات داد: زندانی از ظاهر شدن ناگهانی آنالین جا می‌خورد و شوالیه و کماندار را بیدار می‌کند.

چهار وظیفه دارید: پیاده‌سازی منطق تشخیص اینکه آیا کارهای بالا با توجه به وضعیت سه شخصیتی که در جنگل پیدا شدند و حضور یا عدم حضور سگ خانگی آنالین در دسترس هستند یا نه.

1. بررسی امکان انجام حمله‌ی سریع

تابع can_fast_attack() را تعریف کنید که یک مقدار «منطقی» می‌گیرد که نشان می‌دهد شوالیه بیدار است یا نه. این تابع اگر با توجه به وضعیت شوالیه بتوان حمله‌ی سریع انجام داد، true برمی‌گرداند. در غیر این صورت، false برمی‌گرداند:

let knight_awake = true;
can_fast_attack(knight_awake); // false

2. بررسی امکان جاسوسی از گروه

تابع can_spy() را تعریف کنید که سه مقدار منطقی می‌گیرد که به‌ترتیب نشان می‌دهند شوالیه، کماندار و زندانی بیدار هستند یا نه. تابع اگر با توجه به وضعیت این سه شخصیت بتوان از گروه جاسوسی کرد، true برمی‌گرداند. در غیر این صورت، false برمی‌گرداند:

let knight_awake = false;
let archer_awake = true;
let prisoner_awake = false;
can_spy(knight_awake, archer_awake, prisoner_awake); // true

3. بررسی امکان علامت دادن به زندانی

تابع can_signal_prisoner() را تعریف کنید که دو مقدار منطقی می‌گیرد که به‌ترتیب نشان می‌دهند کماندار و زندانی بیدار هستند یا نه. تابع اگر با توجه به وضعیت این دو شخصیت بتوان به زندانی علامت داد، true برمی‌گرداند. در غیر این صورت، false برمی‌گرداند:

let archer_awake = false;
let prisoner_awake = true;
can_signal_prisoner(archer_awake, prisoner_awake); // true

4. بررسی امکان آزاد کردن زندانی

تابع can_free_prisoner() را تعریف کنید که چهار مقدار منطقی می‌گیرد. سه پارامتر اول به‌ترتیب نشان می‌دهند شوالیه، کماندار و زندانی بیدار هستند یا نه. پارامتر آخر نشان می‌دهد سگ خانگی آنالین حضور دارد یا نه. تابع اگر با توجه به وضعیت این سه شخصیت و حضور سگ خانگی آنالین بتوان زندانی را آزاد کرد، true برمی‌گرداند. در غیر این صورت، false برمی‌گرداند:

let knight_awake = false;
let archer_awake = true;
let prisoner_awake = false;
let dog_present = false;
can_free_prisoner(knight_awake, archer_awake, prisoner_awake, dog_present); // false
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Cairo Exercism

آماده‌اید نفوذ آنالین را شروع کنید؟

در Exercism ثبت‌نام کنید تا Cairo را همراه با 25 مفهوم68 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.