المسارات
/
Elixir
Elixir
/
التمارين
/
سجل القبطان
سجل القبطان

سجل القبطان

تمرين تعلّمي

مقدمة

العشوائية

في Elixir، لاختيار عنصر عشوائي من بنية بيانات قابلة للتعداد (مثل مصفوفة أو نطاق)، نستخدم Enum.random. ستختار هذه الدالة عنصرًا واحدًا، مع تساوي احتمال اختيار كل عنصر.

لا توفر Elixir دوال خاصة بها لاختيار عدد عشري عشوائي. للقيام بذلك، علينا استخدام Erlang مباشرة.

مكتبات Erlang

يعمل كود Elixir داخل الآلة الافتراضية BEAM. وBEAM جزء من نظام زمن التشغيل الخاص بـ Erlang. ولأن Elixir مستوحاة من Erlang وتتشارك معها بيئة التشغيل، فإنها توفر توافقًا تشغيليًا ممتازًا مع مكتبات Erlang. وهذا يعني أن مطوري Elixir يمكنهم استخدام مكتبات Erlang من داخل كود Elixir الخاص بهم. بل إن مجتمع Elixir لا يشجع على كتابة مكتبات Elixir لوظائف توفرها مكتبات Erlang بالفعل.

ونتيجة لذلك، فإن بعض الإمكانات، مثل العمليات الحسابية أو دوال المؤقتات، لا تتوفر في Elixir إلا عبر Erlang.

مكتبة Erlang القياسية متاحة للاستخدام في كود Elixir دون أي خطوات إضافية.

يمكن استدعاء دوال Erlang بالطريقة نفسها التي نستدعي بها دوال Elixir، مع فرق صغير واحد. أسماء وحدات Erlang هي ذرات بنمط snake_case. على سبيل المثال، لاستدعاء الدالة pi/0 من الوحدة math في Erlang، نكتب:

:math.pi()
# => 3.141592653589793

أكثر دوال Erlang استخدامًا والتي ليس لها مقابل في Elixir هي:

  • :timer.sleep/1 التي توقف عملية لمدة عدد معين من المللي ثانية.
  • :rand.uniform/0 التي تولّد عددًا عشريًا عشوائيًا x، حيث 0.0 <= x < 1.0.
  • :io_lib.format/2 التي توفر تنسيق السلاسل النصية على طريقة C (باستخدام متتاليات تحكم). باستخدام هذه الدالة، يمكننا مثلًا طباعة عدد صحيح في أي أساس بين 2 و36 أو تنسيق عدد عشري بالدقة المطلوبة. لاحظ أن هذه الدالة، مثل كثير من دوال Erlang، تُرجع charlist.
  • الوحدة math التي توفر دوالًا حسابية مثل sin/1 وcos/1 وlog2/1 وlog10/1 وpow/2 وغيرها.

لاستكشاف مكتبة Erlang القياسية، تصفّح الدليل المرجعي STDLIB.

التعليمات

ماري من أشدّ المعجبات بالمسلسل التلفزيوني Star Trek: The Next Generation. غالبًا ما تلعب ألعاب تقمّص الأدوار الورقية، حيث تتظاهر هي وأصدقاؤها بأنهم طاقم السفينة Starship Enterprise. شخصية ماري هي الكابتن بيكارد، ما يعني أنه عليها الاحتفاظ بسجل القبطان. تحب الجزء الإبداعي من اللعبة، لكنها لا تحب توليد بيانات عشوائية على الفور.

ساعد ماري بإنشاء مولّدات عشوائية للبيانات التي تظهر كثيرًا في سجل القبطان.

1. أنشئ كوكبًا عشوائيًا

تصادف السفينة Starship Enterprise كواكب كثيرة في رحلاتها. تُقسَّم الكواكب في عالم Star Trek إلى فئات بناءً على خصائصها. فعلى سبيل المثال، الأرض كوكب من الفئة M. جميع فئات الكواكب الممكنة هي: D، H، J، K، L، M، N، R، T وY.

نفّذ الدالة random_planet_class/0. يجب أن تُرجع إحدى فئات الكواكب عشوائيًا.

CaptainsLog.random_planet_class()
# => "K"

2. أنشئ رقم تسجيل عشوائيًا لسفينة فضائية

ليست Enterprise (رقم التسجيل NCC-1701) السفينة الفضائية الوحيدة التي تحلّق في الأرجاء! وعندما تلتقي بسفينة فضائية أخرى، تحتاج ماري إلى تدوين رقم تسجيل تلك السفينة.

تبدأ أرقام التسجيل بالبادئة "NCC-" ثم رقم من 1000 إلى 9999 (شاملًا).

نفّذ الدالة random_ship_registry_number/0 التي تُرجع رقم تسجيل عشوائيًا لسفينة فضائية.

CaptainsLog.random_ship_registry_number()
# => "NCC-1947"

3. أنشئ تاريخًا نجميًا عشوائيًا

وما فائدة سجل لا يتضمّن تواريخ؟

التاريخ النجمي عدد عشري. تدور أحداث مغامرات Starship Enterprise في الموسم الأول من The Next Generation بين التاريخين النجميين 41000.0 و42000.0. الرقم "4" يرمز إلى القرن الرابع والعشرين، والرقم "1" إلى الموسم الأول.

نفّذ الدالة random_stardate/0 التي تُرجع عددًا عشريًا بين 41000.0 (شاملًا) و42000.0 (غير شامل).

يجب أن يستخدم التنفيذ دالة من Erlang.

CaptainsLog.random_stardate()
# => 41458.15721310934

4. نسّق التاريخ النجمي

في سجل القبطان، عادةً ما تُقرَّب التواريخ النجمية إلى منزلة عشرية واحدة.

نفّذ الدالة format_stardate/1 التي تأخذ عددًا عشريًا وتُرجع سلسلة نصية تحتوي العدد مقرَّبًا إلى منزلة عشرية واحدة.

يجب أن يستخدم التنفيذ دالة من Erlang.

CaptainsLog.format_stardate(41458.15721310934)
# => "41458.2"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Elixir Exercism

مستعد لبدء سجل القبطان؟

سجّل في Exercism لتتعلّم وتتقن Elixir عبر 58 مفهومًا168 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.