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

نفوذ آنالین

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

مقدمه

منطقی

نوع Bool که «منطقی» نامیده می‌شود (و گاهی «بولی»)، یکی از بلوک‌های سازنده‌ی زبان است. هدفش توصیف این است که یک عبارت درست است یا غلط، و این کار را با دو مقدار متناظر True و False انجام می‌دهد.

مقدارهای منطقی را می‌توان با عملگرهای && («AND») و || («OR») ترکیب کرد و با تابع not نقیضشان کرد.

مقدارهای منطقی همچنین برای ساختن شاخه‌هایی در کد بسیار به کار می‌آیند؛ شاخه‌هایی که فقط وقتی اجرا می‌شوند که شرط‌های مشخصی برقرار باشند. در Elm این کار با یک عبارت if-then-else انجام می‌شود که به شکل زیر به کار می‌رود.

if someCondition || (someOtherCondition && anotherCondition) then
    doSomething
else
    doSomethingElse

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

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

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

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

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

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

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

تابع canFastAttack را پیاده‌سازی کنید که یک «مقدار منطقی» می‌گیرد و نشان می‌دهد آیا شوالیه بیدار است یا نه. این تابع اگر بر اساس وضعیت شوالیه بتوان حمله‌ی سریع انجام داد، True برمی‌گرداند. در غیر این صورت، False برمی‌گرداند:

knightIsAwake = True

canFastAttack knightIsAwake
    --> False

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

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

knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False

canSpy knightIsAwake archerIsAwake prisonerIsAwake
    --> True

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

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

archerIsAwake = False
prisonerIsAwake = True

canSignalPrisoner archerIsAwake prisonerIsAwake
    --> True

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

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

knightIsAwake = False
archerIsAwake = True
prisonerIsAwake = False
petDogIsPresent = False

canFreePrisoner knightIsAwake archerIsAwake prisonerIsAwake petDogIsPresent
    --> False

5. شمارش آسیبی که یک حمله‌ی پنهانی می‌تواند وارد کند

تابع stealthAttackDamage را پیاده‌سازی کنید که یک مقدار منطقی می‌گیرد و نشان می‌دهد آیا آنالین شناسایی شده است یا نه. این تابع اگر شناسایی شده باشد ۷ و در غیر این صورت ۱۲ برمی‌گرداند.

annalynIsDetected = True

stealthAttackDamage annalynIsDetected
    --> 7
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elm Exercism

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

در Exercism ثبت‌نام کنید تا Elm را همراه با 28 مفهوم110 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.