أعلى النتائج

أعلى النتائج

تمرين تعلّمي

مقدمة

جداول التجزئة

جداول التجزئة في 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 في مفهوم آخر.

التعليمات

لامونت كائن فضائي من عالم 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.