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، لأن البطاقات المكررة لا أهمية لها عندما يكون هدفك هو الحصول على جميع البطاقات الموجودة.
أنت تريد حقًا أن ينضم أصدقاؤك إلى جنون Blorkemon™️، وأفضل طريقة لذلك هي أن تُطلق مجموعتهم بمنحهم بطاقة واحدة.
نفّذ الدالة newCollection التي تحوّل بطاقة إلى مجموعة.
newCollection "Newthree"
--> Set.fromList ["Newthree"]
بعد أن تصبح لديك مجموعة، تصير لها حياتها الخاصة ولا بد أن تكبر.
نفّذ الدالة addCard التي تأخذ Card ومجموعة، وتُرجع Tuple يحوي قيمتين: قيمة Bool تشير إلى ما إذا كانت Card موجودة في المجموعة من قبل، والمجموعة بعد إضافة البطاقة.
addCard "Scientuna" (Set.fromList ["Newthree"])
--> (False, Set.fromList ["Newthree", "Scientuna"])
الآن بعد أن عاد أصدقاؤك إلى جنون Blorkemon™️، يمكنك الاستفادة من ذلك لتنمية مجموعتك عبر مقايضة البطاقات.
ليست كل مقايضة تستحق أن تُجرى، أو يمكن إجراؤها أصلًا. لا يمكنك مقايضة بطاقة لا تملكها، ولا ينبغي أن تقايض بطاقة مقابل بطاقة تملكها بالفعل.
نفّذ الدالة tradeCard التي تأخذ بطاقتين للمقايضة (بطاقتك وبطاقتهم) ومجموعتك الحالية.
القيمة المُرجَعة هي Tuple من قيمتين: قيمة Bool تبيّن ما إذا كانت المقايضة ممكنة وتستحق أن تُجرى، والمجموعة التي ستنتهي إليها لو أجريت المقايضة (حتى لو لم تكن ممكنة فعليًا).
tradeCard "Scientuna" "Newthree" (Set.fromList ["Scientuna"])
--> (True, Set.fromList ["Newthree"])
تجد مخزونًا قديمًا من البطاقات في سوق للسلع المستعملة. عليك ترتيب البطاقات وإزالة المكررة منها لتقارن القائمة بمجموعتك.
نفّذ الدالة removeDuplicates التي ترتب قائمة من البطاقات وتُرجع قائمة ببطاقات فريدة مرتبة.
removeDuplicates ["Newthree", "Newthree", "Newthree", "Scientuna"]
--> ["Newthree", "Scientuna"]
حان وقت الاعتزاز بمجموعتك.
نفّذ الدالة extraCards التي تأخذ مجموعتك ومجموعة أخرى، وتُرجع عدد البطاقات التي لا تملكها المجموعة الأخرى.
extraCards (Set.fromList ["Scientuna"]) (Set.fromList ["Newthree", "Scientuna"])
--> 0
تجتمع أنت وأصدقاؤك المتحمسون لـ Blorkemon™️ وتتساءلون أي البطاقات هي الأكثر شيوعًا.
نفّذ الدالة boringCards التي تأخذ قائمة مجموعات وتُرجع قائمة ببطاقات مرتبة تملكها جميع المجموعات.
boringCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> ["Scientuna"]
هل تملك أنت وأصدقاؤك مجتمعين كل بطاقات Blorkemon™️؟
نفّذ الدالة totalCards التي تأخذ قائمة مجموعات وتُرجع العدد الإجمالي للبطاقات المختلفة في جميع المجموعات.
totalCards [Set.fromList ["Scientuna"], Set.fromList ["Newthree", "Scientuna"]]
--> 2
سيأتي ابن أخيك لزيارتك قريبًا، وتشعر أنك تريد أن تبهره. الأطفال يحبون الأشياء اللامعة، أليس كذلك؟ بطاقات Blorkemon™️ يمكن أن تكون لامعة!
نفّذ الدالة splitShinyCards التي تأخذ مجموعة وتُرجع Tuple يحوي قائمتين من البطاقات المرتبة: واحدة بكل البطاقات التي تبدأ بـ "Shiny" وأخرى بالبطاقات الأخرى.
splitShinyCards (Set.fromList ["Newthree", "Scientuna", "Shiny Scientuna"])
--> (["Shiny Scientuna"], ["Newthree", "Scientuna"])
سجّل في Exercism لتتعلّم وتتقن Elm عبر 28 مفهومًا110 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.