أدر قائمة أعلى النقاط لدى أحد اللاعبين.
مهمتك هي بناء مكوّن أعلى النقاط للعبة Frogger الكلاسيكية، إحدى أكثر الألعاب مبيعًا وإدمانًا على مرّ العصور، وواحدة من كلاسيكيات عصر الأركيد. ومهمتك هي كتابة طُرق تُرجع أعلى نقاط من القائمة، والنقاط التي أُضيفت أخيرًا، وأعلى ثلاث نقاط.
يتطلب هذا التمرين أن يكون الإخراج مرتبًا بطريقة معينة. وكما في كثير من لغات البرمجة، يحدث التكرار على عناصر المصفوفة بترتيب يعتمد على التنفيذ ويبدو عشوائيًا. وهذا عادةً ليس ما يرغب البشر في رؤيته. وتوفر 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.
وقيمة هذا المفتاح في المصفوفة هي اسم دالة تتحكم في الترتيب الذي ستُعالَج به فهارس المصفوفة في حلقات 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
وإضافةً إلى PROCINFO["sorted_in"] للتحكم في ترتيب for (idx in array)،
يمكن لكلٍّ من asort وasorti أن يتلقى اسم دالة مقارنة كمعامل ثالث.
سجّل في Exercism لتتعلّم وتتقن AWK عبر 3 مفاهيم92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.