Tracks
/
AWK
AWK
/
Übungen
/
Bestenliste
Bestenliste

Bestenliste

Einfach

Anleitung

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.

Sortieren in AWK

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.

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

  2. 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
    
  3. 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.

Benutzerdefinierte Sortierfunktion

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:

  • kleiner als null: idx1 kommt vor idx2
  • größer als null: idx1 kommt nach idx2
  • null: die Indizes haben dieselbe Sortierpriorität, aber ihre relative Reihenfolge ist undefiniert.

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.

Referenzen


Quelle

Eine Hommage an das Arcade-Spiel Frogger aus den Achtzigern
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
AWK Exercism

Bereit, mit Bestenliste zu starten?

Melde dich bei Exercism an, um AWK mit 3 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.