ট্র্যাক
/
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-এর কী (key), কারণ তাদের গঠন একটি অভ্যন্তরীণ ক্রমের ওপর নির্ভর করে।

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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।