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.
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.
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.
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
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.
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:
idx1 megelőzi idx2-tidx1 követi idx2-tAmellett, 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.
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.