Gotta Snatch'Em All

Gotta Snatch'Em All

লার্নিং অনুশীলনী

ভূমিকা

MapSets

একটি MapSet হলো অনন্য মানের একটি সংগ্রহ, যা Elixir-এ সেট প্রকাশ করে। এতে যেকোনো ধরনের মান থাকতে পারে, ক্রমের কোনো ধারণা ছাড়াই।

মনে রাখবেন, Set মডিউলটিও আছে, তবে এটি অপ্রচলিত এবং এর বদলে MapSet ব্যবহার করা হয়।

আপনি MapSet.new/0, MapSet.new/1 ও MapSet.new/2 দিয়ে সেট তৈরি করতে পারেন, এবং MapSet.to_list/1 দিয়ে সেগুলোকে অ্যারেতে রূপান্তর করতে পারেন।

MapSet.new()
# => MapSet.new([])

MapSet.new([2, 3, 3, 3, 1, 1, 2, "hello"])
# => MapSet.new([1, 2, 3, "hello"])

MapSet.new([2, 3, 3, 3, 1, 1, 2], fn n -> 10 * n end)
# => MapSet.new([10, 20, 30])

[2, 3, 3, 3, 1, 1, 2] |> MapSet.new() |> MapSet.to_list()
# => [1, 2, 3]

মনে রাখবেন, MapSet-গুলোতে ক্রমের কোনো ধারণা নেই, তাই MapSet.to_list/1 যে সাজানো অ্যারে রিটার্ন করবে তার কোনো নিশ্চয়তা নেই।

আপনি MapSet.put/2 ও MapSet.delete/2 দিয়ে এলিমেন্ট যোগ করতে বা মুছে ফেলতে পারেন।

আপনি MapSet.size/1 ও MapSet.member?/2 ফাংশন দিয়ে কোনো সেটের বিষয়বস্তু যাচাই করতে পারেন, আর MapSet.equal?/2, MapSet.subset?/2 ও MapSet.disjoint?/2 দিয়ে সেটগুলো তুলনা করতে পারেন।

a = MapSet.new([1, 10])
b = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

MapSet.size(b)
# => 10

MapSet.member?(a, 10)
# => true

MapSet.subset?(a, b)
# => true

MapSet.disjoint?(a, b)
# => false

MapSets-গুলো MapSet.union/2, MapSet.intersection/2, MapSet.difference/2 ও MapSet.symmetric_difference/2 দিয়ে একত্রিত করা যায়।

a = MapSet.new([1, 10, 100])
b = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

MapSet.union(a, b)
# => MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100])

MapSet.intersection(a, b)
# => MapSet.new([1, 10])

MapSet.difference(a, b)
# => MapSet.new([100])

MapSet.difference(b, a)
# => MapSet.new([2, 3, 4, 5, 6, 7, 8, 9])

MapSet.symmetric_difference(b, a)
# => MapSet.new([2, 3, 4, 5, 6, 7, 8, 9, 100])

আপনি MapSet.filter/2, MapSet.reject/2 ও MapSet.split_with/2 দিয়ে সেট ফিল্টার ও পার্টিশন করতে পারেন।

a = MapSet.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
even = fn n -> rem(n, 2) == 0 end

MapSet.filter(a, even)
# => MapSet.new([2, 4, 6, 8, 10])

MapSet.reject(a, even)
# => MapSet.new([1, 3, 5, 7, 9])

MapSet.split_with(a, even)
# => {MapSet.new([2, 4, 6, 8, 10]), MapSet.new([1, 3, 5, 7, 9])}

নির্দেশনা

Blorkemon™️ কার্ডের জন্য আপনার নস্টালজিয়া যেন একটুও কমার নামই নিচ্ছে না, আপনি আবার সেগুলো সংগ্রহ করা শুরুও করে ফেলেছেন, আর এখন বন্ধুদেরও নিজের সাথে যোগ দিতে বলছেন।

এই অনুশীলনীতে একটি কার্ড সংগ্রহ MapSet দিয়ে প্রকাশ করা হয়, কারণ আপনার লক্ষ্য যখন সব বিদ্যমান কার্ড পাওয়া, তখন ডুপ্লিকেট কার্ড গুরুত্বপূর্ণ নয়।

1. একটি সংগ্রহ শুরু করুন

আপনি সত্যিই চান আপনার বন্ধুরাও আপনার Blorkemon™️ উন্মাদনায় যোগ দিক, আর তার সবচেয়ে ভালো উপায় হলো তাদের একটি কার্ড দিয়ে তাদের সংগ্রহের সূচনা করে দেওয়া।

GottaSnatchEmAll.new_collection ইমপ্লিমেন্ট করুন, যা একটি কার্ডকে একটি সংগ্রহে রূপান্তর করে।

GottaSnatchEmAll.new_collection("Newthree")
# => MapSet.new(["Newthree"])

2. সংগ্রহ বাড়ান

একবার তৈরি হয়ে গেলে সংগ্রহটি নিজের একটা জীবন পেয়ে যায়, আর তাকে বাড়তেই হবে।

GottaSnatchEmAll.add_card ইমপ্লিমেন্ট করুন, যা একটি কার্ড ও একটি সংগ্রহ নেয় এবং দুটি মানের একটি টাপল রিটার্ন করে: একটি বুলিয়ান, যা বলে কার্ডটি আগেই সংগ্রহে ছিল কি না, আর কার্ডটি যোগ করা সংগ্রহটি।

GottaSnatchEmAll.add_card("Scientuna", MapSet.new(["Newthree"]))
# => {false, MapSet.new(["Newthree", "Scientuna"])}

3. বিনিময় শুরু করুন

এখন যেহেতু আপনার বন্ধুরা আবার Blorkemon™️ নিয়ে পাগল, আপনি কার্ড বিনিময় করে নিজের সংগ্রহ বাড়াতে এটাকে কাজে লাগাতে পারেন।

প্রতিটি বিনিময় করা সম্ভবও নয়, আবার প্রতিটি বিনিময় করার মতোও নয়। আপনার কাছে নেই এমন কার্ড আপনি বিনিময় করতে পারেন না, আর আপনার কাছে আগেই আছে এমন কার্ডের বদলে কোনো কার্ড বিনিময় করা উচিত নয়।

GottaSnatchEmAll.trade_card ইমপ্লিমেন্ট করুন, যা বিনিময়ের জন্য দুটি কার্ড (আপনার আর তার) ও আপনার বর্তমান সংগ্রহ নেয়। এর রিটার্ন ভ্যালু দুটি মানের একটি টাপল: একটি বুলিয়ান, যা বলে বিনিময়টি সম্ভব ও করার মতো কি না, আর বিনিময়টি করলে শেষে আপনার হাতে যে সংগ্রহ থাকত (যদিও সেটি আসলে সম্ভব না হয়)।

GottaSnatchEmAll.trade_card("Scientuna", "Newthree", MapSet.new(["Scientuna"]))
# => {true, MapSet.new(["Newthree"])}

4. প্রতিটির একটিই থাকতে পারে

একটি ফ্লি মার্কেটে আপনি পুরোনো কার্ডের একটা ভাণ্ডার খুঁজে পেলেন। তালিকাটি আপনার সংগ্রহের সাথে মেলাতে হলে আপনাকে কার্ডগুলো সাজিয়ে ডুপ্লিকেটগুলো সরাতে হবে।

GottaSnatchEmAll.remove_duplicates ইমপ্লিমেন্ট করুন, যা কার্ডের একটি অ্যারে সাজায় এবং সাজানো, অনন্য কার্ডের একটি অ্যারে রিটার্ন করে।

GottaSnatchEmAll.remove_duplicates(["Newthree", "Newthree", "Newthree", "Scientuna"])
# => ["Newthree", "Scientuna"]

5. তাদের কাছে নেই এমন কার্ড

নিজের সংগ্রহ নিয়ে গর্ব করার সময় এসেছে।

GottaSnatchEmAll.extra_cards ইমপ্লিমেন্ট করুন, যা আপনার সংগ্রহ ও আরেকটি সংগ্রহ নেয়, এবং ওই অন্য সংগ্রহে নেই এমন কার্ডের সংখ্যা রিটার্ন করে।

GottaSnatchEmAll.extra_cards(MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"]))
# => 0

6. সবার কাছে আছে এমন কার্ড

আপনি আর আপনার Blorkemon™️-প্রেমী বন্ধুরা একসাথে বসে ভাবেন, কোন কার্ডগুলো সবচেয়ে কমন।

GottaSnatchEmAll.boring_cards ইমপ্লিমেন্ট করুন, যা সংগ্রহের একটি অ্যারে নেয় এবং সব সংগ্রহে আছে এমন সাজানো কার্ডের একটি অ্যারে রিটার্ন করে।

GottaSnatchEmAll.boring_cards([MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"])])
# => ["Scientuna"]

7. সবগুলো কার্ড

আপনি আর আপনার বন্ধুরা মিলে কি সব Blorkemon™️ কার্ডেরই মালিক?

GottaSnatchEmAll.total_cards ইমপ্লিমেন্ট করুন, যা সংগ্রহের একটি অ্যারে নেয় এবং সব সংগ্রহ মিলিয়ে ভিন্ন ভিন্ন কার্ডের মোট সংখ্যা রিটার্ন করে।

GottaSnatchEmAll.total_cards([MapSet.new(["Scientuna"]), MapSet.new(["Newthree", "Scientuna"])])
# => 2

8. শাইনিই জয় এনে দেয়

শিগগিরই আপনার ভাগ্নে আপনার সাথে দেখা করতে আসছে, আর আপনি তাকে মুগ্ধ করতে চান। শিশুরা তো চকচকে জিনিস পছন্দ করে, তাই না? Blorkemon™️ কার্ডও শাইনি হতে পারে!

GottaSnatchEmAll.split_shiny_cards ইমপ্লিমেন্ট করুন, যা একটি সংগ্রহ নেয় এবং সাজানো কার্ডের দুটি অ্যারে নিয়ে একটি টাপল রিটার্ন করে: একটিতে "Shiny" দিয়ে শুরু হওয়া সব কার্ড থাকে, আর অন্যটিতে থাকে বাকি কার্ডগুলো।

GottaSnatchEmAll.split_shiny_cards(MapSet.new(["Newthree", "Scientuna", "Shiny Scientuna"]))
# => {["Shiny Scientuna"], ["Newthree", "Scientuna"]}
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Elixir Exercism

Gotta Snatch'Em All শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।