অনুমান গেম

অনুমান গেম

লার্নিং অনুশীলনী

ভূমিকা

কেস এক্সপ্রেশন

Gleam-এ case এক্সপ্রেশন দিয়ে শর্তসাপেক্ষে কোড চালানো যায়। একটি কেস এক্সপ্রেশন ব্যবহার করে একটি মানকে এক বা একাধিক প্যাটার্ন-এর সাথে মেলানো যায়। এমন একটি প্যাটার্নের উদাহরণ হলো লিটারেল প্যাটার্ন, যা কোনো মানকে একটি নির্দিষ্ট লিটারেল মানের (যেমন 1 বা "hello") সাথে মেলায়।

কেস এক্সপ্রেশন লেখা হয় case কিওয়ার্ড দিয়ে:

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

এটি অন্য ভাষার switch স্টেটমেন্টের মতো দেখালেও, অন্য প্যাটার্নও ব্যবহার করলে প্যাটার্ন ম্যাচিংয়ের আসল শক্তি বোঝা যায়। এমনই একটি প্যাটার্ন হলো ভ্যারিয়েবল প্যাটার্ন, যা দিয়ে একটি ভ্যারিয়েবলে একটি মান অ্যাসাইন করা যায়। এই উদাহরণে, number যদি 0 না হয়, তাহলে i ভ্যারিয়েবলটিতে number-এর মানটি অ্যাসাইন করা হবে:

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

কেস এক্সপ্রেশন একটি মানকে উপর থেকে নিচে প্রতিটি প্যাটার্নের সাথে যাচাই করে, যতক্ষণ না মিলে যাওয়া একটি প্যাটার্ন পায় এবং সেই প্যাটার্নের সাথে যুক্ত লজিক চালায়। প্যাটার্নের ক্রম গুরুত্বপূর্ণ!

নির্দেশনা

এই অনুশীলনীতে আপনি একজন বন্ধুর সঙ্গে মিলে একটি সংখ্যা অনুমান করার খেলা খেলছেন। নিয়মগুলো সহজ: আপনি গোপনে 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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।