Trilhas
/
jq
jq
/
Exercícios
/
Contagem de pássaros
Contagem de pássaros

Contagem de pássaros

Exercício de aprendizagem

Introdução

Arrays

O JSON define um array, ou vetor, como:

Um array é uma coleção ordenada de valores. Um array começa com [ colchete esquerdo e termina com ] colchete direito. Os valores são separados por , vírgula.

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

Criando arrays

Use colchetes para reunir elementos em um array.

[1, 2, 3]

Os elementos de um stream podem ser capturados em um array envolvendo-o em colchetes.

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

Tamanho

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

Indexação e fatiamento

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

Recupere um elemento de um array com uma expressão entre colchetes: .[2] obtém o terceiro elemento.

Índices negativos contam de trás para 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] retorna 5 elementos a partir do índice 10; o índice final não é incluído.

Existem 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 oferece muitas funções que cobrem a funcionalidade de iteração mais comum:

  • map(expr) retorna um novo array em que o expr é aplicado a cada elemento, um por vez.

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

    Para aplicar isso a um array, combine com map.

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

    Como alternativa, aplique select a um stream e colete os resultados.

    [range(10) | select(. % 2 == 0)]    # => [0, 2, 4, 6, 8]
    
  • any(condition) e all(condition) retornam um valor Boolean indicando se algum ou todos os elementos do array satisfazem a condição.

    [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

Você é um observador de pássaros dedicado que acompanha quantos pássaros visitaram seu jardim nos últimos sete dias.

Você tem cinco tarefas, todas sobre os números de pássaros que visitaram seu jardim.

1. Verifique quais foram as contagens na semana passada

Você armazena as contagens de pássaros no formato JSON. Um array "principal" armazena arrays de contagens semanais. Cada contagem semanal é um array de sete números inteiros, um número para cada dia da semana. Você sempre adiciona novas semanas no final do array principal. Implemente o filtro que retorna 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. Verifique quantos pássaros visitaram ontem

Implemente o filtro para retornar quantos pássaros visitaram seu jardim ontem. As contagens de pássaros estão ordenadas por dia, sendo 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. Calcule o número total de pássaros visitantes

Implemente o filtro para retornar o número total de pássaros que visitaram seu jardim esta semana.

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

4. Calcule o número de dias movimentados

Alguns dias são mais movimentados que outros. Um dia movimentado é aquele em que cinco ou mais pássaros visitaram seu jardim. Implemente o filtro para retornar o número de dias movimentados desta semana.

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

5. Verifique se houve um dia sem pássaros visitantes

Implemente o filtro que retorna true se houve algum dia nesta semana em que zero pássaros visitaram o jardim; caso contrário, retorne false.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "has_day_without_birds": false
}
Editar via GitHub O link abre em uma nova janela ou aba
jq Exercism

Tudo pronto para começar Contagem de pássaros?

Crie sua conta no Exercism para aprender e dominar jq com 12 conceitos75 exercícios e mentoria humana de verdade, tudo de graça.