ট্র্যাক
/
Elixir
Elixir
/
অনুশীলনী
/
বুটিক ইনভেন্টরি
বুটিক ইনভেন্টরি

বুটিক ইনভেন্টরি

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

ভূমিকা

Enum

Enum একটি অত্যন্ত দরকারি মডিউল, যা এনুমারেবলের সাথে কাজ করার জন্য একগুচ্ছ অ্যালগরিদম সরবরাহ করে। এটি সাজানো, ফিল্টার করা, গ্রুপ করা, গণনা করা, খোঁজ করা, সর্বনিম্ন/সর্বোচ্চ মান খুঁজে বের করা এবং আরও অনেক কিছু করতে পারে।

সাধারণভাবে বলতে গেলে, এনুমারেবল হলো এমন যেকোনো ডেটা, যার উপর ইটারেশন করা যায়, অর্থাৎ একটি কালেকশন। Elixir-এ এনুমারেবল হলো এমন যেকোনো ডেটা টাইপ, যা Enumerable প্রোটোকল ইমপ্লিমেন্ট করে। এগুলোর মধ্যে সবচেয়ে কমন হলো লিস্ট ও ম্যাপ।

Enum-এর অনেক ফাংশন আর্গুমেন্ট হিসেবে একটি ফাংশন গ্রহণ করে।

Enum.all?([1, 2, 3, 4, 5], fn x -> x > 3 end)
# => false

সবচেয়ে কমন Enum ফাংশন হলো map ও reduce।

map/2

Enum.map/2 ব্যবহার করে আপনি এনুমারেবলের প্রতিটি এলিমেন্টকে অন্য একটি এলিমেন্ট দিয়ে বদলে দিতে পারেন। Enum.map/2-এর দ্বিতীয় আর্গুমেন্টটি একটি ফাংশন, যা মূল এলিমেন্টটি গ্রহণ করে এবং তার বদলিটি রিটার্ন করে।

reduce/3

Enum.reduce/3 ব্যবহার করে আপনি পুরো এনুমারেবলটিকে একটি মাত্র মানে রিডিউস করতে পারেন। এটি করতে অ্যাকুমুলেটর নামের একটি বিশেষ ভ্যারিয়েবল ব্যবহার করা হয়। অ্যাকুমুলেটর ইটারেশনগুলোর মাঝে রিডাকশনের মধ্যবর্তী অবস্থাটি বহন করে।

Enum.reduce/3-এর দ্বিতীয় আর্গুমেন্টটি হলো অ্যাকুমুলেটরের প্রাথমিক মান। তৃতীয় আর্গুমেন্টটি একটি ফাংশন, যা একটি এলিমেন্ট ও একটি অ্যাকুমুলেটর গ্রহণ করে, এবং অ্যাকুমুলেটরের নতুন মান রিটার্ন করে।

ম্যাপের সাথে কাজ করা

Enum ফাংশনের সাথে ম্যাপ ব্যবহার করলে ম্যাপটি স্বয়ংক্রিয়ভাবে ২টি {key, value} টাপলের একটি লিস্টে রূপান্তরিত হয়ে যায়।

এটিকে আবার ম্যাপে রূপান্তর করতে Enum.into/2 ব্যবহার করুন। Enum.into/2 এমন একটি ফাংশন, যা একটি এনুমারেবলকে একটি কালেক্টেবলে রূপান্তর করে, অর্থাৎ এমন যেকোনো ডেটা স্ট্রাকচার যা Collectable প্রোটোকল ইমপ্লিমেন্ট করে। এটিকে Enum.reduce/3-এর বিপরীত ভাবা যেতে পারে।

Enum-এ Enum.into/3-ও আছে। Enum.into/3 হলো Enum.into/2-এর একটি প্রকরণ, যা এনুমারেবলকে কালেক্টেবলে রূপান্তর করার সময় প্রয়োগ করার জন্য একটি রূপান্তর ফাংশন গ্রহণ করে।

ম্যাপে ম্যাপিং

ম্যাপে কোনো রূপান্তর (ম্যাপিং) প্রয়োগ করতে Enum.into/3 বা Enum.map/2-এর সাথে Enum.into/2 ব্যবহার করার বদলে, আমরা একটি ডেডিকেটেড Map.new/2 ফাংশনও ব্যবহার করতে পারি। এটি Enum.into/3-এর মতোই কাজ করে, অর্থাৎ এটি একটি এনুমারেবল ও একটি রূপান্তর ফাংশন গ্রহণ করে, তবে কালেক্টেবল বেছে নেওয়ার সুযোগ না দিয়ে সবসময় একটি নতুন ম্যাপ রিটার্ন করে।

নির্দেশনা

আপনি একটি অনলাইন ফ্যাশন বুটি চালাচ্ছেন। আপনার বছরের সবচেয়ে বড় সেল আসছে, তাই আপনি প্রস্তুত আছেন কিনা নিশ্চিত করতে আপনার ইনভেন্টরির হিসাব নিতে হবে।

ইনভেন্টরির প্রতিটি আইটেম একটি ম্যাপ দিয়ে প্রকাশ করা হয়, আর পুরো ইনভেন্টরি এমন ম্যাপের একটি অ্যারে।

%{
  name: "White Shirt",
  price: 40,
  quantity_by_size: %{s: 3, m: 7, l: 8, xl: 4}
}

1. দাম অনুযায়ী আইটেম সাজান

sort_by_price/1 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি ইনভেন্টরি নেবে এবং আইটেমের দাম অনুযায়ী ঊর্ধ্বক্রমে সাজিয়ে রিটার্ন করবে।

BoutiqueInventory.sort_by_price([
  %{price: 65, name: "Maxi Brown Dress", quantity_by_size: %{}},
  %{price: 50, name: "Red Short Skirt", quantity_by_size: %{}},
  %{price: 50, name: "Black Short Skirt", quantity_by_size: %{}},
  %{price: 20, name: "Bamboo Socks Cats", quantity_by_size: %{}}
])

# => [
#      %{price: 20, name: "Bamboo Socks Cats", quantity_by_size: %{}},
#      %{price: 50, name: "Red Short Skirt", quantity_by_size: %{}},
#      %{price: 50, name: "Black Short Skirt", quantity_by_size: %{}},
#      %{price: 65, name: "Maxi Brown Dress", price: 65, quantity_by_size: %{}}
#    ]

2. যে সব আইটেমের দাম নেই সেগুলো খুঁজুন

দাম অনুযায়ী ইনভেন্টরি সাজানোর পর আপনি লক্ষ্য করলেন যে হিসাব নেওয়ার সময় আপনি নিশ্চয়ই একটি ভুল করেছেন এবং কয়েকটি আইটেমের দাম লিখতে ভুলে গেছেন।

with_missing_price/1 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি ইনভেন্টরি নেবে এবং যেসব আইটেমের দাম নেই সেগুলোর একটি অ্যারে রিটার্ন করবে।

BoutiqueInventory.with_missing_price([
  %{price: 40, name: "Black T-shirt", quantity_by_size: %{}},
  %{price: nil, name: "Denim Pants", quantity_by_size: %{}},
  %{price: nil, name: "Denim Skirt", quantity_by_size: %{}},
  %{price: 40, name: "Orange T-shirt", quantity_by_size: %{}}
])

# => [
#      %{price: nil, name: "Denim Pants", quantity_by_size: %{}},
#      %{price: nil, name: "Denim Skirt", quantity_by_size: %{}}
#    ]

3. আইটেমের নাম আপডেট করুন

আপনি লক্ষ্য করলেন যে কিছু আইটেমের নামে এমন একটি শব্দ আছে যা আপনি আর ব্যবহার করতে পছন্দ করেন না। এখন ওই শব্দটি দিয়ে থাকা সব আইটেমের নাম আপডেট করতে হবে।

update_names/3 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি ইনভেন্টরি, যে পুরোনো শব্দটি আপনি সরাতে চান এবং তার বদলে যে নতুন শব্দটি ব্যবহার করতে চান, সেগুলো নেবে। এটি আপডেট করা নামসহ আইটেমের একটি অ্যারে রিটার্ন করবে।

BoutiqueInventory.update_names(
  [
    %{price: 40, name: "Black T-shirt", quantity_by_size: %{}},
    %{price: 70, name: "Denim Pants", quantity_by_size: %{}},
    %{price: 65, name: "Denim Skirt", quantity_by_size: %{}},
    %{price: 40, name: "Orange T-shirt", quantity_by_size: %{}}
  ],
  "T-shirt",
  "Tee"
)

# => [
#      %{price: 40, name: "Black Tee", quantity_by_size: %{}},
#      %{price: 70, name: "Denim Pants", quantity_by_size: %{}},
#      %{price: 65, name: "Denim Skirt", quantity_by_size: %{}},
#      %{price: 40, name: "Orange Tee", quantity_by_size: %{}}
#    ]

4. আইটেমের পরিমাণ বাড়ান

কিছু আইটেম বিশেষ ভালো বিক্রি হচ্ছিল, তাই আপনি সব সাইজে আরও অর্ডার করেছিলেন।

increase_quantity/2 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি একটি আইটেম এবং একটি সংখ্যা n নেবে, এবং প্রতিটি সাইজের পরিমাণ n দিয়ে বাড়িয়ে সেই আইটেম রিটার্ন করবে।

BoutiqueInventory.increase_quantity(
  %{
    name: "Polka Dot Skirt",
    price: 68,
    quantity_by_size: %{s: 3, m: 5, l: 3, xl: 4}
  },
  6
)

# => %{
#      name: "Polka Dot Skirt",
#      price: 68,
#      quantity_by_size: %{l: 9, m: 11, s: 9, xl: 10}
#    }

5. আইটেমের মোট পরিমাণ হিসাব করুন

আপনার স্টোরেজে কত জায়গা লাগবে তা জানতে, মোট কতগুলো আইটেম আছে তা জানা দরকার।

total_quantity/1 ফাংশনটি ইমপ্লিমেন্ট করুন। এটি একটি আইটেম নেবে এবং যেকোনো সাইজ মিলিয়ে মোট কতটি পিস আছে তা রিটার্ন করবে।

BoutiqueInventory.total_quantity(%{
  name: "Red Shirt",
  price: 62,
  quantity_by_size: %{s: 3, m: 6, l: 5, xl: 2}
})

# => 16
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Elixir Exercism

বুটিক ইনভেন্টরি শুরু করতে প্রস্তুত?

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