أعلى نتيجة

أعلى نتيجة

تمرين تعلّمي

مقدمة

الخرائط

الخرائط في Elixir هي بنية البيانات المخصصة لتخزين المعلومات في أزواج من المفتاح والقيمة. وفي لغات أخرى، قد تُعرف هذه أيضًا باسم المصفوفات الترابطية (PHP)، أو الهاشات (Perl 5، Raku)، أو القواميس (Python).

يمكن أن تكون المفاتيح والقيم من أي نوع بيانات، لكن إذا كان المفتاح ذرة يمكننا استخدام صيغة مختصرة. ولا تضمن الخرائط ترتيب عناصرها عند الوصول إليها أو إرجاعها.

الصيغ الحرفية

تُعرَّف الخريطة الفارغة ببساطة بالصيغة %{}. وإذا أردنا إضافة عناصر إلى خريطة حرفية، يمكننا استخدام صيغتين:

# 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}

ورغم أنه لا توجد صيغة قياسية، اختر أسلوبًا متسقًا لتمثيل أزواج المفتاح والقيمة الحرفية.

دوال وحدة 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، وهي دالة تأخذ 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، التي تأخذ 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.