Керуйте масивом рекордів гравця.
Ваше завдання - створити компонент для підрахунку рекордів класичної гри 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.
Гарно й охайно.
Функція сортування, визначена користувачем, приймає 4 параметри: індекс і значення одного елемента масиву та індекс і значення іншого елемента масиву:
function compare(idx1, val1, idx2, val2) {...}
Повернене значення:
idx1 стоїть перед idx2
idx1 стоїть після idx2
Окрім PROCINFO["sorted_in"] для керування порядком for (idx in array),
і asort, і asorti можуть приймати назву функції порівняння третім параметром.
Зареєструйтеся на Exercism, щоб вивчати й опановувати AWK, а також 3 концепції92 вправи та справжнє наставництво від людей, і все це безкоштовно.