Verwalte die Highscore-Liste eines Spielers.
Deine Aufgabe ist es, eine Highscore-Komponente für das klassische Spiel Frogger zu bauen, eines der meistverkauften und süchtig machendsten Spiele aller Zeiten und ein Klassiker der Arcade-Ära. Deine Aufgabe ist es, Methoden zu schreiben, die die höchste Punktzahl aus der Liste, die zuletzt hinzugefügte Punktzahl und die drei höchsten Punktzahlen zurückgeben.
Diese Übung erfordert, dass die Ausgabe auf eine bestimmte Weise sortiert wird. Wie in vielen Programmiersprachen erfolgt das Durchlaufen eines Arrays in einer implementierungsabhängigen, scheinbar zufälligen Reihenfolge. Das ist normalerweise nicht das, was Menschen sehen wollen. GNU awk bietet einige Sortierfunktionen.
asort -- sortiert ein numerisch indiziertes Array anhand der Array-Werte.
#!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]
}
was Folgendes ausgibt
1 92 30
2 59 57
3 30 59
4 57 74
5 74 92
Die Form n = asort(array) sortiert das benannte Array an Ort und Stelle.
Das ist vor allem für numerisch indizierte Arrays nützlich.
Der Vorgang, der das Array sorted befüllt, verwirft die ursprünglichen Array-Indizes:
das Array sorted ist von 1 bis n indiziert.
asorti -- sortiert ein Array anhand der Array-Indizes.
Die Funktion asorti befüllt ein „Ziel“-Array mit den sortierten Indizes des „Quell“-Arrays.
#!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]]
}
was Folgendes ausgibt
unordered
foo 92
qux 30
bar 59
ordered by index
bar 59
foo 92
qux 30
PROCINFO["sorted_in"] -- durchläuft ein Array in einer festgelegten Reihenfolge.
Das eingebaute PROCINFO-Array enthält viele Informationen über den laufenden awk-Prozess
Ein interessantes Element dieses Arrays ist sorted_in
Der Wert dieses Array-Schlüssels ist der Name einer Funktion, die die Reihenfolge steuert, in der Array-Indizes von for (indx in array)-Schleifen verarbeitet werden.
Die Funktion kann der Name einer benutzerdefinierten Funktion sein, oder es gibt einige praktische vordefinierte Sortierfunktionen, darunter:
"@ind_str_asc", "@ind_str_desc" - sortiert das Array nach Index; verwendet
alphabetische Sortierung; sortiert aufsteigend oder absteigend."@ind_num_asc", "@ind_num_desc" - sortiert das Array nach Index; verwendet
numerische Sortierung; sortiert aufsteigend oder absteigend."@val_str_asc", "@val_str_desc" - sortiert das Array nach Wert; verwendet
alphabetische Sortierung; sortiert aufsteigend oder absteigend."@val_num_asc", "@val_num_desc" - sortiert das Array nach Wert; verwendet
numerische Sortierung; sortiert aufsteigend oder absteigend.Das obige asort-Beispiel lässt sich so umsetzen:
PROCINFO["sorted_in"] = "@val_num_asc"
for (idx in nums)
print idx, nums[idx]
3 30
4 57
2 59
5 74
1 92
Das asorti-Beispiel kann man so schreiben:
PROCINFO["sorted_in"] = "@ind_str_asc"
for (idx in nums)
print idx, nums[idx]
bar 59
foo 92
qux 30
Bei dieser Methode vermeiden wir das temporäre Array sorted und den Rückgabewert n.
Einfach und aufgeräumt.
Die benutzerdefinierte Sortierfunktion nimmt 4 Parameter entgegen: den Index und den Wert eines Array-Elements sowie den Index und den Wert eines anderen Array-Elements:
function compare(idx1, val1, idx2, val2) {...}
Der Rückgabewert ist:
idx1 kommt vor idx2
idx1 kommt nach idx2
Zusätzlich zu PROCINFO["sorted_in"] zur Steuerung der Reihenfolge von for (idx in array) können sowohl asort als auch asorti den Namen einer Vergleichsfunktion als dritten Parameter annehmen.
Melde dich bei Exercism an, um AWK mit 3 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.