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

نفوذ آنالین

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

مقدمه

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

var closed bool    // boolean variable 'closed' implicitly initialized with 'false'
speeding := true   // boolean variable 'speeding' initialized with 'true'
hasError := false  // boolean variable 'hasError' initialized with 'false' 

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

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

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

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

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

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

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

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

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

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

var knightIsAwake = true
fmt.Println(CanFastAttack(knightIsAwake))
// Output: false

2. بررسی اینکه آیا می‌توان از گروه جاسوسی کرد

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

var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
fmt.Println(CanSpy(knightIsAwake, archerIsAwake, prisonerIsAwake))
// Output: true

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

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

var archerIsAwake = false
var prisonerIsAwake = true
fmt.Println(CanSignalPrisoner(archerIsAwake, prisonerIsAwake))
// Output: true

4. بررسی اینکه آیا می‌توان زندانی را آزاد کرد

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

var knightIsAwake = false
var archerIsAwake = true
var prisonerIsAwake = false
var petDogIsPresent = false
fmt.Println(CanFreePrisoner(knightIsAwake, archerIsAwake, prisonerIsAwake, petDogIsPresent))
// Output: false
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Go Exercism

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

در Exercism ثبت‌نام کنید تا Go را همراه با 34 مفهوم165 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.