ট্র্যাক
/
Go
Go
/
অনুশীলনী
/
গ্রোস স্টোর
গ্রোস স্টোর

গ্রোস স্টোর

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

ভূমিকা

Go-তে map একটি বিল্ট-ইন ডেটা টাইপ, যা কী (key) থেকে মানে ম্যাপ করে। অন্য প্রোগ্রামিং ভাষায় আপনি হয়তো ডিকশনারি, হ্যাশ টেবিল, কী (key) ও মানের স্টোর বা অ্যাসোসিয়েটিভ অ্যারে হিসেবে map-এর ধারণার সাথে পরিচিত হতে পারেন।

সিনট্যাক্সের দিক থেকে map দেখতে এমন হয়:

map[KeyType]ElementType

এটাও জেনে রাখা জরুরি যে প্রতিটি কী (key) অনন্য, অর্থাৎ একই কী (key) দুবার অ্যাসাইন করলে সংশ্লিষ্ট কী (key)-এর মান ওভাররাইট হয়ে যাবে।

একটি ম্যাপ তৈরি করতে পারেন এভাবে:

  // With map literal
  foo := map[string]int{}

অথবা

  // or with make function
  foo := make(map[string]int)

ম্যাপ দিয়ে আপনি যেসব কাজ করতে পারেন, তার কিছু উদাহরণ এখানে দেওয়া হলো।

  // Add a value in a map with the `=` operator:
  foo["bar"] = 42
  // Here we update the element of `bar`
  foo["bar"] = 73
  // To retrieve a map value, you can use
  baz := foo["bar"]
  // To delete an item from a map, you can use
  delete(foo, "bar")

ম্যাপে নেই এমন কোনো কী (key)-এর মান বের করার চেষ্টা করলে এটি ভ্যালু টাইপের শূন্য মান রিটার্ন করবে। এতে আপনি বিভ্রান্ত হতে পারেন, বিশেষ করে যদি আপনার ElementType-এর ডিফল্ট মান (যেমন int টাইপের ক্ষেত্রে 0) একটি বৈধ মান হয়। আপনার ম্যাপে কোনো কী (key) আছে কি না তা যাচাই করতে পারেন এভাবে:

  value, exists := foo["baz"]
  // If the key "baz" does not exist,
  // value: 0; exists: false

নির্দেশনা

আপনার এক বন্ধুর Gross Store নামে একটি পুরনো পাইকারি দোকান আছে। নামটি এসেছে দোকানটি যে পরিমাণে জিনিস বিক্রি করে তা থেকে: সবকিছুই মাপা হয় গ্রস একক-এ। আপনার বন্ধু আপনাকে তার দোকানের জন্য একটি পয়েন্ট অফ সেল (POS) সিস্টেম বানাতে বলেছেন। প্রথমে আপনি এটির একটি প্রোটোটাইপ তৈরি করতে চান। আপনার প্রোটোটাইপে আপনার সিস্টেম শুধু পরিমাণ রেকর্ড করবে। সাহায্য করার জন্য আপনার বন্ধু আপনাকে পরিমাপের একটি তালিকা দিয়েছেন:

একক মান
quarter_of_a_dozen 3
half_of_a_dozen 6
dozen 12
small_gross 120
gross 144
great_gross 1728

1. আপনার প্রোগ্রামে পরিমাপের একক সংরক্ষণ করুন

পরিমাপটি ব্যবহার করতে হলে আপনাকে এটি আপনার প্রোগ্রামে সংরক্ষণ করতে হবে।

units := Units()
fmt.Println(units)
// Output: map[...] with entries like ("dozen": 12)

2. নতুন একটি গ্রাহক বিল তৈরি করুন

আপনাকে এমন একটি ফাংশন বানাতে হবে যা গ্রাহকের জন্য একটি নতুন (খালি) বিল তৈরি করে।

bill := NewBill()
fmt.Println(bill)
// Output: map[]

3. গ্রাহক বিলে একটি আইটেম যোগ করুন

এটি বানাতে হলে আপনাকে করতে হবে:

  • প্রদত্ত unit যদি units ম্যাপে না থাকে, তাহলে false রিটার্ন করুন।
  • অন্যথায় আইটেমটির নাম দিয়ে সূচিবদ্ধ করে গ্রাহকের bill-এ আইটেমটি যোগ করুন, তারপর true রিটার্ন করুন।
  • আইটেমটি যদি ইতিমধ্যে বিলে থাকে, তাহলে প্রদত্ত unit-এর অন্তর্গত পরিমাণ দিয়ে তার পরিমাণ বাড়িয়ে দিন।
bill := NewBill()
units := Units()
ok := AddItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: true (since dozen is a valid unit)

খেয়াল করুন, রিটার্ন ভ্যালুটি bool টাইপের।

4. গ্রাহক বিল থেকে একটি আইটেম সরান

এটি বানাতে হলে আপনাকে করতে হবে:

  • প্রদত্ত আইটেমটি বিলে না থাকলে false রিটার্ন করুন।
  • প্রদত্ত unit যদি units ম্যাপে না থাকে, তাহলে false রিটার্ন করুন।
  • নতুন পরিমাণ 0-এর কম হয়ে গেলে false রিটার্ন করুন।
  • নতুন পরিমাণ 0 হলে bill থেকে আইটেমটি সম্পূর্ণভাবে সরিয়ে ফেলুন, তারপর true রিটার্ন করুন।
  • অন্যথায় আইটেমটির পরিমাণ কমিয়ে দিন এবং true রিটার্ন করুন।
bill := NewBill()
units := Units()
ok := RemoveItem(bill, units, "carrot", "dozen")
fmt.Println(ok)
// Output: false (because there are no carrots in the bill)

খেয়াল করুন, রিটার্ন ভ্যালুটি bool টাইপের।

5. গ্রাহক বিলে থাকা নির্দিষ্ট একটি আইটেমের পরিমাণ রিটার্ন করুন

এটি বানাতে হলে আপনাকে করতে হবে:

  • item বিলে না থাকলে 0 এবং false রিটার্ন করুন।
  • অন্যথায় bill-এ থাকা আইটেমটির পরিমাণ এবং true রিটার্ন করুন।
bill := map[string]int{"carrot": 12, "grapes": 3}
qty, ok := GetItem(bill, "carrot")
fmt.Println(qty)
// Output: 12
fmt.Println(ok)
// Output: true

খেয়াল করুন, রিটার্ন ভ্যালু দুটি int এবং bool টাইপের।

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

গ্রোস স্টোর শুরু করতে প্রস্তুত?

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