المسارات
/
AWK
AWK
/
التمارين
/
أعلى النتائج
أعلى النتائج

أعلى النتائج

سهل

التعليمات

أدر قائمة أعلى النقاط لدى أحد اللاعبين.

مهمتك هي بناء مكوّن أعلى النقاط للعبة Frogger الكلاسيكية، إحدى أكثر الألعاب مبيعًا وإدمانًا على مرّ العصور، وواحدة من كلاسيكيات عصر الأركيد. ومهمتك هي كتابة طُرق تُرجع أعلى نقاط من القائمة، والنقاط التي أُضيفت أخيرًا، وأعلى ثلاث نقاط.

الترتيب في AWK

يتطلب هذا التمرين أن يكون الإخراج مرتبًا بطريقة معينة. وكما في كثير من لغات البرمجة، يحدث التكرار على عناصر المصفوفة بترتيب يعتمد على التنفيذ ويبدو عشوائيًا. وهذا عادةً ليس ما يرغب البشر في رؤيته. وتوفر GNU awk بعض ميزات الترتيب.

  1. 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.

  2. 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
    
  3. 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 أن يتلقى اسم دالة مقارنة كمعامل ثالث.

المراجع


المصدر

تحية إلى لعبة الأركيد Frogger من الثمانينيات
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
AWK Exercism

مستعد لبدء أعلى النتائج؟

سجّل في Exercism لتتعلّم وتتقن AWK عبر 3 مفاهيم92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.