Percursos
/
jq
jq
/
Exercícios
/
Contagem de aves
Contagem de aves

Contagem de aves

Exercício de aprendizagem

Introdução

Arrays

O JSON define um array (em português, um vetor) como:

Um array é uma coleção ordenada de valores. Um array começa com [, o parêntese reto de abertura, e termina com ], o parêntese reto de fecho. Os valores são separados por ,, uma vírgula.

Os arrays podem conter zero ou mais valores JSON de qualquer tipo. Os elementos de um array não precisam de ser todos do mesmo tipo.

Criar arrays

Usa parênteses retos para reunir elementos num array.

[1, 2, 3]

Os elementos de um stream podem ser capturados num array envolvendo-o em parênteses retos.

range(5)     # => a stream of 5 numbers
[range(5)]   # => the array [0, 1, 2, 3, 4]

Tamanho

A função length devolve o número de elementos de um array.

Indexação e fatiamento

A indexação de arrays começa em zero.

Obtém um elemento de um array com uma expressão entre parênteses retos: .[2] obtém o terceiro elemento.

Os índices negativos contam de trás para a frente a partir do fim do array: .[-1] obtém o último elemento; .[-2] é o penúltimo.

Uma fatia é uma subsequência do array. .[10:15] devolve 5 elementos a partir do índice 10; o índice final não é incluído.

Existem ainda algumas funções de conveniência:

  • first obtém o primeiro elemento.
  • last obtém o último elemento.
  • nth(n) obtém o elemento no índice n.

Iteração

O jq fornece muitas funções para as tarefas de iteração mais comuns:

  • map(expr) devolve um novo array em que a expr é aplicada a cada elemento, um a um.

    [1, 2, 3] | map(. * 10)    # => [10, 20, 30]
    
    
  • select(expr) é uma função que aplica a expr a um único valor; se o resultado da expressão for verdadeiro, o valor é devolvido; se o resultado for falso, nada é devolvido: não null, mas mesmo nada.

    Para aplicar isso a um array, combina-a com map.

    [range(10)] | map(select(. % 2 == 0))    # => [0, 2, 4, 6, 8]
    

    Em alternativa, aplica select a um stream e recolhe os resultados.

    [range(10) | select(. % 2 == 0)]    # => [0, 2, 4, 6, 8]
    
  • any(condition) e all(condition) devolvem um valor Boolean que indica se algum dos elementos do array passa a condição, ou se todos passam.

    [1, 2, 3, 4] | any(. > 4)    # false
    [1, 2, 3, 4] | any(. >= 4)   # true
    
    [1, 2, 3, 4] | all(. >= 4)   # false
    [1, 2, 3, 4] | all(. <= 4)   # true
    

Instruções

És um observador de aves entusiasta que mantém registo de quantas aves visitaram o teu jardim nos últimos sete dias.

Tens cinco tarefas, todas relacionadas com o número de aves que visitaram o teu jardim.

1. Verifica quais foram as contagens da semana passada

Guardas as contagens de aves em formato JSON. Um array principal armazena arrays de contagens semanais. Cada contagem semanal é um array de sete números inteiros, um número por cada dia da semana. Acrescentas sempre as novas semanas ao fim do array principal. Implementa o filtro que devolve as contagens da semana passada.

$ cat bird-counting-data.json
[
  ...,
  [0, 2, 5, 3, 7, 8, 4],
  [4, 5, 9, 10, 9, 4, 3]
]

$ jq -f bird-count.jq < bird-counting-data.json
{
  "last_week": [0, 2, 5, 3, 7, 8, 4],
  ...

2. Verifica quantas aves visitaram ontem o teu jardim

Implementa o filtro que devolve quantas aves visitaram o teu jardim ontem. 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.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "yesterday": 4,
  ...

3. Calcula o número total de aves que visitaram o jardim

Implementa o filtro que devolve o número total de aves que visitaram o teu jardim esta semana.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "total": 44,
  ...

4. Calcula o número de dias movimentados

Há dias mais movimentados do que outros. Um dia movimentado é aquele em que cinco ou mais aves visitaram o teu jardim. Implementa o filtro que devolve o número de dias movimentados esta semana.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "busy_days": 4,
  ...

5. Verifica se houve algum dia sem aves a visitar o jardim

Implementa o filtro que devolve true se, esta semana, houve algum dia em que zero aves visitaram o teu jardim; caso contrário, devolve false.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "has_day_without_birds": false
}
Editar via GitHub A ligação abre numa nova janela ou separador
jq Exercism

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

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