হাই স্কোর

হাই স্কোর

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

ভূমিকা

হ্যাশ টেবিল

Common Lisp-এ হ্যাশ টেবিল হলো অ্যাসোসিয়েটিভ ডেটা সংরক্ষণের ডেটা স্ট্রাকচার। এগুলো কী (key)-কে মানের সাথে ম্যাপ করে, যেখানে কী (key) এবং মান দুটোই যেকোনো অবজেক্ট হতে পারে। অন্য ভাষায় এই ধারণাটিকে ম্যাপ, ডিকশনারি বা হ্যাশ বলা হতে পারে।

হ্যাশ টেবিল তৈরি করা

make-hash-table ফাংশন দিয়ে হ্যাশ টেবিল তৈরি করা যায়।

(make-hash-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {10024AD2B3}>

(খেয়াল করুন, হ্যাশ টেবিল প্রিন্ট হলে যা দেখা যায় তা ইমপ্লিমেন্টেশন-নির্ভর, তাই আপনার REPL-এ তা ভিন্নভাবে দেখা যেতে পারে।)

কী (key) দিয়ে মান বের করা

হ্যাশ টেবিল থেকে কোনো কী (key) দিয়ে একটি মান পেতে আপনি gethash ফাংশন ব্যবহার করেন:

*h* ; => #<HASH-TABLE :TEST EQL :COUNT 3 {10024AD2B3}>`
(gethash :foo *h*) ; => :bar
                   ;    T

gethash একাধিক মান রিটার্ন করে, যা আরেকটি ধারণায় ব্যাখ্যা করা হবে।

মান যুক্ত করা

হ্যাশ টেবিলে একটি মান যুক্ত করতে আপনি gethash-এর সাথে setf এভাবে ব্যবহার করেন:

(setf (gethash :foo *hash-table*) :bar) : => :bar

এটি *hash-table* হ্যাশ টেবিলে :foo কী (key)-এর মান :bar-এ পরিবর্তন করবে। এটি মানটি রিটার্ন করে।

setf-এর ব্যবহার আরেকটি ধারণায় ব্যাখ্যা করা হবে।

নির্দেশনা

Lamont একটি Lisp ভিনগ্রহী, যে নিজের একটি ভিডিও গেম লিখতে চায়। এর মধ্যে একটি কাজে সে আপনার সাহায্য চেয়েছে, তা হলো একটি হাই স্কোর তালিকার হিসাব রাখা।

1. হাই স্কোর টেবিল তৈরি করা

make-high-score-table নামের একটি ফাংশন ডিফাইন করুন, যেটি কোনো আর্গুমেন্ট নেয় না এবং একটি নতুন খালি হ্যাশ টেবিলে ইভ্যালুয়েট হয়:

(make-high-score-table) ; => #<HASH-TABLE :TEST EQL :COUNT 0 {1005A90103}>

2. টেবিলে একজন প্লেয়ার যোগ করা

টেবিলে একজন প্লেয়ার যোগ করতে add-player নামের একটি ফাংশন ডিফাইন করুন, যেটি দুটি আর্গুমেন্ট নেয়:

  • হাই স্কোর টেবিলটি
  • কিওয়ার্ড হিসেবে প্লেয়ারের নাম

প্লেয়ারের প্রাথমিক স্কোর শূন্য সেট করুন।

(add-player hash-table :louis) ; => 0
(add-player hash-table :lilly) ; => 0

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

একজন প্লেয়ারের স্কোর সেট করতে set-score নামের একটি ফাংশন ডিফাইন করুন, যেটি তিনটি আর্গুমেন্ট নেয়:

  • হাই স্কোর টেবিলটি
  • কিওয়ার্ড হিসেবে প্লেয়ারের নাম
  • ইন্টিজার হিসেবে প্লেয়ারের স্কোর
(set-score hash-table :louis 1234) ; => 1234

4. টেবিল থেকে একটি স্কোর পাওয়া

টেবিল থেকে একজন প্লেয়ারের স্কোর পেতে get-score নামের একটি ফাংশন ডিফাইন করুন, যেটি দুটি আর্গুমেন্ট নেয়:

  • হাই স্কোর টেবিলটি
  • কিওয়ার্ড হিসেবে প্লেয়ারের নাম

এই ফাংশনটি প্লেয়ারের জন্য সংরক্ষিত স্কোরে ইভ্যালুয়েট হওয়া উচিত। যদি সেই প্লেয়ারের জন্য কোনো স্কোর সংরক্ষিত না থাকে, অথবা সেই প্লেয়ার এখনো টেবিলে না থাকে, তাহলে 0 ইভ্যালুয়েট হবে।

(get-score hash-table :louis)                         ; => 1234
(get-score hash-table :lilly)                         ; => 0
(get-score hash-table :not-a-character-in-this-story) ; => 0

5. টেবিল থেকে একজন প্লেয়ার সরানো

হাই স্কোর টেবিল থেকে একজন প্লেয়ার সরাতে remove-player নামের একটি ফাংশন ডিফাইন করুন, যেটি দুটি আর্গুমেন্ট নেয়:

  • হাই স্কোর টেবিলটি
  • কিওয়ার্ড হিসেবে প্লেয়ারের নাম

এই ফাংশনটি এমন ক্ষেত্রগুলোও সুন্দরভাবে সামলাতে পারবে, যেখানে প্লেয়ারকে এখনো টেবিলে যোগ করা হয়নি। স্বাভাবিকভাবেই, একজন প্লেয়ার সরিয়ে ফেলার পর টেবিল থেকে তার স্কোর নিলে সেটি শূন্য হবে।

(set-score hash-table :louis 1234)           ; => 1234
(remove-player hash-table :louis)            ; => T
(get-score hash-table :louis)                ; => 0

(remove-player hash-table :not-in-the-table) ; => NIL
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Common Lisp Exercism

হাই স্কোর শুরু করতে প্রস্তুত?

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