المسارات
/
Gleam
Gleam
/
التمارين
/
التقطها كلها!
التقطها كلها!

التقطها كلها!

تمرين تعلّمي

مقدمة

المجموعات

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

تُعرّف وحدة gleam/set النوع Set وتوفّر دوال للعمل مع المجموعات.

يمكنك تحويل المصفوفات والمجموعات إلى بعضها بعضًا باستخدام set.to_list وset.from_list. ترتيب العناصر داخل المجموعة غير مضمون.

set.from_list([2, 3, 3, 3, 1, 1, 2])
// -> set.from_list([1, 2, 3])

set.to_list(set.from_list([2, 3, 3, 3, 1, 1, 2]))
// -> [1, 2, 3]

يمكنك إنشاء المجموعات وتعبئتها باستخدام set.new وset.insert وset.delete.

set.new()
// -> set.from_list([])

let eighty_eight = set.from_list([88])

set.insert(eighty_eight, 88)
// -> set.from_list([88])

set.insert(eighty_eight, 89)
// -> set.from_list([88, 89])

set.delete(eighty_eight, 89)
// -> set.from_list([88])

يمكنك الاستعلام عن محتويات المجموعة باستخدام الدالتين set.contains وset.size.

set.contains(eighty_eight, 88)
// -> True

set.size(eighty_eight)
// -> 1

يمكن دمج المجموعات باستخدام set.union وset.intersection.

let a = set.from_list([1, 5, 10])
let b = set.from_list([1, 2, 3, 4, 5])

set.union(a, b)
// -> set.from_list([1, 2, 3, 4, 5, 10])

set.intersection(a, b)
// -> set.from_list([1, 5])

يمكنك تصفية المجموعات.

let is_small = fn(n) { n <= 3 }

set.filter(b, is_small)
// -> set.from_list([1, 2, 3])

التعليمات

لا يبدو أن حنينك إلى بطاقات Blorkemon™️ يتراجع؛ فقد بدأت تجمعها من جديد، بل وتجعل أصدقاءك ينضمون إليك.

في هذا التمرين، تُمثَّل مجموعة البطاقات بـ Set(String)، لأن البطاقات المكررة لا تهم عندما يكون هدفك الحصول على كل البطاقات الموجودة.

1. ابدأ مجموعة

أنت تريد حقًا أن ينضم أصدقاؤك إلى جنون Blorkemon™️، وأفضل أسلوب هو أن تبدأ مجموعتهم بمنحهم بطاقة واحدة.

نفّذ new_collection، التي تحوّل بطاقة إلى مجموعة.

new_collection("Newthree")
// -> set.from_list(["Newthree"])

2. نمِّ المجموعة

بمجرد أن تحصل على مجموعة، تصبح لها حياة خاصة بها ولا بد أن تنمو.

نفّذ add_card، التي تأخذ بطاقة ومجموعة، وتُرجع زوجًا مرتبًا بقيمتين: قيمة Bool تشير إلى ما إذا كانت البطاقة موجودة في المجموعة من قبل، والمجموعة بعد إضافة البطاقة.

add_card(set.from_list(["Newthree"]), "Scientuna")
// -> #(False, set.from_list(["Newthree", "Scientuna"]))

3. ابدأ التبادل

الآن وقد عاد أصدقاؤك إلى جنون Blorkemon™️، يمكنك استخدام هذا لتنمية مجموعتك عبر تبادل البطاقات.

ليست كل عملية تبادل تستحق أن تُنفَّذ، أو يمكن أن تحدث أصلًا. لا يمكنك تبادل بطاقة لا تملكها، ولا ينبغي أن تبادل بطاقة مقابل بطاقة تملكها بالفعل.

نفّذ trade_card، التي تأخذ بطاقتين للتبادل (بطاقتك وبطاقتهم) ومجموعتك الحالية. القيمة المُرجعة هي زوج مرتب من قيمتين: قيمة Bool تُبيّن ما إذا كان التبادل ممكنًا ويستحق التنفيذ، والمجموعة التي ستنتهي إليها إذا نفّذت التبادل (حتى لو لم يكن ممكنًا فعليًا).

trade_card("Scientuna", "Newthree", set.from_list(["Scientuna"]))
// -> #(True, set.from_list(["Newthree"]))

4. البطاقات التي يملكها الجميع

أنت وأصدقاؤك المتحمسون لـ Blorkemon™️ تتجمعون وتتساءلون عن البطاقات الأكثر شيوعًا.

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

boring_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> ["Scientuna"]

5. كل البطاقات

هل تملك أنت وأصدقاؤك مجتمعين كل بطاقات Blorkemon™️؟

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

total_cards([set.from_list(["Scientuna"]), set.from_list(["Newthree", "Scientuna"])])
// -> 2

6. الفوز باللمعان

سيأتي ابن أخيك لزيارتك قريبًا، وتشعر برغبة في إبهاره. الأطفال يحبون الأشياء اللامعة، أليس كذلك؟ بطاقات Blorkemon™️ يمكن أن تكون لامعة!

نفّذ shiny_cards، التي تأخذ مجموعة وتُرجع مجموعة تحتوي على كل البطاقات التي تبدأ بـ "Shiny ".

shiny_cards(set.from_list(["Newthree", "Scientuna", "Shiny Scientuna"]))
// -> set.from_list(["Shiny Scientuna"])
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Gleam Exercism

مستعد لبدء التقطها كلها!؟

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