المسارات
/
Elm
Elm
/
التمارين
/
بطاقات Blorkemon
بطاقات Blorkemon

بطاقات Blorkemon

تمرين تعلّمي

مقدمة

المقارنة

المساواة

يمكن فحص أنواع Elm للتحقق من كونها «متطابقة» باستخدام عامل المساواة (==). وعامل عدم المساواة هو (/=) (وليس != كما هو الحال في لغات كثيرة). يعمل عامل المساواة على القيم الحرفية والصفوف والسجلات والأنواع المخصصة.

1 == 2
    --> False

1 /= 2
    --> True

(1, 2) == (2, 1)
    --> False

type alias MyRecord = { myInt : Int, myStrings : List String }
a : MyRecord
a = MyRecord (1 + 1) ["hello world"]

type alias MyOtherRecord = { myInt : Int, myStrings : List String }
myStrings =  (String.join " " ["hello", "world"]) :: []
b : MyOtherRecord
b = { myInt = 2, myStrings = myStrings}

a == b
    --> True

لاحظ أنه يجب ألا تقارن الدوال أبدًا، لأن ذلك سيتسبب في تعطّل البرنامج وقت التشغيل.

المقارنات

تعمل عوامل المقارنة (<) و(<=) و(>) و(>=) والدوال min وmax وcompare على الأنواع comparable. النوع comparable نوع خاص يجمع جميع الأنواع المدمجة التي يمكن مقارنتها: الأعداد والمحارف والسلاسل النصية والمصفوفات المكوّنة من عناصر قابلة للمقارنة والصفوف المكوّنة من عناصر قابلة للمقارنة.

1 < 1 + 1
    --> True

'x' < 'X'
    --> False

"abc" < "abz"
    --> True

"abc" < "abcd"
    --> True

"abc" < "b"
    --> True

min [1 , 2, 9000] [10]
    --> [1 , 2, 9000]

min (1, "hello") (3, "bye")
    --> (1, "hello")

لا يمكن مقارنة قيم الأنواع الأخرى، مثل السجلات أو الأنواع المخصصة، مباشرةً.

تشترط بعض الأنواع المدمجة أن يكون محتواها من النوع comparable، مثل مفاتيح Set أو Dict، لأن بنيتها تعتمد على ترتيب داخلي.

يمكن ترتيب مصفوفات القيم من النوع comparable باستخدام List.sort، ويمكن ترتيب مصفوفات القيم التي يمكن تحويلها إلى قيم قابلة للمقارنة باستخدام List.sortBy. إذا احتجت ترتيبًا هرميًا (الترتيب حسب خاصية، وكسر التعادل بأخرى)، فيمكن أيضًا استخدام الصفوف أو المصفوفات مع List.sortBy، لأن الصفوف والمصفوفات تُرتَّب بترتيب معجمي.

List.sort ["hi", "hello", "bye", "goodbye"]
    --> ["bye", "goodbye", "hello", "hi"]

List.sortBy String.length ["hi", "hello", "bye", "goodbye"]
    --> ["hi", "bye", "hello", "goodbye"]

-- sort by length, then alphabetically
List.sortBy (\str -> (String.length str, str)) ["hi", "mum", "hello", "sis", "bye", "dad"]
    --> ["hi", "bye", "dad", "mum", "sis", "hello"]

تأخذ الدالة compare قيمتين من النوع comparable وتُرجع Order. Order نوع يفحص في عملية واحدة ما إذا كانت قيمة أكبر (GT) أو مساوية (EQ) أو أصغر (LT) من قيمة أخرى.

compare 1 2
    --> LT

compare "" ""
    --> EQ

compare [12] []
    --> GT

يمكن إنشاء دوال مقارنة لأنواع اعتباطية واستخدامها، على سبيل المثال، لترتيبها باستخدام List.sortWith:

type Color = Red | Green | Blue

compareColors : Color -> Color -> Order
compareColors a b =
  case (a, b) of
    (Red, Red) -> EQ
    (Red, _) -> LT
    (_, Red) -> GT
    (Green, Green) -> EQ
    (Green, _) -> LT
    (_, Green) -> GT
    (Blue, Blue) -> EQ

List.sortWith compareColors [Blue, Red, Green, Green, Blue]
    --> [Red, Green, Green, Blue, Blue]

التعليمات

تشعر فجأة بنوبة من الحنين ورغبة قوية في إزالة الغبار عن بطاقات Blorkemon™️ القديمة. بطاقات Blorkemon™️ لعبة تبادل بطاقات رائعة من الطراز القديم. على كل بطاقة Card رسم لوحش Blorkemon™️، إلى جانب مستوى قوة الهجوم، وإن كنت محظوظًا فقد تكون البطاقة لامعة حتى.

1. مقارنة مستويات القوة

تبدو كل بطاقة Blorkemon™️ أقوى من التي تليها، لكن من الأفضل أن تتحقق.

نفّذ الدالة isMorePowerful. ينبغي أن تُرجع True إذا كانت البطاقة في الوسيط الأول أقوى بشكل صريح من الأخرى، وFalse خلاف ذلك.

newthree = Card "Newthree" 120 False
scientuna = Card "Scientuna" 6 True

isMorePowerful newthree scientuna
    --> True

2. إيجاد أعلى قوة

ومع يد مليئة ببطاقات Blorkemon™️، ينبغي أن تكون قادرًا على تجهيز أفتك هجوم.

نفّذ الدالة maxPower، التي تُرجع أعلى مستوى قوة بين بطاقتين.

maxPower newthree scientuna
    --> 120

3. ترتيب البطاقات

يبدو أنك تتذكر أنه كانت لديك بطاقة واحدة على الأقل من كل Blorkemon™️، لكن مرّ وقت طويل منذ آخر مرة تحققت فيها، لذا ينبغي أن ترتّب بطاقاتك لتقارنها بالقائمة الرسمية على Pulpapedia.

نفّذ الدالة sortByMonsterName، التي ينبغي أن تأخذ مصفوفة من Cards وتُرجع مصفوفة مرتبة حسب أسماء الوحوش.

sortByMonsterName [newthree, scientuna]
    --> [Card "Newthree" 120 False, Card "Scientuna" 6 True]

4. البطاقات الأكثر روعة أولًا

Blorkemon™️ هي أكثر شيء رائع على الإطلاق. أنت لا تقول ذلك جزافًا، فلديك منهج علمي يثبته.

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

sortByCoolness [newthree, scientuna]
    --> [Card "Scientuna" 6 True, Card "Newthree" 120 False]

5. القوة اللامعة

اللمعان ليس للمظهر فقط؛ ففي معركة بين Blorkemon™️ متساويين في القوة، ستنتصر البطاقة اللامعة دائمًا. وهذا ما يُسمى القوة اللامعة.

نفّذ الدالة compareShinyPower، التي تجسّد هذه الخاصية. يُحدَّد Order بين بطاقتين حسب مستويي القوة إذا كانا مختلفين، أما إذا كانا متساويين، فإن البطاقة اللامعة تكون أكبر.

compareShinyPower newthree scientuna
    --> GT

6. ضع رهاناتك

في لعبة بطاقات Blorkemon™️، كل شيء جائز، لكن لا تزال هناك نزعة لأن تفوز البطاقات الأكثر قوة.

نفّذ الدالة expectedWinner التي تُرجع اسم الوحش الأرجح للفوز، وفقًا لترتيب compareShinyPower. ينبغي أن تُرجع الدالة اسم وحش الفائز المتوقع، أو "too close to call" إذا كان لدى الخصمين نفس القوة اللامعة.

expectedWinner newthree scientuna
    --> "Newthree"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Elm Exercism

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

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