Percursos
/
Clojure
Clojure
/
Exercícios
/
Observador de aves
Observador de aves

Observador de aves

Exercício de aprendizagem

Introdução

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

Instruções

É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.

1. Verifica quais eram as contagens da semana passada

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]

2. Verifica quantas aves visitaram hoje

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

3. Incrementa a contagem de hoje

Implementa a função inc-bird para incrementar a contagem de hoje:

(inc-bird birds-per-day)
;;=> [2 5 0 7 4 2]

4. Verifica se houve um dia sem aves a visitar

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

5. Calcula o número de aves visitantes nos primeiros dias

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

6. Calcula o número de dias movimentados

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

7. Verifica se é uma semana ímpar

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
Editar via GitHub A ligação abre numa nova janela ou separador
Clojure Exercism

Estás pronto para começar Observador de aves?

Inscreve-te no Exercism para aprenderes e dominares Clojure com 12 conceitos105 exercícios, e mentoria humana real, tudo grátis.