ट्रैक
/
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 फंक्शन के साथ मैप इस्तेमाल करते हैं, तो मैप अपने आप 2 {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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।