ট্র্যাক
/
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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।