مسیرها
/
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 از ۱ تا 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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.