ट्रैक
/
Julia
Julia
/
अभ्यास
/
मेचा मंच प्रबंधन
मेचा मंच प्रबंधन

मेचा मंच प्रबंधन

सीखने का अभ्यास

परिचय

Pairs and Dicts कॉन्सेप्ट में Julia के डिक्शनरी टाइप की बुनियादी बातें बताई गई थीं।

Dict एक महत्वपूर्ण और बहुत इस्तेमाल होने वाला कलेक्शन टाइप है, इसलिए इन्हें संभालने के लिए कई फंक्शन भी हैं।

एंट्री पाना

किसी एंट्री को पाने का सबसे आसान तरीका की से है, जैसा कि कई भाषाओं में होता है। लेकिन अगर आप ऐसी की माँगें जो मौजूद ही नहीं है, तो KeyError मिलती है।

julia> d = Dict(i => ('a':'c')[i] for i in 1:3)
Dict{Int64, Char} with 3 entries:
  2 => 'b'
  3 => 'c'
  1 => 'a'
julia> d[2]
'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
# missing key
julia> d[4]
ERROR: KeyError: key 4 not found

एंट्री निकालने से पहले हम यह जाँच सकते हैं कि की मौजूद है या नहीं (जैसे haskey(d, 4) से), लेकिन जो की मौजूद नहीं हैं, उनके लिए सीधे एक डिफॉल्ट वैल्यू ले लेना भी काम का होता है।

इसके लिए हमारे पास get() फंक्शन है, और उसका Dict को बदल देने वाला रूप get!() भी। दोनों में यह अंतर है कि जो की मौजूद नहीं है, वह Dict में जोड़ी जाती है या नहीं।

julia> get(d, 4, '!')
'!': ASCII/Unicode U+0021 (category Po: Punctuation, other)
# get() leaves Dict unchanged
julia> d
Dict{Int64, Char} with 3 entries:
  2 => 'b'
  3 => 'c'
  1 => 'a'
julia> get!(d, 4, '!')
'!': ASCII/Unicode U+0021 (category Po: Punctuation, other)
# get!() adds new key to Dict
julia> d
Dict{Int64, Char} with 4 entries:
  4 => '!'
  2 => 'b'
  3 => 'c'
  1 => 'a'

पिछले कॉन्सेप्ट में हमने देखा था कि delete!() किसी एंट्री को उसकी की के आधार पर हटा देता है। वैल्यू निकालने के साथ इसे जोड़ा जा सकता है, और इसके लिए pop!() फंक्शन है।

julia> d
Dict{Int64, Char} with 4 entries:
  4 => '!'
  2 => 'b'
  3 => 'c'
  1 => 'a'
# popped value is returned
julia> pop!(d, 3)
'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
# Dict is shrunk
julia> d
Dict{Int64, Char} with 3 entries:
  4 => '!'
  2 => 'b'
  1 => 'a'

इटरेशन

किसी Dict पर इटरेशन करने पर डिफॉल्ट रूप से key => value जोड़े मिलते हैं। इनके हिस्सों तक पहुँचने के लिए आमतौर पर .first और .second नाम इस्तेमाल होते हैं।

# d is from the previous example
julia> [(kv.first, kv.second) for kv in d]
3-element Vector{Tuple{Int64, Char}}:
 (4, '!')
 (2, 'b')
 (1, 'a')

अकसर हमें सिर्फ की चाहिए होती हैं या सिर्फ वैल्यू, और यह आसान है।

julia> [k for k in keys(d)]
3-element Vector{Int64}:
 4
 2
 1
julia> [v for v in values(d)]
3-element Vector{Char}:
 '!': ASCII/Unicode U+0021 (category Po: Punctuation, other)
 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
 'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

मर्ज करना

दो Dict को मिलाना काम का हो सकता है, लेकिन हमें साफ तौर पर तय करना होता है कि जो की एक से अधिक इनपुट में मौजूद हैं, उनका हम क्या करना चाहते हैं।

merge() और merge!() फंक्शन दिए गए कितने भी Dict को बाएँ से दाएँ क्रम में मिला देते हैं।

जो की पहले से मौजूद हैं, उनकी वैल्यू पर बस नई वैल्यू लिख दी जाती है, यानी सबसे दाईं ओर वाला Dict जीत जाता है।

julia> d3 = Dict("color" => "red", "shape" => "circle")
Dict{String, String} with 2 entries:
  "shape" => "circle"
  "color" => "red"
julia> d4 = Dict("color" => "blue", "coords" => (3, 2))
Dict{String, Any} with 2 entries:
  "color"  => "blue"
  "coords" => (3, 2)
# color from d3 is lost
julia> merge(d3, d4)
Dict{String, Any} with 3 entries:
  "shape"  => "circle"
  "color"  => "blue"
  "coords" => (3, 2)

mergewith() और mergewith!() फंक्शन में हम पहला आर्गुमेंट एक फंक्शन दे सकते हैं, जो तय करता है कि दोहराई गई की को कैसे मिलाया जाए। जोड़ इसका एक आसान उदाहरण है।

julia> d5 = Dict("color" => "red", "area" => 3)
Dict{String, Any} with 2 entries:
  "area"  => 3
  "color" => "red"
julia> d6 = Dict("shape" => "circle", "area" => 5)
Dict{String, Any} with 2 entries:
  "shape" => "circle"
  "area"  => 5
# area values are added, not overwritten
julia> mergewith(+, d5, d6)
Dict{String, Any} with 3 entries:
  "shape" => "circle"
  "area"  => 8
  "color" => "red"

ध्यान रखिए कि mergewith फंक्शन हायर ऑर्डर फंक्शन के अच्छे उदाहरण हैं।

निर्देश

किराना खरीदारी को ऑटोमेट करने वाली कंपनी Mecha Munch™ ने आपको अभी-अभी अपने ऑर्डरिंग ऐप पर काम करने के लिए नियुक्त किया है। आपकी टीम को एक MVP (न्यूनतम व्यवहार्य उत्पाद) बनाने का काम सौंपा गया है, जो शॉपिंग कार्ट की सभी बुनियादी गतिविधियाँ संभालता है और उपयोगकर्ताओं को अपने किराना ऑर्डर जोड़ने, हटाने और क्रम में लगाने देता है। अच्छी बात है कि पैसे और चेक-आउट से जुड़े सारे काम एक दूसरी टीम संभाल रही है!

1. उपयोगकर्ता की शॉपिंग कार्ट में आइटम जोड़िए

MVP को उपयोगकर्ता को उसकी शॉपिंग कार्ट में आइटम जोड़ने की सुविधा देनी चाहिए। यह एक ही आइटम हो सकता है या एक साथ कई आइटम। चूँकि यह एक MVP है, आइटम की मात्रा दोहराव से बताई जाती है। अगर कोई उपयोगकर्ता 2 Oranges जोड़ना चाहता है, तो इनपुट इटरेबल में 'Oranges' दो बार आएगा। अगर वह आइटम उपयोगकर्ता की कार्ट में पहले से है, तो कार्ट में उसकी मात्रा 1 बढ़ा दी जानी चाहिए। अगर वह आइटम कार्ट के लिए नया है, तो उसे 1 की मात्रा के साथ जोड़ा जाना चाहिए।

एक फंक्शन add_items!(<cart>, <items>) बनाइए जो आर्गुमेंट के रूप में एक कार्ट डिक्शनरी और जोड़ने के लिए आइटम का एक इटरेबल लेता है। इसे उपयोगकर्ता के लिए अपडेट की गई शॉपिंग कार्ट डिक्शनरी लौटानी चाहिए।

julia> additems!(Dict("Banana" => 3, "Apple" => 2, "Orange" => 1),
                 ("Apple", "Apple", "Orange", "Apple", "Banana"))
Dict{String, Int64} with 3 entries:
  "Apple"  => 5
  "Orange" => 2
  "Banana" => 4

julia> additems!(Dict("Banana" => 3, "Apple" => 2, "Orange" => 1),
                 ["Banana", "Orange", "Blueberries", "Banana"])
Dict{String, Int64} with 4 entries:
  "Blueberries" => 1
  "Apple"       => 2
  "Orange"      => 2
  "Banana"      => 5

2. रेसिपी के "आइडियाज़" सेक्शन को अपडेट कीजिए

ऐप में एक "आइडियाज़" सेक्शन है, जिसमें अलग-अलग पाक शैलियों की तैयार रेसिपी भरी रहती हैं। उपयोगकर्ता इनमें से कोई भी रेसिपी चुन सकता है, और उसकी सारी सामग्री अपने आप उसकी शॉपिंग कार्ट में जुड़ जाती है। प्रोजेक्ट मैनेजर ने आपसे इन "आइडियाज़" रेसिपी को संपादित करने का तरीका बनाने के लिए कहा है, क्योंकि कंटेंट टीम सामग्री और मात्राएँ बदलती रहती है।

एक फंक्शन update_recipes!(<ideas>, <updates>) बनाइए जो आर्गुमेंट के रूप में एक "आइडियाज़" डिक्शनरी और रेसिपी अपडेट की एक डिक्शनरी लेता है। फंक्शन को अपडेट की गई "आइडियाज़" डिक्शनरी लौटानी चाहिए।

julia>update_recipes!(
        Dict("Banana Bread"  => Dict("Banana" => 1, "Apple" => 1, "Walnuts" => 1, "Flour" => 1, "Eggs" => 2, "Butter" => 1),
             "Raspberry Pie" => Dict("Raspberry" => 1, "Orange" => 1, "Pie Crust" => 1, "Cream Custard" => 1)),
        Dict("Banana Bread" => Dict("Banana" => 4,  "Walnuts" => 2, "Flour" => 1, "Butter" => 1, "Milk" => 2, "Eggs" => 3))
    )
Dict{String, Dict{String, Int64}} with 2 entries:
  "Raspberry Pie" => Dict("Cream Custard"=>1, "Raspberry"=>1, "Orange"=>1, "Pie Crust"=>1)
  "Banana Bread"  => Dict("Eggs"=>3, "Flour"=>1, "Milk"=>2, "Butter"=>1, "Walnuts"=>2, "Banana"=>4)

julia> update_recipes!(
    Dict("Banana Bread"    => Dict("Banana" => 1, "Apple" => 1, "Walnuts" => 1, "Flour" => 1, "Eggs" => 2, "Butter" => 1),
         "Raspberry Pie"   => Dict("Raspberry" => 1, "Orange" => 1, "Pie Crust" => 1, "Cream Custard" => 1),
         "Pasta Primavera" => Dict("Eggs" => 1, "Carrots" => 1, "Spinach" => 2, "Tomatoes" => 3, "Parmesan" => 2, "Milk" => 1, "Onion" => 1)),
    Dict("Raspberry Pie"    => Dict("Raspberry" => 3, "Orange" => 1, "Pie Crust" => 1, "Cream Custard" => 1, "Whipped Cream" => 2),
        "Pasta Primavera"   => Dict("Eggs" => 1, "Mixed Veggies" => 2, "Parmesan" => 2, "Milk" => 1, "Spinach" => 1, "Bread Crumbs" => 1),
        "Blueberry Crumble" => Dict("Blueberries" => 2, "Whipped Creme" => 2, "Granola Topping" => 2, "Yogurt" => 3))
    )
Dict{String, Dict{String, Int64}} with 4 entries:
  "Raspberry Pie"     => Dict("Raspberry"=>3, "Orange"=>1, "Pie Crust"=>1, "Cream Custard"=>1, "Whipped Cream"=>2)
  "Pasta Primavera"   => Dict("Eggs"=>1, "Mixed Veggies"=>2, "Parmesan"=>2, "Milk"=>1, "Spinach"=>1, "Bread Crumbs"=>1)
  "Blueberry Crumble" => Dict("Blueberries"=>2, "Whipped Creme"=>2, "Granola Topping"=>2, "Yogurt"=>3)
  "Banana Bread"      => Dict("Banana"=>1, "Apple"=>1, "Walnuts"=>1, "Flour"=>1, "Eggs"=>2, "Butter"=>1)

3. उपयोगकर्ता की शॉपिंग कार्ट पूर्ति के लिए स्टोर भेजिए

ऐप को किसी उपयोगकर्ता की शॉपिंग कार्ट पूर्ति के लिए स्टोर भेजनी होती है। लेकिन स्टोर के कर्मचारियों को यह पता होना चाहिए कि वह आइटम कहाँ मिलेगा, और इसके लिए एक अनोखा गलियारा कोड इस्तेमाल किया जाता है। कर्मचारियों को ज़्यादा कुशलता से काम करने में मदद देने के लिए "पूर्ति कार्ट" को आइटम के गलियारा कोड के क्रम में लगाया जाना चाहिए।

एक फंक्शन send_to_store(<cart>, <aislecodes>) बनाइए जो उपयोगकर्ता की शॉपिंग कार्ट और स्टोर के गलियारा कोड रखने वाली एक डिक्शनरी लेता है। फंक्शन को एक संयुक्त "पूर्ति कार्ट" लौटाना चाहिए जिसमें ग्राहक जो भी आइटम ऑर्डर कर रहा है, उनमें से हर एक के लिए aislecode => quantity का एक जोड़ा हो। आइटम उनके गलियारा कोड के क्रम में दिखने चाहिए।

julia> cart = Dict("Orange" => 1, "Milk" => 2, "Banana" => 3, "Apple" => 2, "Chocolate" => 2);

julia> aislecodes = Dict("Orange" => 2.4, "Milk" => 3.3, "Banana" => 2.6, "Apple" => 2.2, "Chocolate" => 5.7);

julia> send_to_store(cart, aislecodes)
5-element Vector{Pair{Float64, Int64}}:
 2.2 => 2
 2.4 => 1
 2.6 => 3
 3.3 => 2
 5.7 => 2

4. उपयोगकर्ता के ऑर्डर के हिसाब से स्टोर की इन्वेंटरी अपडेट कीजिए

ऐप ग्राहकों के ऑर्डर बस अनंत तक नहीं ले सकता। धीरे-धीरे स्टोर से तरह-तरह के सामान खत्म हो जाएँगे। इसलिए जब भी कोई उपयोगकर्ता अपना ऑर्डर स्टोर को भेजे, आपके ऐप के MVP को स्टोर की इन्वेंटरी अपडेट करनी होगी। वरना ग्राहक ऐसे सामान ऑर्डर कर देंगे जो असल में उपलब्ध ही नहीं हैं।

एक फंक्शन update_store_inventory!(<inventory>, <cart>) बनाइए जो एक cart और एक inventory लेता है। फंक्शन को "cart" में "ऑर्डर" की गई संख्या के हिसाब से स्टोर की इन्वेंटरी की मात्राएँ घटानी चाहिए और फिर उन सारे आइटम की एक डिक्शनरी लौटानी चाहिए जो स्टॉक से बाहर हो गए हैं (यानी जो 0 तक पहुँच गए हैं)।

julia> inventory = Dict("Banana" => 15, "Apple" => 12, "Orange" => 1, "Milk" => 4);

julia> cart = Dict("Orange" => 1, "Milk" => 2, "Banana" => 3, "Apple" => 2);

julia> update_store_inventory!(inventory, cart)
Dict{String, Int64} with 1 entry:
  "Orange" => 0

julia> inventory
Dict{String, Int64} with 4 entries:
  "Milk"   => 2
  "Apple"  => 10
  "Orange" => 0
  "Banana" => 12

5. स्टॉक से बाहर हुए आइटम फिर से ऑर्डर कीजिए

इन्वेंटरी अपडेट करने के अलावा, आपका ऐप उसे फिर से भरने में भी मदद कर सकता है। किसी ग्राहक के ऑर्डर के बाद जो आइटम स्टॉक से बाहर हो जाएँ, आपके MVP को उनका एक छोटा ऑर्डर तैयार करना आना चाहिए। इससे बड़ा ऑर्डर शुरू करना आसान हो जाएगा। इसके अलावा, कभी-कभी ऐसे प्रोमोशनल आइटम होते हैं जो स्टॉक की सूची में नहीं होते। अगर प्रोमोशन की अवधि खत्म होने से पहले ही ये बिक जाएँ, तो इसका मतलब ये लोकप्रिय साबित हुए हैं, और इन्हें स्टॉक की सूची में जोड़ा जा सकता है।

एक फंक्शन reorder!(<outofstock>, <stock>) बनाइए जो outofstock और stock लेता है। stock डिक्शनरी में मानक स्टॉक आइटम और उन्हें फिर से ऑर्डर करने की मात्राएँ होती हैं। outofstock डिक्शनरी update_store_inventory! का परिणाम है, यानी उन आइटम की डिक्शनरी जिनकी मात्रा शून्य है। outofstock की मात्राएँ stock के हिसाब से अपडेट करके लौटाई जानी चाहिए। साथ ही, outofstock में मौजूद जो भी आइटम stock में नहीं हैं, उन्हें 100 की डिफ़ॉल्ट मात्रा के साथ stock में जोड़ा जाना चाहिए।

julia> inventory = Dict("Banana" => 15, "Apple" => 12, "Orange" => 1, "Milk" => 4, "Chocolate" => 2);

julia> cart = Dict("Orange" => 1, "Milk" => 2, "Banana" => 3, "Apple" => 2, "Chocolate" => 2);

julia> stock = Dict("Banana" => 150, "Apple" => 120, "Orange" => 120, "Milk" => 45);

julia> outofstock = update_store_inventory!(inventory, cart)
Dict{String, Int64} with 1 entry:
  "Orange"    => 0
  "Chocolate" => 0

julia> reorder!(outofstock, stock)
Dict{String, Int64} with 1 entry:
  "Orange"    => 120
  "Chocolate" => 100

julia> stock 
Dict{String, Int64} with 5 entries:
  "Milk"      => 45
  "Apple"     => 120
  "Chocolate" => 100
  "Orange"    => 120
  "Banana"    => 150
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Julia Exercism

मेचा मंच प्रबंधन शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Julia को 35 कॉन्सेप्ट128 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।