In Clojure un vector è una collezione sequenziale, indicizzata e immutabile di zero o più valori. Questo significa che, una volta creato, un vector non può più essere modificato. Le funzioni che operano sui vector restituiscono un nuovo vector, mentre il vector originale rimane invariato. I valori in un vector possono essere di tipi eterogenei. I vector si possono definire così:
(def empty [])
(def single-value [5])
(def single-value-alternative (vector 5))
(def three-values [1 "a" "b"])
Gli elementi si possono recuperare da un vector tramite un indice. I vector di Clojure sono basati sullo zero, cioè l'indice del primo elemento è sempre zero:
(def numbers [2 3 5])
;; Read value from vector
(get numbers 2)
;;=> 5
;; Update value in vector
(assoc numbers 2 9)
;;=> [2 3 9]
Il vector originale rimane invariato:
numbers
;;=> [2 3 5]
Per ricordare il valore aggiornato, dobbiamo passarlo avanti oppure catturarlo in un var:
(def updated-numbers
(assoc numbers 2 9))
(get updated-numbers 2)
;;=> 9
Sei un appassionato di birdwatching che tiene traccia di quanti uccelli hanno visitato il tuo giardino negli ultimi sette giorni.
Hai sei attività, tutte relative al numero di uccelli che hanno visitato il tuo giardino.
Per fare un confronto, tieni sempre a portata di mano una copia dei conteggi della settimana scorsa, che erano: 0, 2, 5, 3, 7, 8 e 4. Crea un vettore che contenga i conteggi della settimana scorsa:
last-week
;;=> [0 2 5 3 7 8 4]
Implementa la funzione today in modo che restituisca quanti uccelli hanno visitato il tuo giardino oggi. I conteggi degli uccelli sono ordinati per giorno: il primo elemento è il conteggio del giorno meno recente, l'ultimo è il conteggio di oggi.
(def birds-per-day [2 5 0 7 4 1])
(today birds-per-day)
;;=> 1
Implementa la funzione inc-bird per incrementare il conteggio di oggi:
(inc-bird birds-per-day)
;;=> [2 5 0 7 4 2]
Implementa la funzione predicato day-without-birds? che restituisce true se c'è stato un giorno in cui zero uccelli hanno visitato il giardino; altrimenti restituisce false:
(day-without-birds? birds-per-day)
;;=> true
Implementa la funzione n-days-count che restituisce il numero di uccelli che hanno visitato il tuo giardino dall'inizio della settimana, ma limita il conteggio al numero di giorni specificato dall'inizio della settimana.
(n-days-count birds-per-day 4)
;;=> 14
Alcuni giorni sono più intensi di altri. Un giorno intenso è un giorno in cui cinque o più uccelli hanno visitato il tuo giardino.
Implementa la funzione busy-days in modo che restituisca il numero di giorni intensi:
(busy-days birds-per-day)
;;=> 2
Nel corso dell'ultimo anno, hai scoperto che alcune settimane formano lo stesso schema anomalo, in cui i conteggi si alternano tra uno e zero uccelli in visita. Implementa la funzione odd-week? che restituisce true se lo schema dei conteggi degli uccelli di questa settimana corrisponde allo schema anomalo:
(odd-week? [1 0 1 0 1 0 1])
;;=> true
Iscriviti a Exercism per imparare e padroneggiare Clojure con 12 concetti105 esercizi e il mentoring di persone reali, tutto gratis.