ट्रैक
/
jq
jq
/
अभ्यास
/
वाहन की खरीद
वाहन की खरीद

वाहन की खरीद

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

परिचय

तुलना

संख्याओं की तुलना

jq में संख्याओं की तुलना नीचे दिए गए रिलेशनल और समानता ऑपरेटरों से की जा सकती है।

तुलना ऑपरेटर
से बड़ा a > b
से बड़ा या बराबर a >= b
से छोटा a < b
से छोटा या बराबर a <= b
बराबर a == b
बराबर नहीं a != b

तुलना का परिणाम हमेशा एक बूलियन वैल्यू होता है, यानी या तो true या false.

1 < 3,      # => true
2 != 2,     # => false
1 == 1.0    # => true
            # All numbers are floating-points, so this is different syntax
            # for the exact same value.

स्ट्रिंग की तुलना

ऊपर दिए गए ऑपरेटरों से स्ट्रिंग की तुलना भी की जा सकती है। ऐसे में शब्दकोश (लेक्सिकोग्राफिकल) क्रम लागू होता है। यह क्रम यूनिकोड कोडपॉइंट वैल्यू के अनुसार होता है।

"Apple" > "Pear",   # => false
"a" < "above",      # => true
"a" == "A"          # => false

जब आप ऐसे दो वेरिएबल की तुलना करें जिनमें देखने में संख्याएँ लगती हों, लेकिन जिनका टाइप स्ट्रिंग हो, तो आपको सावधान रहना चाहिए। शब्दकोश क्रम के कारण परिणाम वही नहीं आएगा जो संख्या टाइप की वैल्यू की तुलना करने पर आता है।

10 < 2,     # => false
"10" < "2"  # => true (because "1" comes before "2")

"सख्त" समानता

jq का == ऑपरेटर JavaScript के === जैसा है: जो चीज़ें देखने में एक जैसी लगती हैं, लेकिन जिनके टाइप अलग हैं, वे बराबर नहीं होतीं।

"3" == 3    # => false
            # the value on the left has type string,
            # the value on the right has type number.

ऐरे की तुलना

दो ऐरे तब बराबर होते हैं जब उनके सभी संगत एलिमेंट बराबर हों।

[1, 2, 3] == [1, 2, 3]      # => true
[1, 2, 3] == [1, 3, 2]      # => false, different order
[1, 2, 3] == [1, 2, "3"]    # => false, different types

ऑब्जेक्ट की तुलना

दो ऑब्जेक्ट तब बराबर होते हैं जब उनके की-वैल्यू जोड़े एक जैसे हों।

{name: "Joe", age: 42} == {age: 42, name: "Joe"}                # => true
{name: "Joe", age: 42} == {age: 42, name: "Jane"}               # => false
{name: "Joe", age: 42} == {age: "42", name: "Joe"}              # => false
{name: "Joe", age: 42} == {age: 42, name: "Joe", height: 175}   # => false

# comparisons will drill down as deeply as required
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2]}}}                  # => true
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2, 3]}}}               # => false

शर्तें

if एक्सप्रेशन

jq का शर्त वाला एक्सप्रेशन if A then B else C end होता है।

if-then-else भी jq के बाकी सारे बिल्ट-इन की तरह एक फिल्टर है: यह एक इनपुट लेता है और एक आउटपुट देता है।

अगर एक्सप्रेशन A "सही" मानी जाने वाली वैल्यू देता है, तो if फिल्टर B का मूल्यांकन करता है। वरना वह C का मूल्यांकन करता है। if फिल्टर को मिला इनपुट B या C को भेजा जाता है।

42 | if . < 50 then "small" else "big" end      # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end     # => 20
Note

else क्लॉज़ वैकल्पिक है; नीचे दिए गए दोनों स्टेटमेंट एक जैसे हैं।

if A then B else . end
if A then B end

नेस्टेड if स्टेटमेंट

elif की मदद से और शर्तें जोड़ी जा सकती हैं।

42 | if . < 33 then "small"
     elif . < 66 then "medium"
     else "big"
     end
# => "medium"

आप जितने चाहें उतने elif क्लॉज़ इस्तेमाल कर सकते हैं।

सत्यता

jq में "गलत" मानी जाने वाली बस दो वैल्यू हैं: false और null. बाकी सब कुछ "सही" है, यहाँ तक कि शून्य संख्या, खाली स्ट्रिंग, खाली ऐरे और खाली ऑब्जेक्ट भी।

बूलियन ऑपरेटर

जटिल क्वेरी बनाने के लिए बूलियन ऑपरेटर and और or इस्तेमाल किए जा सकते हैं।

42 | if . < 33 or . > 66 then "big or small"
     else "medium"
     end

किसी वैल्यू को नकारने के लिए not इस्तेमाल कीजिए। यह ऑपरेटर नहीं, एक फिल्टर है।

42 | if (. < 33 or . > 66 | not) then "medium"
     else "big or small"
     end

वैकल्पिक ऑपरेटर

अगर कोई एक्सप्रेशन false या null हो, तो वैकल्पिक ऑपरेटर की मदद से आप उसके लिए एक "डिफॉल्ट" वैल्यू तय कर सकते हैं।

A // B

# This is identical to
if A then A else B end

उदाहरण देखिए:

[3, 5, 18] | add / 2       # => 13
[]         | add / 2       # => error: null (null) and number (2) cannot be divided
[]         | add // 0 / 2  # => 0

निर्देश

इस अभ्यास में आप वाहन खरीदने की तैयारी में मदद करने के लिए कुछ कोड लिखेंगे।

आपके सामने तीन काम हैं: यह तय करना कि आपको ड्राइविंग लाइसेंस लेना पड़ेगा या नहीं; दो वाहनों में से एक चुनना; और किसी पुराने वाहन का उचित दाम अनुमान लगाना।

1. तय कीजिए कि आपको ड्राइविंग लाइसेंस की ज़रूरत होगी या नहीं

कुछ किस्म के वाहनों को चलाने के लिए ड्राइविंग लाइसेंस ज़रूरी होता है। मान लीजिए कि सिर्फ "car" और "truck" किस्मों के लिए लाइसेंस ज़रूरी है; बाकी सब बिना लाइसेंस के चलाए जा सकते हैं।

needs_license फंक्शन बनाइए जो वाहन की किस्म लेता है और एक बूलियन लौटाता है, जो बताता है कि उस किस्म के वाहन के लिए आपको लाइसेंस चाहिए या नहीं।

"car" | needs_license
# => true

"bike" | needs_license
# => false

2. खरीदने के लिए दो संभावित वाहनों में से एक चुनिए

आपने उपलब्ध वाहनों के अपने विकल्पों पर विचार कर लिया है। आप उन्हें घटाकर दो विकल्पों तक ले आए हैं, लेकिन अंतिम फैसला करने में आपको मदद चाहिए। choose_vehicle फंक्शन बनाइए जो इनपुट के रूप में दो वाहनों का ऐरे लेता है और एक फैसला लौटाता है, यानी वह विकल्प जो डिक्शनरी क्रम में पहले आता है।

["Wuling Hongguang", "Toyota Corolla"] | choose_vehicle
# =>  "Toyota Corolla is clearly the better choice."

["Volkswagen Beetle", "Volkswagen Golf"] | choose_vehicle
# =>  "Volkswagen Beetle is clearly the better choice."

3. पुराने वाहन के दाम का अनुमान लगाइए

अब जब आपने फैसला कर लिया है, तो आप यह सुनिश्चित करना चाहते हैं कि डीलरशिप पर आपको उचित दाम मिले। चूँकि आप एक पुराना वाहन खरीदना चाहते हैं, इसलिए दाम इस पर निर्भर करता है कि वाहन कितना पुराना है। मोटे अनुमान के लिए मान लीजिए कि अगर वाहन 3 साल से कम पुराना है, तो उसका दाम उसके बिल्कुल नए होने के समय की मूल कीमत का 80% होता है। अगर वह 10 साल से ज़्यादा पुराना है, तो उसका दाम 50% होता है। अगर वाहन कम से कम 3 साल पुराना है लेकिन 10 साल से ज़्यादा पुराना नहीं है, तो उसका दाम मूल कीमत का 70% होता है।

resell_price फंक्शन बनाइए जो if, elif और else का उपयोग करके यह तर्क लागू करता है। यह एक ऑब्जेक्ट लेता है जिसमें मूल कीमत और वाहन की उम्र रखी होती है, और डीलरशिप पर अनुमानित दाम लौटाता है।

{"original_price": 1000, "age": 1} | resell_price
# => 800

{"original_price": 1000, "age": 5} | resell_price
# => 700

{"original_price": 1000, "age": 15} | resell_price
# => 500
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
jq Exercism

वाहन की खरीद शुरू करने के लिए तैयार हैं?

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