المسارات
/
Crystal
Crystal
/
التمارين
/
أفعوانية Chaitana العملاقة
أفعوانية Chaitana العملاقة

أفعوانية Chaitana العملاقة

تمرين تعلّمي

مقدمة

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

بعض هذه الطرق مدمِّرة، أي أنها تعدّل المصفوفة الأصلية. وبعضها الآخر غير مدمِّر، أي أنها تُرجع مصفوفة جديدة ولا تعدّل المصفوفة الأصلية.

إليك بعض الطرق الأكثر شيوعًا التي يمكن استخدامها عند التعامل مع المصفوفات:

insert

عند إدراج عنصر في مصفوفة، يمكنك استخدام الطريقة insert، التي تأخذ فهرسًا وعنصرًا كوسائط. سيُدرَج العنصر عند الفهرس المحدد، وستُزاح بقية المصفوفة إلى اليمين. إذا كان الفهرس خارج الحدود، فسيُرفع IndexError.

numbers = [1, 2, 3]
numbers.insert(1, 4)
numbers # => [1, 4, 2, 3]

numbers.insert(5, 5) # => Error: Index out of bounds (IndexError)

delete

عندما تريد حذف عنصر معيّن من مصفوفة، يمكنك استخدام الطريقة delete، التي تأخذ عنصرًا كوسيط. تُرجع الطريقة العنصر الذي حُذف. إذا لم يكن العنصر موجودًا في المصفوفة، فسيُرجع nil.

numbers = [1, 2, 3]
numbers.delete(2) # => 2
numbers           # => [1, 3]

first & last

عندما تريد الحصول على العنصر الأول أو الأخير في مصفوفة، يمكنك استخدام الطريقتين first وlast. تأخذ هاتان الطريقتان وسيطًا اختياريًا يحدد عدد العناصر التي ستُرجَع. يمكن أن يحسّن هذا من سهولة القراءة مقارنةً باستخدام الفهرس 0 أو -1 أو باستخدام نطاق. إذا كانت المصفوفة فارغة، فسيُرفع Enumerable::EmptyError.

numbers = [1, 2, 3]
numbers.first # => 1
numbers.last  # => 3

numbers.first(2) # => [1, 2]
numbers.last(2)  # => [2, 3]

empty_array = [] of Int32
empty_array.last # => Error: Empty enumerable (Enumerable::EmptyError)

reverse

عندما تريد عكس مصفوفة، يمكنك استخدام الطريقة reverse، التي تُرجع مصفوفة جديدة بعناصر بترتيب معكوس. من المهم ملاحظة أن reverse تُرجع مصفوفة جديدة ولا تعدّل المصفوفة الأصلية. إذا أردت تعديل المصفوفة الأصلية، فأضف ! إلى نهاية اسم الطريقة.

numbers = [1, 2, 3]
numbers.reverse # => [3, 2, 1]
numbers         # => [1, 2, 3]

numbers.reverse! # => [3, 2, 1]
numbers          # => [3, 2, 1]

Concat(+)

تفيد طريقة الإلحاق (<<) عندما تريد إضافة كائنات إلى مصفوفة. ومع ذلك، عند دمج مصفوفتين، يمكنك استخدام العامل +، الذي يُرجع مصفوفة جديدة بعناصر المصفوفتين.

[1, 2] + [3, 4] # => [1, 2, 3, 4]

إذا ألحقت مصفوفة بمصفوفة أخرى، فستُضاف المصفوفة كعنصر واحد.

[1, 2] << [3, 4] # => [1, 2, [3, 4]]

empty?

عند التحقق مما إذا كانت المصفوفة فارغة، يمكنك استخدام الطريقة empty?، التي تُرجع true إذا كانت المصفوفة فارغة وfalse بخلاف ذلك. يحسّن هذا من سهولة القراءة مقارنةً بمقارنة طول المصفوفة بـ 0.

[].empty? # => true
[1, 2, 3].empty? # => false

index

عندما تريد الحصول على فهرس عنصر في مصفوفة، يمكنك استخدام الطريقة index، التي تأخذ عنصرًا كوسيط. إذا لم يكن العنصر موجودًا في المصفوفة، فسيُرجع nil.

numbers = [1, 2, 3]
numbers.index(2) # => 1

size

عندما تريد معرفة عدد العناصر في مصفوفة، يمكنك استخدام الطريقة size.

numbers = [1, 2, 3]
numbers.size # => 3

count

عندما تريد حساب عدد المرات التي يوجد فيها عنصر في مصفوفة، يمكنك استخدام الطريقة count.

fruits = ["apple", "banana", "apple"]
fruits.count("apple")      # => 2
fruits.count("banana")     # => 1
fruits.count("watermelon") # => 0

sort

عندما تريد ترتيب مصفوفة، يمكنك استخدام الطريقة sort، التي تُرجع مصفوفة جديدة بعناصر مرتّبة. وكما في reverse، تُرجع هذه الطريقة مصفوفة جديدة ولا تعدّل المصفوفة الأصلية.

numbers = [3, 2, 1]
numbers.sort # => [1, 2, 3]
numbers      # => [3, 2, 1]

numbers.sort! # => [1, 2, 3]
numbers       # => [1, 2, 3]

التعليمات

تمتلك شايتانا مدينة ملاهٍ شهيرة جدًا. لديها لعبة واحدة فقط في وسط حدائق غنّاء ومنسّقة بعناية: أكبر أفعوانية في العالم (TM). وعلى الرغم من أن هذه هي الوجهة الوحيدة في المدينة، يأتي الناس من كل أنحاء العالم ويقفون في الطابور لساعات طمعًا في فرصة ركوب الأفعوانية العملاقة الخاصة بشايتانا.

هناك طابوران لهذه اللعبة، ويُمثَّل كل منهما بـ array:

  1. الطابور العادي
  2. طابور الأولوية (المعروف أيضًا بالمسار السريع)، حيث يدفع الناس مبلغًا إضافيًا مقابل أولوية الدخول.

طُلب منك كتابة بعض الكود لإدارة ضيوف المدينة بشكل أفضل. عليك تنفيذ الدوال التالية في أسرع وقت ممكن قبل أن يغضب الضيوف (ورئيسك شايتانا!).

1. أضف شخصًا إلى الطابور

عرّف الطريقة ColossalCoaster.add_to_queue التي تأخذ 4 وسائط <express_queue>, <normal_queue>, <ticket_type>, <person_name> وتُرجع الطابور المناسب بعد إضافة اسم الشخص إليه.

  1. <ticket_type> هو Int32 حيث 1 == express_queue و0 == normal_queue.
  2. <person_name> هو الاسم (من نوع String) الخاص بالشخص الذي سيُضاف إلى الطابور المعني.
express_queue = ["Tony", "Bruce"]
normal_queue = ["RobotGuy", "WW"]
ColossalCoaster.add_to_queue(express_queue, normal_queue, 1, "RichieRich")
# => ["Tony", "Bruce", "RichieRich"]

2. أين أصدقائي؟

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

عرّف الطريقة ColossalCoaster.find_my_friend التي تأخذ وسيطين queue وfriend_name وتُرجع موضع اسم الشخص في الطابور.

  1. <queue> هو array من الأشخاص الواقفين في الطابور.
  2. <friend_name> هو اسم الصديق الذي تحتاج إلى إيجاد فهرسه (موضعه في الطابور).
ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1

3. هل يمكنني الانضمام إليهم؟

بعد أن عُثر على أصدقائه (في المهمة رقم 2 أعلاه)، يريد الشخص المتأخر الانضمام إليهم في موضعهم من الطابور. عرّف الطريقة ColossalCoaster.add_with_friends التي تأخذ 3 وسائط queue وfriend_name وperson_name.

  1. <queue> هو array من الأشخاص الواقفين في الطابور.
  2. <friend_name> هو اسم الصديق الذي ينبغي إضافة الشخص عند موضعه.
  3. <person_name> هو اسم الشخص الذي سيُضاف عند موضع الفهرس.

أرجع الطابور محدَّثًا باسم الشخص المتأخر.

ColossalCoaster.add_with_friends(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve", "Bucky")
# => ["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]

4. شخص سيئ في الطابور

سمعت للتو من الطابور أن هناك شخصًا سيئًا للغاية يدفع ويصرخ ويثير المشاكل. عليك أن تطرد هذا المفسد بسبب سلوكه السيئ!

عرّف الطريقة ColossalCoaster.remove_from_queue التي تأخذ وسيطين queue وperson_name.

  1. <queue> هو array من الأشخاص الواقفين في الطابور.
  2. <person_name> هو اسم الشخص الذي يجب طرده.

أرجع الطابور محدَّثًا بدون اسم الشخص السيئ.

ColossalCoaster.remove_from_queue(["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], "Eltran")
# => ["Natasha", "Steve", "Wanda", "Rocket"]

5. رتّب قائمة الطابور

لأغراض إدارية، تحتاج إلى ترتيب جميع الأسماء في طابور معيّن ترتيبًا أبجديًا.

عرّف الطريقة ColossalCoaster.sorted_queue التي تأخذ وسيطًا واحدًا هو queue (وهو array الأشخاص الواقفين في الطابور). ينبغي أن تُرجع الطريقة نسخة مرتّبة من array.

ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Crystal Exercism

مستعد لبدء أفعوانية Chaitana العملاقة؟

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