مسیرها
/
Elixir
Elixir
/
تمرین‌ها
/
بازی حدس زدن
بازی حدس زدن

بازی حدس زدن

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

مقدمه

توابع چندشاخه‌ای

Elixir با اجازه دادن به توابع برای داشتن چندین شاخه، به رعایت Open-Closed Principle کمک می‌کند؛ بنابراین به‌جای منطق کنترلی پراکنده و سخت‌کدشده، می‌توان توابعی هدفمند نوشت که افزودن یا حذف رفتار را آسان می‌کنند.

Elixir برای نوشتن این‌ها، «شاخه‌های متعدد تابع» و «گاردها» را در اختیار شما می‌گذارد:

def number(n) when n == 7 do
  "Awesome, that's my favorite"
end

def number(_n) do
  "That's not my favorite"
end

هنگام اجرا، Elixir از بالای فایل منبع به پایین بررسی می‌کند که کدام شاخه‌ی تابع را فراخوانی کند.

متغیرهای بلااستفاده باید با زیرخط شروع شوند.

گاردها

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

  • باید خالص باشند و هیچ حالت سراسری‌ای را تغییر ندهند.
  • باید مقادیر دقیقاً true یا false برگردانند.

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

آرگومان‌های پیش‌فرض

توابع می‌توانند برای یک یا چند آرگومان مقدار پیش‌فرض تعریف کنند. بیایید این تابع را در نظر بگیریم:

def number(n \\ 13), do: "That's not my favorite"

هنگام کامپایل، Elixir برای number/0 (بدون آرگومان) و number/1 (یک آرگومان) تعریف تابع می‌سازد.

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

اگر تابع بیش از یک شاخه داشته باشد، آرگومان‌های پیش‌فرض باید در سرآیند تابع (تابعی بدون بدنه) و پیش از شاخه‌های تابع تعریف شوند:

def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."

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

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

شرط پاسخ
وقتی حدس با عدد مخفی مطابقت دارد "Correct"
وقتی حدس یکی بیشتر یا یکی کمتر از عدد مخفی است "So close"
وقتی حدس بزرگ‌تر از عدد مخفی است "Too high"
وقتی حدس کوچک‌تر از عدد مخفی است "Too low"
وقتی حدسی زده نمی‌شود "Make a guess"

همه‌ی حدس‌ها و عددهای مخفی، اعداد صحیح هستند.

1. پاسخ را برای زمانی بسازید که حدس با عدد مخفی مطابقت دارد

تابع compare/2 را پیاده‌سازی کنید که دو آرگومان می‌گیرد، secret_number و guess، که هر دو عدد صحیح هستند.

GuessingGame.compare(5, 5)
# => "Correct"

2. پاسخ را برای زمانی بسازید که حدس بزرگ‌تر از عدد مخفی است

تابع compare را تغییر دهید تا به حدس‌هایی که از عدد مخفی بزرگ‌ترند پاسخ دهد.

GuessingGame.compare(5, 8)
# => "Too high"

3. پاسخ را برای زمانی بسازید که حدس کوچک‌تر از عدد مخفی است

تابع compare را تغییر دهید تا به حدس‌هایی که از عدد مخفی کوچک‌ترند پاسخ دهد.

GuessingGame.compare(5, 2)
# => "Too low"

4. پاسخ‌ها را برای زمانی بسازید که حدس یکی بیشتر یا یکی کمتر از عدد مخفی است

تابع compare را تغییر دهید تا به حدس‌هایی که به عدد مخفی نزدیک‌اند پاسخ دهد.

GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"

5. پاسخ را برای زمانی بسازید که حدسی وجود ندارد

تابع compare را تغییر دهید تا وقتی حدسی وجود ندارد پاسخ دهد.

GuessingGame.compare(5)
# => "Make a guess"

GuessingGame.compare(5, :no_guess)
# => "Make a guess"
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Elixir Exercism

آماده‌اید بازی حدس زدن را شروع کنید؟

در Exercism ثبت‌نام کنید تا Elixir را همراه با 58 مفهوم168 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.