Un vector en Clojure est une collection séquentielle, indexée et immuable de zéro ou plusieurs valeurs. Cela signifie qu'une fois qu'un vector a été créé, il ne peut plus être modifié. Les fonctions qui agissent sur les vectors renvoient un nouveau vector, tandis que le vector d'origine reste inchangé. Les valeurs d'un vector peuvent être de types hétérogènes. On peut définir un vector comme ceci :
(def empty [])
(def single-value [5])
(def single-value-alternative (vector 5))
(def three-values [1 "a" "b"])
On peut récupérer les éléments d'un vector à l'aide d'un indice. Les vectors de Clojure sont indexés à partir de zéro, ce qui signifie que l'indice du premier élément est toujours zéro :
(def numbers [2 3 5])
;; Read value from vector
(get numbers 2)
;;=> 5
;; Update value in vector
(assoc numbers 2 9)
;;=> [2 3 9]
Le vector d'origine reste inchangé :
numbers
;;=> [2 3 5]
Pour se souvenir de la valeur mise à jour, il faut la transmettre ou la capturer dans un var :
(def updated-numbers
(assoc numbers 2 9))
(get updated-numbers 2)
;;=> 9
Tu es un observateur d'oiseaux passionné et tu notes combien d'oiseaux ont visité ton jardin ces sept derniers jours.
Tu as six tâches, toutes consacrées au nombre d'oiseaux qui ont visité ton jardin.
Pour pouvoir comparer, tu gardes toujours une copie des comptes de la semaine dernière à portée de main, à savoir : 0, 2, 5, 3, 7, 8 et 4. Crée un vecteur contenant les comptes de la semaine dernière :
last-week
;;=> [0 2 5 3 7 8 4]
Implémente la fonction today pour renvoyer le nombre d'oiseaux qui ont visité ton jardin aujourd'hui. Les comptes sont ordonnés par jour : le premier élément correspond au jour le plus ancien et le dernier au compte d'aujourd'hui.
(def birds-per-day [2 5 0 7 4 1])
(today birds-per-day)
;;=> 1
Implémente la fonction inc-bird pour incrémenter le compte d'aujourd'hui :
(inc-bird birds-per-day)
;;=> [2 5 0 7 4 2]
Implémente la fonction prédicat day-without-birds? qui renvoie true si un jour aucun oiseau n'a visité le jardin, et false sinon :
(day-without-birds? birds-per-day)
;;=> true
Implémente la fonction n-days-count qui renvoie le nombre d'oiseaux qui ont visité ton jardin depuis le début de la semaine, mais limite ce compte au nombre de jours indiqué depuis le début de la semaine.
(n-days-count birds-per-day 4)
;;=> 14
Certains jours sont plus chargés que d'autres. Une journée est considérée comme chargée lorsque cinq oiseaux ou plus ont visité ton jardin.
Implémente la fonction busy-days pour renvoyer le nombre de journées chargées :
(busy-days birds-per-day)
;;=> 2
Au cours de l'année écoulée, tu as remarqué que certaines semaines forment un même motif étrange, où les comptes alternent entre un et zéro oiseau. Implémente la fonction odd-week? qui renvoie true si le motif de comptage de cette semaine correspond au motif étrange :
(odd-week? [1 0 1 0 1 0 1])
;;=> true
Inscris-toi sur Exercism pour apprendre et maîtriser Clojure avec 12 concepts105 exercices, et un vrai mentorat humain, le tout gratuitement.