ट्रैक
/
AWK
AWK
/
अभ्यास
/
मैट्रिक्स
मैट्रिक्स

मैट्रिक्स

मध्यम

निर्देश

एक स्ट्रिंग दी गई है जो संख्याओं के एक मैट्रिक्स को दर्शाती है। आपको उस मैट्रिक्स की पंक्तियाँ और स्तंभ लौटाने हैं।

तो मान लीजिए, आपको एक ऐसी स्ट्रिंग मिली है जिसमें न्यूलाइन भी शामिल हैं:

9 8 7
5 3 2
6 6 7

जो इस मैट्रिक्स को दर्शाती है:

    1  2  3
  |---------
1 | 9  8  7
2 | 5  3  2
3 | 6  6  7

आपका कोड ऐसा होना चाहिए जो इन्हें निकाल सके:

  • पंक्तियों का एक ऐरे, जहाँ हर पंक्ति को बाएँ से दाएँ पढ़ते हैं और पंक्ति-दर-पंक्ति ऊपर से नीचे चलते हैं,
  • स्तंभों का एक ऐरे, जहाँ हर स्तंभ को ऊपर से नीचे पढ़ते हैं और बाएँ से दाएँ चलते हैं।

हमारे उदाहरण मैट्रिक्स की पंक्तियाँ:

  • 9, 8, 7
  • 5, 3, 2
  • 6, 6, 7

और उसके स्तंभ:

  • 9, 5, 6
  • 8, 3, 6
  • 7, 2, 7

AWK के नए कॉन्सेप्ट

यह पहला अभ्यास है जिसमें हल कोई "main" स्क्रिप्ट नहीं है। इसका उद्देश्य फंक्शनों की एक लाइब्रेरी लिखना है, जिसे दूसरे awk प्रोग्रामों में शामिल किया जा सके। इस अभ्यास में देखने के लिए कई दिलचस्प नए कॉन्सेप्ट हैं।

नीचे दिए गए जिन भागों पर "(gawk)" का टैग लगा है, वे खास तौर पर GNU awk के एक्सटेंशन हैं।

फाइल से पढ़ना

इस अभ्यास में आप डेटा मुख्य इनपुट स्ट्रीम से नहीं, बल्कि एक फाइल से पढ़ेंगे। Gnu awk मैनुअल में getline के बारे में पढ़िए, खास तौर पर Getline/File और Getline/Variable/File रूपों के बारे में।

ऐरे के बारे में और जानकारी

इस हल को लागू करने का एक तरीका द्वि-आयामी ऐरे भी हो सकता है। GNU awk में इसे दर्शाने के दो तरीके हैं:

फाइलें शामिल करना (gawk)

टेस्ट फाइल में @include डायरेक्टिव पर ध्यान दीजिए। यह gawk को निर्देश देता है कि वह उस नाम वाली फाइल को पढ़े और उसका मूल्यांकन करे।

नेमस्पेस (gawk)

awk के सभी वेरिएबल ग्लोबल होते हैं (सिवाय फंक्शन पैरामीटर के, जो उस फंक्शन के भीतर ही लोकल होते हैं)। नामों के टकराव की संभावना बहुत ज़्यादा रहती है, खास तौर पर जब तीसरे पक्ष की लाइब्रेरी शामिल की जाती हैं। नेमस्पेस यह बाँटने का तरीका है कि वेरिएबल कहाँ संग्रहीत किए जाएँ। इस अभ्यास की फाइलों में @namespace डायरेक्टिव पर ध्यान दीजिए।

डिफॉल्ट नेमस्पेस का नाम "awk" है। डिफॉल्ट नेमस्पेस होने से प्रोग्रामर किसी दूसरे नेमस्पेस वाले फंक्शन के अंदर से awk के बिल्ट-इन फंक्शन को कॉल कर सकता है।

फंक्शन पैरामीटर कैसे भेजे जाते हैं

ऐरे पैरामीटर रेफरेंस से भेजे जाते हैं। फंक्शन के अंदर ऐरे में किए गए बदलाव कॉल करने वाले को दिखाई देते हैं।

गैर-ऐरे पैरामीटर वैल्यू से भेजे जाते हैं।

अनटाइप्ड पैरामीटर के लिए यह इस पर निर्भर करता है कि फंक्शन उनके साथ क्या करता है:

  • अगर फंक्शन उसे ऐरे के रूप में इनिशियलाइज़ करता है, तो वह रेफरेंस से भेजा जाने वाला पैरामीटर बन जाता है,
  • अगर फंक्शन उसे स्केलर वैल्यू (कोई संख्या या स्ट्रिंग) के रूप में इनिशियलाइज़ करता है, तो वह रेफरेंस नहीं होता।

पूरी जानकारी मैनुअल में फंक्शन आर्गुमेंट वैल्यू से या रेफरेंस से भेजना में दी गई है।

लोकल वेरिएबल

फंक्शन स्कोप वाले (लोकल) वेरिएबल "वैल्यू से भेजे जाने" वाले पैरामीटर इस्तेमाल करके बनाए जा सकते हैं। किसी फंक्शन को उसके सूचीबद्ध पैरामीटर की संख्या से कम वैल्यू भेजना कोई एरर नहीं है; अतिरिक्त पैरामीटर तब तक "अनटाइप्ड" रहते हैं जब तक उनका इस्तेमाल नहीं होता। फंक्शन के भीतर इन्हें स्केलर वैल्यू असाइन की जा सकती हैं, और वे ग्लोबल नेमस्पेस में संग्रहीत नहीं होतीं।

  • अगर आप किसी पैरामीटर को स्केलर वैल्यू असाइन करते हैं, तो वह फंक्शन के भीतर लोकल रहती है।
  • अगर आप किसी ऐसे वेरिएबल को स्केलर असाइन करते हैं जिसका नाम पैरामीटर सूची में नहीं है, तो वह वेरिएबल ग्लोबल होता है।

परंपरा के अनुसार फंक्शन सिग्नेचर में पहले अपेक्षित पैरामीटर आते हैं, उसके बाद कुछ खाली जगह, और फिर लोकल पैरामीटर। एक उदाहरण:

function add(a, b,    total) {
    # here, `typeof(total)` is "untyped"
    total = a + b
    # now, `typeof(total)` is "number"
    return total
}

BEGIN {
    sum = add(5, 10)
    print sum             # 15
    print typeof(total)   # untyped, meaning "total" is unused in this scope
}
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
AWK Exercism

मैट्रिक्स शुरू करने के लिए तैयार हैं?

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