গেমের একজন খেলোয়াড়ের হাই স্কোর তালিকা পরিচালনা করুন।
আপনার কাজ হলো ক্লাসিক ফ্রগার গেমের একটি হাই স্কোর কম্পোনেন্ট তৈরি করা, যা সর্বকালের সবচেয়ে বেশি বিক্রি হওয়া ও সবচেয়ে আসক্তিকর গেমগুলোর একটি এবং আর্কেড যুগের একটি ক্লাসিক। আপনার কাজ হলো এমন মেথড লেখা, যেগুলো তালিকা থেকে সর্বোচ্চ স্কোর, সর্বশেষ যোগ করা স্কোর এবং তিনটি সর্বোচ্চ স্কোর রিটার্ন করে।
এই অনুশীলনীতে আউটপুট একটি নির্দিষ্ট উপায়ে সর্ট করা থাকতে হয়। অনেক প্রোগ্রামিং ভাষার মতোই, অ্যারের উপর ইটারেশন ঘটে ইমপ্লিমেন্টেশন-নির্ভর, আপাতদৃষ্টিতে এলোমেলো এক ক্রমে। সাধারণত মানুষ যা দেখতে চায়, তা এই নয়। GNU awk কিছু সর্টিং সুবিধা দেয়।
asort -- অ্যারের মান-এর ভিত্তিতে সংখ্যা দিয়ে ইনডেক্স করা একটি অ্যারে সর্ট করে।
#!gawk
BEGIN {
for (i = 1; i <= 5; i++)
nums[i] = int(100 * rand())
# returns the array size
n = asort(nums, sorted)
for (i = 1; i <= n; i++)
print i, nums[i], sorted[i]
}
যা আউটপুট দেয়
1 92 30
2 59 57
3 30 59
4 57 74
5 74 92
n = asort(array) রূপটি নাম দেওয়া অ্যারেটিকে ইন-প্লেসে সর্ট করে।
এটি সংখ্যা দিয়ে ইনডেক্স করা অ্যারের জন্য সবচেয়ে বেশি কাজে লাগে।
যে প্রক্রিয়াটি sorted অ্যারে ভরিয়ে তোলে, সেটি মূল অ্যারের ইনডেক্সগুলো বাদ দিয়ে দেয়:
sorted অ্যারে 1 থেকে n পর্যন্ত ইনডেক্স করা হয়।
asorti -- অ্যারের ইনডেক্স-এর ভিত্তিতে একটি অ্যারে সর্ট করে।
asorti ফাংশনটি একটি "গন্তব্য" অ্যারে ভরিয়ে তোলে, যেখানে "উৎস" অ্যারের ইনডেক্সগুলো সর্ট করা অবস্থায় থাকে।
#!gawk
BEGIN {
nums["foo"] = int(100 * rand())
nums["bar"] = int(100 * rand())
nums["qux"] = int(100 * rand())
print "unordered"
for (i in nums)
print i, nums[i]
print "ordered by index"
n = asorti(nums, sorted)
for (i = 1; i <= n; i++)
print sorted[i], nums[sorted[i]]
}
যা আউটপুট দেয়
unordered
foo 92
qux 30
bar 59
ordered by index
bar 59
foo 92
qux 30
PROCINFO["sorted_in"] -- নির্দিষ্ট ক্রমে একটি অ্যারে ট্রাভার্স করা।
বিল্ট-ইন PROCINFO অ্যারেতে চলমান awk প্রসেস সম্পর্কে অনেক তথ্য থাকে।
এই অ্যারের একটি মজার এলিমেন্ট হলো sorted_in।
এই অ্যারে কী (key)-এর মান হলো একটি ফাংশনের নাম, যা নিয়ন্ত্রণ করে for (indx in array) লুপগুলো কোন ক্রমে অ্যারের ইনডেক্সগুলো প্রসেস করবে।
ফাংশনটি ইউজার-ডিফাইনড ফাংশনের নাম হতে পারে, অথবা কিছু কাজের পূর্বনির্ধারিত সর্টিং ফাংশনও আছে, যার মধ্যে রয়েছে:
"@ind_str_asc", "@ind_str_desc" - ইনডেক্স অনুযায়ী অ্যারে সর্ট করে; বর্ণানুক্রমিক সর্টিং ব্যবহার করে; ঊর্ধ্বক্রমে বা অধঃক্রমে সর্ট করে।"@ind_num_asc", "@ind_num_desc" - ইনডেক্স অনুযায়ী অ্যারে সর্ট করে; সংখ্যাগত সর্টিং ব্যবহার করে; ঊর্ধ্বক্রমে বা অধঃক্রমে সর্ট করে।"@val_str_asc", "@val_str_desc" - মান অনুযায়ী অ্যারে সর্ট করে; বর্ণানুক্রমিক সর্টিং ব্যবহার করে; ঊর্ধ্বক্রমে বা অধঃক্রমে সর্ট করে।"@val_num_asc", "@val_num_desc" - মান অনুযায়ী অ্যারে সর্ট করে; সংখ্যাগত সর্টিং ব্যবহার করে; ঊর্ধ্বক্রমে বা অধঃক্রমে সর্ট করে।উপরের asort উদাহরণটি এভাবে লেখা যায়:
PROCINFO["sorted_in"] = "@val_num_asc"
for (idx in nums)
print idx, nums[idx]
3 30
4 57
2 59
5 74
1 92
asorti উদাহরণটি এভাবে লেখা যায়:
PROCINFO["sorted_in"] = "@ind_str_asc"
for (idx in nums)
print idx, nums[idx]
bar 59
foo 92
qux 30
এই পদ্ধতিতে আমরা অস্থায়ী sorted অ্যারে আর n রিটার্ন ভ্যালু এড়াতে পারি।
পরিপাটি আর গোছানো।
ইউজার-ডিফাইনড সর্টিং ফাংশনটি ৪টি প্যারামিটার নেয়: একটি অ্যারে এলিমেন্টের ইনডেক্স ও মান, আর অন্য একটি অ্যারে এলিমেন্টের ইনডেক্স ও মান:
function compare(idx1, val1, idx2, val2) {...}
রিটার্ন ভ্যালু হলো:
idx1 idx2-এর আগে আসেidx1 idx2-এর পরে আসেfor (idx in array)-এর ক্রম নিয়ন্ত্রণের জন্য PROCINFO["sorted_in"] ছাড়াও,
asort আর asorti দুটোই তৃতীয় প্যারামিটার হিসেবে একটি তুলনা ফাংশনের নাম নিতে পারে।
Exercism-এ সাইন আপ করুন, AWK ট্র্যাকের 3টি কনসেপ্ট92টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।