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