المسارات
/
Elm
Elm
/
التمارين
/
يجب انتزاعها كلها
يجب انتزاعها كلها

يجب انتزاعها كلها

تمرين تعلّمي

مقدمة

Set

‏Set a هو تسلسل من القيم الفريدة من النوع a. ويجب أن تكون هذه القيم من النوع comparable (Int وFloat وTime وChar وString، وكذلك الصفوف أو القوائم من الأنواع القابلة للمقارنة).

يمكنك تحويل القوائم والمجموعات إلى بعضها البعض باستخدام Set.toList وSet.fromList. ونظرًا للبنية الداخلية لـ Set، فمن المضمون أن القائمة التي نحصل عليها من Set.fromList ستكون مرتّبة.

Set.fromList [2, 3, 3, 3, 1, 1, 2]
    --> Set.fromList [1, 2, 3]

Set.toList (Set.fromList [2, 3, 3, 3, 1, 1, 2])
    --> [1, 2, 3]

يمكنك إنشاء المجموعات وتعبئتها باستخدام Set.empty وSet.singleton وSet.insert وSet.remove.

Set.empty
    --> Set.fromList []

Set.singleton "hi"
    --> Set.fromList ["hi"]

eightyEight = Set.singleton 88

Set.insert 88 eightyEight
    --> Set.fromList [88]

Set.insert 89 eightyEight
    --> Set.fromList [88, 89]

Set.remove 88 eightyEight
    --> Set.fromList []

Set.remove 89 eightyEight
    --> Set.fromList [88]

يمكنك الاستعلام عن محتويات مجموعة باستخدام الدوال Set.member وSet.isEmpty وSet.size.

Set.member 88 eightyEight
    --> True

Set.isEmpty eightyEight
    --> False

Set.size eightyEight
    --> 1

يمكن دمج المجموعات باستخدام Set.union وSet.intersect وSet.diff.

a = Set.fromList [1, 10, 100]
b = Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Set.union a b
    --> Set.fromList [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]

Set.intersect a b
    --> Set.fromList [1, 10]

Set.diff a b
    --> Set.fromList [100]

Set.diff b a
    --> Set.fromList [2, 3, 4, 5, 6, 7, 8, 9]

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

even n = modBy 2 n == 0

Set.filter even b
    --> Set.fromList [2, 4, 6, 8, 10]

Set.partition even b
    --> (Set.fromList [2, 4, 6, 8, 10], Set.fromList [1, 3, 5, 7, 9])

التعليمات

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

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

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

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

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

newCollection "Newthree"
    --> Set.fromList ["Newthree"]

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

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

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

addCard "Scientuna" (Set.fromList ["Newthree"])
    --> (False, Set.fromList ["Newthree", "Scientuna"])

3. ابدأ المقايضة

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

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

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

tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
    --> (True, Set.fromList ["Newthree"])

4. لا يمكن أن يكون من كل بطاقة إلا نسخة واحدة

تجد مخزونًا قديمًا من البطاقات في سوق للسلع المستعملة. عليك ترتيب البطاقات وإزالة المكررة منها لتقارن القائمة بمجموعتك.

نفّذ الدالة removeDuplicates التي ترتب قائمة من البطاقات وتُرجع قائمة ببطاقات فريدة مرتبة.

removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
    --> ["Newthree", "Scientuna"]

5. بطاقات لا يملكونها

حان وقت الاعتزاز بمجموعتك.

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

extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
    --> 0

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

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

نفّذ الدالة boringCards التي تأخذ قائمة مجموعات وتُرجع قائمة ببطاقات مرتبة تملكها جميع المجموعات.

boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
    --> ["Scientuna"]

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

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

نفّذ الدالة totalCards التي تأخذ قائمة مجموعات وتُرجع العدد الإجمالي للبطاقات المختلفة في جميع المجموعات.

totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
    --> 2

8. اللامع من أجل الفوز

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

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

splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
    --> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Elm Exercism

مستعد لبدء يجب انتزاعها كلها؟

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