Parcours
/
AWK
AWK
/
Exercices
/
Meilleurs scores
Meilleurs scores

Meilleurs scores

Facile

Instructions

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.

Trie en AWK

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.

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

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

Fonction de tri définie par l'utilisateur

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 :

  • inférieure à zéro : idx1 vient avant idx2
  • supérieure à zéro : idx1 vient après idx2
  • égale à zéro : les indices ont la même priorité de tri, mais leur ordre relatif n'est pas défini.

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.

Références


Source

Hommage au jeu d'arcade des années 80 Frogger.
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
AWK Exercism

Prêt à commencer Meilleurs scores ?

Inscris-toi sur Exercism pour apprendre et maîtriser AWK avec 3 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.