ট্র্যাক
/
Elixir
Elixir
/
অনুশীলনী
/
সর্বোচ্চ স্কোর
সর্বোচ্চ স্কোর

সর্বোচ্চ স্কোর

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

ভূমিকা

ম্যাপ

Elixir-এ ম্যাপ হলো কী (key)-ভ্যালু জোড়ায় তথ্য জমা রাখার ডেটা স্ট্রাকচার। অন্য ভাষায় এগুলোকে অ্যাসোসিয়েটিভ অ্যারে (PHP), হ্যাশ (Perl 5, Raku) বা ডিকশনারি (Python) নামেও চেনা হয়।

কী (key) আর ভ্যালু যেকোনো ডেটা টাইপের হতে পারে, তবে কী (key) যদি অ্যাটম হয়, তাহলে আমরা একটি শর্টহ্যান্ড সিনট্যাক্স ব্যবহার করতে পারি। অ্যাক্সেস বা রিটার্ন করার সময় ম্যাপ তার এন্ট্রিগুলোর ক্রম নিশ্চিত করে না।

লিটারাল ফর্ম

একটি ফাঁকা ম্যাপ ঘোষণা করা হয় শুধু %{} দিয়ে। একটি ম্যাপ লিটারালে আইটেম যোগ করতে চাইলে আমরা দুটি রূপ ব্যবহার করতে পারি:

# If the key is an atom:
%{atom_key: 1}

# If the key is a different type:
%{1 => :atom_value}

# You can even mix these if the atom form comes second:
%{"first_form" => :a, atom_form: :b}

কোনো একক ক্যানোনিকাল ফরম্যাট না থাকলেও, কী (key)-ভ্যালু লিটারাল জোড়াগুলো প্রকাশের জন্য একটি সামঞ্জস্যপূর্ণ উপায় বেছে নিন।

Map মডিউলের ফাংশন

Elixir ম্যাপ নিয়ে কাজ করার জন্য Map মডিউলে অনেক ফাংশন দেয়। Map মডিউলের কিছু ফাংশনে ম্যাপের রূপান্তরে সাহায্য করার জন্য ফাংশনের ভেতরে একটি অ্যানোনিমাস ফাংশন পাস করতে হয়।

কনস্ট্যান্ট হিসেবে মডিউল অ্যাট্রিবিউট

Elixir-এ আমরা মডিউল অ্যাট্রিবিউট ডিফাইন করতে পারি, যেগুলো আমাদের ফাংশনে কনস্ট্যান্ট হিসেবে ব্যবহার করা যায়।

defmodule Example do
  # Defines the attribute as the value 1
  @constant_number 1

  def example_value() do
    # Returns the value 1
    @constant_number
  end
end

মডিউল কনস্ট্যান্ট ডিফাইন করতে ব্যবহার করা হলে অ্যাট্রিবিউট যেকোনো এক্সপ্রেশন হতে পারে, যা কম্পাইলেশনের সময় ইভ্যালুয়েট করা যায়। কম্পাইলেশনের পরে অবশ্য মডিউল অ্যাট্রিবিউট আর অ্যাক্সেস করা যায় না, কারণ কম্পাইলের সময়ই সেগুলো এক্সপ্যান্ড হয়ে যায়, অনেকটা C-এর মতো ভাষায় ডিফাইন করা ম্যাক্রোর মতো।

নির্দেশনা

এই অনুশীলনীতে, আপনি আপনার স্থানীয় আর্কেড হলের সবচেয়ে জনপ্রিয় গেমের হাই স্কোর হিসাব রাখার একটি উপায় তৈরি করছেন।

1. একটি নতুন হাই স্কোর ম্যাপ ডিফাইন করুন

নতুন একটি হাই স্কোর ম্যাপ তৈরি করতে, HighScore.new/0 ফাংশনটি ডিফাইন করুন, যা কোনো আর্গুমেন্ট নেয় না এবং হাই স্কোরের একটি নতুন, খালি ম্যাপ রিটার্ন করে।

HighScore.new()
# => %{}

2. হাই স্কোর ম্যাপে প্লেয়ার যোগ করুন

হাই স্কোর ম্যাপে একজন প্লেয়ার যোগ করতে, HighScore.add_player/3 ডিফাইন করুন, যা তিনটি আর্গুমেন্ট নেয় এমন একটি ফাংশন:

  • প্রথম আর্গুমেন্টটি স্কোরের ম্যাপ।
  • দ্বিতীয় আর্গুমেন্টটি স্ট্রিং হিসেবে একজন প্লেয়ারের নাম।
  • তৃতীয় আর্গুমেন্টটি ইন্টিজার হিসেবে স্কোর। আর্গুমেন্টটি অপশনাল। তৃতীয় আর্গুমেন্টটি 0 ডিফল্ট মান দিয়ে ইমপ্লিমেন্ট করুন।

ডিফল্ট প্রাথমিক স্কোরটি একটি মডিউল অ্যাট্রিবিউটে সংরক্ষণ করুন। এটি আবার দরকার হবে।

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 0, "José Valim"=> 486_373}

3. স্কোর ম্যাপ থেকে প্লেয়ার সরান

হাই স্কোর ম্যাপ থেকে একজন প্লেয়ার সরাতে, HighScore.remove_player/2 ডিফাইন করুন, যা দুটি আর্গুমেন্ট নেয়:

  • প্রথম আর্গুমেন্টটি স্কোরের ম্যাপ।
  • দ্বিতীয় আর্গুমেন্টটি স্ট্রিং হিসেবে প্লেয়ারের নাম।
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.remove_player(score_map, "Dave Thomas")
# => %{}

4. একজন প্লেয়ারের স্কোর রিসেট করুন

একজন প্লেয়ারের স্কোর রিসেট করতে, HighScore.reset_score/2 ডিফাইন করুন, যা দুটি আর্গুমেন্ট নেয়:

  • প্রথম আর্গুমেন্টটি স্কোরের ম্যাপ।
  • দ্বিতীয় আর্গুমেন্টটি স্ট্রিং হিসেবে প্লেয়ারের নাম, যার স্কোর আপনি রিসেট করতে চান।

প্লেয়ারের কোনো স্কোর না থাকলেও ফাংশনটি কাজ করা উচিত।

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.reset_score(score_map, "José Valim")
# => %{"José Valim"=> 0}

5. একজন প্লেয়ারের স্কোর আপডেট করুন

আগের স্কোরের সাথে যোগ করে একজন প্লেয়ারের স্কোর আপডেট করতে, HighScore.update_score/3 ডিফাইন করুন, যা তিনটি আর্গুমেন্ট নেয়:

  • প্রথম আর্গুমেন্টটি স্কোরের ম্যাপ।
  • দ্বিতীয় আর্গুমেন্টটি স্ট্রিং হিসেবে প্লেয়ারের নাম, যার স্কোর আপনি আপডেট করতে চান।
  • তৃতীয় আর্গুমেন্টটি সেই স্কোর, যা আপনি সংরক্ষিত হাই স্কোরের সাথে যোগ করতে চান।

প্লেয়ারের আগের কোনো স্কোর না থাকলেও ফাংশনটি কাজ করা উচিত। ধরে নিন আগের স্কোরটি 0।

score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.update_score(score_map, "José Valim", 5)
# => %{"José Valim"=> 486_378}

6. প্লেয়ারদের একটি অ্যারে পান

প্লেয়ারদের একটি অ্যারে পেতে, HighScore.get_players/1 ডিফাইন করুন, যা একটি আর্গুমেন্ট নেয়:

  • প্রথম আর্গুমেন্টটি স্কোরের ম্যাপ।
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas", 2_374)
# => %{"Dave Thomas" => 2_374}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 2_374, "José Valim"=> 486_373}
HighScore.get_players(score_map)
# => ["Dave Thomas", "José Valim"]
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Elixir Exercism

সর্বোচ্চ স্কোর শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।