Gère le tableau des meilleurs scores d'un joueur.
Ta tâche consiste à construire le composant de gestion des meilleurs scores du classique Frogger, l'un des jeux les plus vendus et les plus addictifs de tous les temps, et un classique de l'ère des salles d'arcade. Ta tâche consiste à écrire des méthodes qui renvoient le meilleur score du tableau, le dernier score ajouté et les trois meilleurs scores.
Cet exercice demande que la sortie soit triée d'une manière particulière. Comme dans beaucoup de langages de programmation, le parcours d'un tableau se fait dans un ordre qui dépend de l'implémentation et qui semble aléatoire. Ce n'est généralement pas ce que l'on souhaite voir. GNU awk propose quelques fonctionnalités de tri.
asort : trie un tableau à indices numériques en fonction des valeurs du tableau.
#!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]
}
ce qui donne
1 92 30
2 59 57
3 30 59
4 57 74
5 74 92
La forme n = asort(array) trie le tableau nommé sur place.
C'est surtout utile pour les tableaux à indices numériques.
Le processus qui remplit le tableau sorted abandonne les indices d'origine du tableau : le tableau sorted est indexé de 1 à n.
asorti : trie un tableau en fonction des indices du tableau.
La fonction asorti remplit un tableau « destination » qui contient les indices triés du tableau « source ».
#!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]]
}
ce qui donne
unordered
foo 92
qux 30
bar 59
ordered by index
bar 59
foo 92
qux 30
PROCINFO["sorted_in"] : parcourt un tableau dans un ordre donné.
Le tableau intégré PROCINFO contient beaucoup d'informations sur le processus awk en cours.
Un élément intéressant de ce tableau est sorted_in.
La valeur de cette clé du tableau est le nom d'une fonction qui contrôle l'ordre dans lequel les indices du tableau seront traités par les boucles for (indx in array).
Cette fonction peut être le nom d'une fonction définie par l'utilisateur, ou bien il existe des fonctions de tri prédéfinies bien pratiques, notamment :
"@ind_str_asc", "@ind_str_desc" : trier le tableau par indice ; utiliser un tri alphabétique ; trier par ordre croissant ou décroissant."@ind_num_asc", "@ind_num_desc" : trier le tableau par indice ; utiliser un tri numérique ; trier par ordre croissant ou décroissant."@val_str_asc", "@val_str_desc" : trier le tableau par valeur ; utiliser un tri alphabétique ; trier par ordre croissant ou décroissant."@val_num_asc", "@val_num_desc" : trier le tableau par valeur ; utiliser un tri numérique ; trier par ordre croissant ou décroissant.L'exemple asort ci-dessus peut s'implémenter ainsi :
PROCINFO["sorted_in"] = "@val_num_asc"
for (idx in nums)
print idx, nums[idx]
3 30
4 57
2 59
5 74
1 92
L'exemple asorti peut s'écrire ainsi :
PROCINFO["sorted_in"] = "@ind_str_asc"
for (idx in nums)
print idx, nums[idx]
bar 59
foo 92
qux 30
Cette méthode permet d'éviter le tableau temporaire sorted et la valeur de retour n.
Propre et net.
La fonction de tri définie par l'utilisateur prend 4 paramètres : l'indice et la valeur d'un élément du tableau, ainsi que l'indice et la valeur d'un autre élément du tableau :
function compare(idx1, val1, idx2, val2) {...}
La valeur de retour est :
idx1 vient avant idx2
idx1 vient après idx2
En plus de PROCINFO["sorted_in"] pour contrôler l'ordre des boucles for (idx in array), asort et asorti peuvent tous les deux prendre le nom d'une fonction de comparaison comme 3ᵉ paramètre.
Inscris-toi sur Exercism pour apprendre et maîtriser AWK avec 3 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.