مسیرها
/
Common Lisp
Common Lisp
/
تمرین‌ها
/
امتیازهای برتر
امتیازهای برتر

امتیازهای برتر

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

مقدمه

جدول هش

«جدول هش» در Common Lisp یک ساختار داده برای ذخیره‌ی داده‌های انجمنی است. این جدول‌ها کلیدها را (که می‌توانند هر شیئی باشند) به مقدارها (که می‌توانند هر شیئی باشند) نگاشت می‌کنند. ممکن است در زبان‌های دیگر این مفهوم را نگاشت، دیکشنری یا هش بنامند.

ساخت جدول هش

می‌توان جدول هش را با تابع make-hash-table ساخت.

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

(توجه کنید که شکل چاپ‌شده‌ی جدول هش به پیاده‌سازی وابسته است، پس ممکن است در REPL شما متفاوت نمایش داده شود.)

بازیابی مقدارها با کلید

برای گرفتن یک مقدار از جدول هش با یک کلید، از تابع gethash استفاده می‌کنید:

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

gethash مقدارهای چندگانه را برمی‌گرداند که در مفهوم دیگری توضیح داده می‌شود.

درج مقدارها

برای درج یک مقدار در جدول هش، setf را همراه با gethash به این شکل به کار می‌برید:

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

این کار مقدار کلید :foo را در جدول هش *hash-table* به :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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.