Треки
/
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. Гарно й охайно.

Функція сортування, визначена користувачем

Функція сортування, визначена користувачем, приймає 4 параметри: індекс і значення одного елемента масиву та індекс і значення іншого елемента масиву:

function compare(idx1, val1, idx2, val2) {...}

Повернене значення:

  • менше нуля: idx1 стоїть перед idx2
  • більше нуля: idx1 стоїть після idx2
  • нуль: індекси мають однаковий пріоритет сортування, але їхній взаємний порядок не визначений.

Окрім PROCINFO["sorted_in"] для керування порядком for (idx in array), і asort, і asorti можуть приймати назву функції порівняння третім параметром.

Посилання


Джерело

Присвята аркадній грі Frogger з 80-х
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
AWK Exercism

Час розпочати Рекордні результати?

Зареєструйтеся на Exercism, щоб вивчати й опановувати AWK, а також 3 концепції92 вправи та справжнє наставництво від людей, і все це безкоштовно.