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

بازی حدس زدن

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

مقدمه

عبارت case

در Gleam می‌توان از عبارت case برای اجرای شرطی کد استفاده کرد. با عبارت case می‌توان یک مقدار را در برابر یک یا چند «الگو» آزمود. نمونه‌ای از چنین الگویی «الگوی مقدار ثابت» است که یک مقدار را با یک مقدار ثابت (مثلاً 1 یا "hello") تطبیق می‌دهد.

عبارت case با کلیدواژه‌ی case نوشته می‌شود:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    1 -> "One"
  }
}

گرچه ممکن است این شبیه دستورهای switch در زبان‌های دیگر به نظر برسد، تطبیق الگو زمانی می‌درخشد که از الگوهای دیگر هم استفاده کنید. یکی از این الگوها «الگوی متغیر» است که به کمک آن می‌توان به یک متغیر مقدار داد. در این مثال، اگر number برابر 0 نباشد، مقدار آن به متغیر i اختصاص داده می‌شود:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i -> "Non zero"
  }
}

در برخی موارد ممکن است بخواهید شرطی دیگر به یک الگو اضافه کنید. به این کار «نگهبان» (بند) می‌گویند که می‌توان آن را با کلیدواژه‌ی if اضافه کرد:

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
  }
}

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

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

pub fn describe(number: Int) -> String {
  case number {
    0 -> "Zero"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}

// No compiler error

در یک بند می‌توان چندین الگو را تطبیق داد و هر الگو را با | از الگوی دیگر جدا کرد. به هر بند فقط یک نگهبان می‌توان اضافه کرد:

pub fn describe(number: Int) -> String {
  let yell = True
  case number {
    0 -> "Zero"
    3 | 5 -> "One of the first odd prime numbers"
    2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
    i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
    i if i < 0 -> "Negative number"
    _ -> "Positive number"
  }
}
// No compiler error

عبارت case مقدار را از بالا به پایین با هر الگو می‌آزماید تا الگوی منطبق را پیدا کند و کد مربوط به آن الگو را اجرا کند. ترتیب الگوها مهم است!

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

در این تمرین، دارید با یک دوست بازی حدس عدد انجام می‌دهید. قواعد بازی ساده است: شما به‌طور مخفیانه عددی بین 1 و 100 انتخاب می‌کنید و دوستتان تلاش می‌کند حدس بزند چه عددی را انتخاب کرده‌اید. برای کمک به دوستتان، بسته به اینکه حدس چقدر به عددی که انتخاب کرده‌اید (42) نزدیک بوده، پاسخ متفاوتی می‌دهید. قواعد پاسخ‌های مختلف این‌هاست:

  • اگر حدس 42 باشد: «Correct»
  • اگر حدس 41 یا 43 باشد: «So close»
  • اگر حدس کمتر از 41 باشد: «Too low»
  • اگر حدس بیشتر از 43 باشد: «Too high»

چهار کار دارید تا پاسخ حدس‌ها را پیاده‌سازی کنید.

1. پاسخ به یک حدس درست

تابع reply را پیاده‌سازی کنید تا به یک حدس درست پاسخ دهد:

reply(42)
// -> "Correct"

2. پاسخ به یک حدس نزدیک

تابع reply را تغییر دهید تا به حدس‌های نزدیک پاسخ دهد:

reply(41)
// -> "So close"

3. پاسخ به حدس‌های خیلی پایین

تابع reply را تغییر دهید تا به حدس‌های خیلی پایین پاسخ دهد:

reply(25)
// -> "Too low"

4. پاسخ به حدس‌های خیلی بالا

تابع reply را تغییر دهید تا به حدس‌های خیلی بالا پاسخ دهد:

reply(88)
// -> "Too high"
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Gleam Exercism

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

در Exercism ثبت‌نام کنید تا Gleam را همراه با 33 مفهوم122 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.