Étant donné une string représentant une matrice de nombres, renvoie les lignes et les colonnes de cette matrice.
Ainsi, étant donné une string contenant des retours à la ligne, comme celle-ci :
9 8 7
5 3 2
6 6 7
qui représente cette matrice :
1 2 3
|---------
1 | 9 8 7
2 | 5 3 2
3 | 6 6 7
ton code doit pouvoir produire :
Les lignes de notre matrice d'exemple :
Et ses colonnes :
C'est le premier exercice où la solution n'est pas un script main. L'objectif est d'écrire une bibliothèque de fonctions destinée à être incluse dans d'autres programmes awk. Cet exercice te fera découvrir plusieurs nouveaux concepts intéressants.
Les sections suivantes, signalées par la mention «\u00A0(gawk)\u00A0», sont des extensions propres à GNU awk.
Dans cet exercice, tu liras les données depuis un fichier, et non depuis le flux d'entrée principal.
Renseigne-toi sur getline dans le manuel de Gnu awk,
en particulier les formes Getline/File et Getline/Variable/File.
Pour implémenter cette solution, on pourrait utiliser un tableau à deux dimensions. GNU awk propose deux façons de représenter un tel tableau\u00A0:
Remarque la directive @include présente dans le fichier de test.
Elle demande à gawk de lire et d'évaluer le fichier indiqué.
Toutes les variables awk sont globales (à l'exception des paramètres de fonction, qui sont locaux à la fonction).
Le risque de collisions de noms est élevé, en particulier lorsqu'on inclut des bibliothèques tierces.
Les espaces de noms permettent de cloisonner l'endroit où les variables sont stockées.
Remarque la directive @namespace dans les fichiers de l'exercice.
L'espace de noms par défaut s'appelle «\u00A0awk\u00A0». Disposer d'un espace de noms par défaut permet au programmeur d'appeler une fonction awk native depuis l'intérieur d'une fonction située dans un autre espace de noms.
Les paramètres de type tableau sont passés par référence. Les modifications apportées au tableau dans la fonction sont visibles par l'appelant.
Les paramètres qui ne sont pas des tableaux sont passés par valeur.
Pour les paramètres non typés, tout dépend de ce que la fonction en fait\u00A0:
Tous les détails se trouvent dans le manuel, à la section Passer les arguments de fonction par valeur ou par référence.
On peut créer des variables locales à une fonction en utilisant des paramètres passés «\u00A0par valeur\u00A0». Ce n'est pas une erreur de passer moins de valeurs à une fonction que le nombre de paramètres déclarés\u00A0; les paramètres en trop restent «\u00A0non typés\u00A0» jusqu'à ce qu'ils soient utilisés. Ils peuvent recevoir des valeurs scalaires dans la fonction sans être stockés dans l'espace de noms global.
Par convention, dans la signature de la fonction, les paramètres attendus apparaissent en premier, suivis d'un espace, puis des paramètres locaux. Un exemple\u00A0:
function add(a, b, total) {
# here, `typeof(total)` is "untyped"
total = a + b
# now, `typeof(total)` is "number"
return total
}
BEGIN {
sum = add(5, 10)
print sum # 15
print typeof(total) # untyped, meaning "total" is unused in this scope
}
Inscris-toi sur Exercism pour apprendre et maîtriser AWK avec 3 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.