Um vector em Clojure é uma coleção sequencial, indexada e imutável de zero ou mais valores. Ou seja, depois que um vector é criado, ele não pode ser modificado. As funções que operam sobre vectors retornam um novo vector, e o vector original permanece inalterado. Os valores em um vector podem ser de tipos heterogêneos. Vectors podem ser definidos assim:
(def empty [])
(def single-value [5])
(def single-value-alternative (vector 5))
(def three-values [1 "a" "b"])
É possível obter elementos de um vector usando um índice. Os vectors do Clojure têm base zero, o que significa que 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 guardar o valor atualizado, precisamos passá-lo adiante ou capturá-lo em uma var:
(def updated-numbers
(assoc numbers 2 9))
(get updated-numbers 2)
;;=> 9
Você adora observar aves e acompanha quantas aves visitaram seu jardim nos últimos sete dias.
Você tem seis tarefas, todas sobre os números de aves que visitaram seu jardim.
Para efeito de comparação, você sempre mantém por perto uma cópia das contagens da semana passada, que foram: 0, 2, 5, 3, 7, 8 e 4. Crie um vetor com as contagens da semana passada:
last-week
;;=> [0 2 5 3 7 8 4]
Implemente a função today para retornar quantas aves visitaram seu jardim hoje. As contagens de aves estão ordenadas por dia: o primeiro elemento é a contagem do dia mais antigo e o último elemento é a contagem de hoje.
(def birds-per-day [2 5 0 7 4 1])
(today birds-per-day)
;;=> 1
Implemente a função inc-bird para incrementar a contagem de hoje:
(inc-bird birds-per-day)
;;=> [2 5 0 7 4 2]
Implemente a função predicado day-without-birds?, que retorna true se houve algum dia em que zero aves visitaram o jardim; caso contrário, retorne false:
(day-without-birds? birds-per-day)
;;=> true
Implemente a função n-days-count que retorna o número de aves que visitaram seu jardim desde o início da semana, mas limite a contagem ao número de dias especificado a partir do início da semana.
(n-days-count birds-per-day 4)
;;=> 14
Alguns dias são mais movimentados que outros. Um dia movimentado é aquele em que cinco ou mais aves visitaram seu jardim.
Implemente a função busy-days para retornar o número de dias movimentados:
(busy-days birds-per-day)
;;=> 2
Ao longo do último ano, você percebeu que algumas semanas formam o mesmo padrão ímpar, em que as contagens alternam entre uma e zero aves visitando o jardim. Implemente a função odd-week? que retorna 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
Crie sua conta no Exercism para aprender e dominar Clojure com 12 conceitos105 exercícios e mentoria humana de verdade, tudo de graça.