Track
/
jq
jq
/
Esercizi
/
Conteggio degli uccelli
Conteggio degli uccelli

Conteggio degli uccelli

Esercizio di apprendimento

Introduzione

Array

JSON definisce un array come:

Un array è una raccolta ordinata di valori. Un array inizia con la parentesi quadra sinistra [ e finisce con la parentesi quadra destra ]. I valori sono separati dalla virgola ,.

Gli array possono contenere zero o più valori JSON di qualsiasi tipo. Gli elementi di un array non devono essere tutti dello stesso tipo.

Creare array

Usa le parentesi quadre per raccogliere gli elementi in un array.

[1, 2, 3]

Gli elementi di uno stream possono essere raccolti in un array racchiudendoli tra parentesi quadre.

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

Dimensione

La funzione length restituisce il numero di elementi di un array.

Indicizzazione e sezioni

L'indicizzazione degli array parte da zero.

Recupera un elemento da un array con un'espressione tra parentesi quadre: .[2] ottiene il terzo elemento.

Gli indici negativi contano all'indietro dalla fine dell'array: .[-1] ottiene l'ultimo elemento; .[-2] è il penultimo.

Una sezione (slice) è una sotto-sequenza dell'array. .[10:15] restituisce 5 elementi a partire dall'indice 10; l'indice finale non è incluso.

Ci sono alcune funzioni di comodo:

  • first ottiene il primo elemento.
  • last ottiene l'ultimo elemento.
  • nth(n) ottiene l'elemento all'indice n.

Iterazione

jq fornisce molte funzioni per coprire le funzionalità di iterazione più comuni:

  • map(expr) restituisce un nuovo array in cui l'expr viene applicato a ciascun elemento, uno alla volta.

    [1, 2, 3] | map(. * 10)    # => [10, 20, 30]
    
    
  • select(expr) è una funzione che applica l'expr a un singolo valore; se il risultato dell'espressione è vero, allora il valore viene restituito; se il risultato è falso, non viene restituito nulla: non null, proprio nulla.

    Per applicarlo a un array, combinalo con map.

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

    In alternativa, applica select a uno stream e raccogli i risultati.

    [range(10) | select(. % 2 == 0)]    # => [0, 2, 4, 6, 8]
    
  • any(condition) e all(condition) restituiscono un valore booleano che indica se uno o tutti gli elementi dell'array superano la condizione.

    [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
    

Istruzioni

Sei un appassionato birdwatcher che tiene traccia di quanti uccelli hanno visitato il tuo giardino negli ultimi sette giorni.

Hai cinque attività, tutte relative al numero di uccelli che hanno visitato il tuo giardino.

1. Controlla quali erano i conteggi della scorsa settimana

Memorizzi i tuoi conteggi degli uccelli in formato JSON. Un array "main" memorizza array di conteggi settimanali. Ogni conteggio settimanale è un array di sette numeri interi, un numero per ogni giorno della settimana. Aggiungi sempre le nuove settimane in fondo all'array "main". Implementa il filtro che restituisce i conteggi della scorsa settimana.

$ 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. Controlla quanti uccelli hanno visitato ieri

Implementa il filtro per restituire quanti uccelli hanno visitato il tuo giardino ieri. I conteggi degli uccelli sono ordinati per giorno: il primo elemento è il conteggio del giorno più vecchio, mentre l'ultimo è il conteggio di oggi.

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

3. Calcola il numero totale di uccelli in visita

Implementa il filtro per restituire il numero totale di uccelli che hanno visitato il tuo giardino questa settimana.

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

4. Calcola il numero di giorni intensi

Alcuni giorni sono più intensi di altri. Un giorno intenso è quello in cui cinque o più uccelli hanno visitato il tuo giardino. Implementa il filtro per restituire il numero di giorni intensi questa settimana.

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

5. Controlla se c'è stato un giorno senza uccelli in visita

Implementa il filtro che restituisce true se c'è stato un giorno questa settimana in cui zero uccelli hanno visitato il giardino; altrimenti, restituisci false.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "has_day_without_birds": false
}
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
jq Exercism

Vuoi iniziare Conteggio degli uccelli?

Iscriviti a Exercism per imparare e padroneggiare jq con 12 concetti75 esercizi e il mentoring di persone reali, tutto gratis.