Kurzusok
/
AWK
AWK
/
Feladatok
/
Legjobb pontszámok
Legjobb pontszámok

Legjobb pontszámok

Könnyű

Utasítások

Kezeld egy játékos csúcspontszám-listáját.

A feladatod, hogy elkészítsd a klasszikus Frogger játék csúcspontszám-komponensét. A Frogger minden idők egyik legkelendőbb és legaddiktívabb játéka, az árkádkorszak klasszikusa. A feladatod, hogy olyan metódusokat írj, amelyek visszaadják a lista legmagasabb pontszámát, a legutóbb hozzáadott pontszámot és a három legmagasabb pontszámot.

Rendezés AWK-ban

Ennél a feladatnál a kimenetet egy adott módon kell rendezni. Ahogy sok más programozási nyelvben, úgy itt is előfordul, hogy egy tömb bejárása az implementációtól függő, látszólag véletlenszerű sorrendben történik. Ez általában nem az, amit az ember látni szeretne. A GNU awk néhány rendezési funkciót kínál.

  1. asort: egy numerikusan indexelt tömb rendezése a tömb értékei alapján.

    #!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]
    }
    

    aminek a kimenete

    1 92 30
    2 59 57
    3 30 59
    4 57 74
    5 74 92
    

    Az n = asort(array) alak helyben rendezi a megnevezett tömböt.

    Ez leginkább a numerikusan indexelt tömböknél hasznos. A sorted tömböt feltöltő folyamat elveti az eredeti tömbindexeket: a sorted tömböt 1-től n-ig indexeli.

  2. asorti: egy tömb rendezése a tömb indexei alapján.

    Az asorti függvény feltölt egy „cél” tömböt, amely a „forrás” tömb rendezett indexeit tartalmazza.

    #!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]]
    }
    

    aminek a kimenete

    unordered
    foo 92
    qux 30
    bar 59
    ordered by index
    bar 59
    foo 92
    qux 30
    
  3. PROCINFO["sorted_in"]: egy tömb bejárása megadott sorrendben.

    A beépített PROCINFO tömb rengeteg információt tartalmaz a futó awk-folyamatról. Ennek a tömbnek az egyik érdekes eleme a sorted_in. Ennek a tömbkulcsnak az értéke egy függvény neve, amely szabályozza, hogy a for (indx in array) ciklusok milyen sorrendben dolgozzák fel a tömb indexeit.

    A függvény lehet egy felhasználó által definiált függvény neve, de néhány hasznos, előre definiált rendezőfüggvény is a rendelkezésünkre áll, például:

    • "@ind_str_asc", "@ind_str_desc": a tömb rendezése index szerint, ábécésorrendben, növekvő vagy csökkenő irányban.
    • "@ind_num_asc", "@ind_num_desc": a tömb rendezése index szerint, numerikus sorrendben, növekvő vagy csökkenő irányban.
    • "@val_str_asc", "@val_str_desc": a tömb rendezése érték szerint, ábécésorrendben, növekvő vagy csökkenő irányban.
    • "@val_num_asc", "@val_num_desc": a tömb rendezése érték szerint, numerikus sorrendben, növekvő vagy csökkenő irányban.

    A fenti asort-példa így valósítható meg:

    PROCINFO["sorted_in"] = "@val_num_asc"
    for (idx in nums)
        print idx, nums[idx]
    
    3 30
    4 57
    2 59
    5 74
    1 92
    

    Az asorti-példa így írható fel:

    PROCINFO["sorted_in"] = "@ind_str_asc"
    for (idx in nums)
        print idx, nums[idx]
    
    bar 59
    foo 92
    qux 30
    

    Ezzel a módszerrel elkerülhetjük az ideiglenes sorted tömböt és az n visszatérési értéket. Egyszerű és elegáns.

Felhasználó által definiált rendezőfüggvény

A felhasználó által definiált rendezőfüggvény 4 paramétert kap: az egyik tömbelem indexét és értékét, valamint egy másik tömbelem indexét és értékét:

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

A visszatérési érték jelentése:

  • nullánál kisebb: idx1 megelőzi idx2-t
  • nullánál nagyobb: idx1 követi idx2-t
  • nulla: az indexek rendezési elsőbbsége azonos, de a relatív sorrendjük meghatározatlan.

Amellett, hogy a PROCINFO["sorted_in"] szabályozza a for (idx in array) bejárás sorrendjét, az asort és az asorti is elfogadhatja egy összehasonlító függvény nevét harmadik paraméterként.

Hivatkozások


Forrás

Tiszteletadás a nyolcvanas évek Frogger játéktermi játéka előtt
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
AWK Exercism

Készen állsz elkezdeni a(z) Legjobb pontszámok feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) AWK nyelvet 3 fogalom92 feladat segítségével, valódi emberi mentorálással, mindez ingyen.