Um vector em Clojure é uma coleção sequencial, indexada e imutável de zero ou mais valores. Isto significa que, depois de criado, um vector não pode ser modificado. As funções que operam sobre vectors devolvem um novo vector, enquanto o vector original permanece inalterado. Os valores de um vector podem ser de tipos heterogéneos. Os vectors podem ser definidos da seguinte forma:
(def empty [])
(def single-value [5])
(def single-value-alternative (vector 5))
(def three-values [1 "a" "b"])
Os elementos podem ser obtidos a partir de um vector através de um índice. Em Clojure, os vectors são indexados a partir de zero, ou seja, o índice do primeiro 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]
O vector original permanece inalterado:
numbers
;;=> [2 3 5]
Para nos lembrarmos do valor atualizado, temos de o passar adiante ou de o capturar numa var:
(def updated-numbers
(assoc numbers 2 9))
(get updated-numbers 2)
;;=> 9
És um observador de aves ávido e acompanhas quantas aves visitaram o teu jardim nos últimos sete dias.
Tens seis tarefas, todas relacionadas com o número de aves que visitaram o teu jardim.
Para efeitos de comparação, tens sempre por perto uma cópia das contagens da semana passada, que foram: 0, 2, 5, 3, 7, 8 e 4. Cria um vetor com as contagens da semana passada:
last-week
;;=> [0 2 5 3 7 8 4]
Implementa a função today para devolver quantas aves visitaram o teu jardim hoje. As contagens de aves estão ordenadas por dia: o primeiro elemento é a contagem do dia mais antigo e o último é a contagem de hoje.
(def birds-per-day [2 5 0 7 4 1])
(today birds-per-day)
;;=> 1
Implementa a função inc-bird para incrementar a contagem de hoje:
(inc-bird birds-per-day)
;;=> [2 5 0 7 4 2]
Implementa a função de predicado day-without-birds? que devolve true se houve um dia em que zero aves visitaram o jardim; caso contrário, devolve false:
(day-without-birds? birds-per-day)
;;=> true
Implementa a função n-days-count que devolve o número de aves que visitaram o teu jardim desde o início da semana, mas limita a contagem ao número de dias indicado a partir do início da semana.
(n-days-count birds-per-day 4)
;;=> 14
Alguns dias são mais movimentados do que outros. Um dia movimentado é aquele em que cinco ou mais aves visitaram o teu jardim.
Implementa a função busy-days para devolver o número de dias movimentados:
(busy-days birds-per-day)
;;=> 2
Ao longo do último ano, reparaste que algumas semanas seguem o mesmo padrão ímpar, em que as contagens alternam entre uma ave e zero aves a visitar. Implementa a função odd-week? que devolve true se o padrão de contagem de aves desta semana corresponder ao padrão ímpar:
(odd-week? [1 0 1 0 1 0 1])
;;=> true
Inscreve-te no Exercism para aprenderes e dominares Clojure com 12 conceitos105 exercícios, e mentoria humana real, tudo grátis.