Tracks
/
jq
jq
/
Ejercicios
/
Conteo de aves
Conteo de aves

Conteo de aves

Ejercicio de aprendizaje

Introducción

Arrays

JSON define un array (arreglo) como:

Un array es una colección ordenada de valores. Un array comienza con el corchete de apertura [ y termina con el corchete de cierre ]. Los valores se separan con una coma ,.

Los arrays pueden contener cero o más valores JSON de cualquier tipo. Los elementos del array no tienen que ser todos del mismo tipo.

Crear arrays

Usa corchetes para reunir elementos en un array.

[1, 2, 3]

Puedes capturar los elementos de un stream en un array si lo encierras entre corchetes.

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

Tamaño

La función length devuelve la cantidad de elementos de un array.

Indexación y segmentación

Los índices de un array empiezan en cero.

Para obtener un elemento de un array, usa una expresión con corchetes: .[2] obtiene el tercer elemento.

Los índices negativos cuentan hacia atrás desde el final del array: .[-1] obtiene el último elemento; .[-2] es el penúltimo.

Un segmento es una subsecuencia del array. .[10:15] devuelve 5 elementos a partir del índice 10; el índice final no se incluye.

Hay algunas funciones que te facilitan la tarea:

  • first obtiene el primer elemento.
  • last obtiene el último elemento.
  • nth(n) obtiene el elemento en el índice n.

Iterar

jq ofrece muchas funciones para cubrir las necesidades de iteración más comunes:

  • map(expr) devuelve un nuevo array en el que se aplica expr a cada elemento, uno tras otro.

    [1, 2, 3] | map(. * 10)    # => [10, 20, 30]
    
    
  • select(expr) es una función que aplica expr a un solo valor; si el resultado de la expresión es verdadero, se devuelve el valor; si el resultado es falso, no se devuelve nada: no null, literalmente nada.

    Para aplicarlo a un array, combínalo con map.

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

    Como alternativa, aplica select a un stream y recoge los resultados.

    [range(10) | select(. % 2 == 0)]    # => [0, 2, 4, 6, 8]
    
  • any(condition) y all(condition) devuelven un valor Boolean que indica si alguno o todos los elementos del array cumplen la condición.

    [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
    

Instrucciones

Eres un observador de aves entusiasta que lleva la cuenta de cuántas aves han visitado tu jardín en los últimos siete días.

Tienes cinco tareas, todas relacionadas con la cantidad de aves que visitaron tu jardín.

1. Revisa cuáles fueron los conteos de la semana pasada

Guardas tus conteos de aves en formato JSON. Un array «principal» almacena arrays de conteos semanales. Cada conteo semanal es un array de siete números enteros, un número por cada día de la semana. Siempre agregas las semanas nuevas al final del array principal. Implementa el filtro que devuelve los conteos de la semana pasada.

$ 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. Revisa cuántas aves visitaron ayer

Implementa el filtro que devuelve cuántas aves visitaron tu jardín ayer. Los conteos de aves están ordenados por día, donde el primer elemento es el conteo del día más antiguo y el último elemento es el conteo de hoy.

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

3. Calcula el número total de aves visitantes

Implementa el filtro que devuelve el número total de aves que han visitado tu jardín esta semana.

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

4. Calcula la cantidad de días ajetreados

Algunos días son más ajetreados que otros. Un día ajetreado es aquel en el que cinco o más aves han visitado tu jardín. Implementa el filtro que devuelve la cantidad de días ajetreados de esta semana.

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

5. Revisa si hubo un día sin aves visitantes

Implementa el filtro que devuelve true si hubo algún día de esta semana en el que cero aves visitaron el jardín; de lo contrario, devuelve false.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "has_day_without_birds": false
}
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
jq Exercism

¿Todo listo para empezar Conteo de aves?

Regístrate en Exercism para aprender y dominar jq con 12 conceptos75 ejercicios y mentoría humana real, todo gratis.