مسیرها
/
Elm
Elm
/
تمرین‌ها
/
کارت‌های بلورکمون
کارت‌های بلورکمون

کارت‌های بلورکمون

تمرین یادگیری

مقدمه

مقایسه

برابری

با عملگر برابری (==) می‌توان انواع 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 یک نوع ویژه است که همه‌ی انواع توکاری را که قابل مقایسه‌اند در خود گرد می‌آورد: اعداد، نویسه‌ها، رشته‌ها، لیست‌هایی از مقدارهای 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 مرتب کرد و لیست‌های مقدارهایی که می‌توان آن‌ها را به مقدارهای comparable نگاشت، با 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

آماده‌اید کارت‌های بلورکمون را شروع کنید؟

در Exercism ثبت‌نام کنید تا Elm را همراه با 28 مفهوم110 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.