Rutas
/
jq
jq
/
Ejercicios
/
Recuento de aves
Recuento de aves

Recuento de aves

Ejercicio de aprendizaje

Introducción

Arrays

JSON define un array como:

Un array es una colección ordenada de valores. Un array empieza con [ corchete izquierdo y termina con ] corchete derecho. Los valores se separan con , coma.

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

Crear arrays

Usa corchetes para reunir elementos en un array.

[1, 2, 3]

Los elementos de un stream se pueden capturar en un array encerrándolo 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 el número de elementos de un array.

Indexación y segmentación

La indexación de los arrays empieza en cero.

Para obtener un elemento de un array, usa una expresión entre 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 de utilidad:

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

Iteración

jq proporciona muchas funciones que cubren la funcionalidad de iteración más habitual:

  • map(expr) devuelve un nuevo array donde la expr se aplica a cada elemento por turno.

    [1, 2, 3] | map(. * 10)    # => [10, 20, 30]
    
    
  • select(expr) es una función que aplica la expr a un único valor; si el resultado de la expresión es verdadero, se devuelve el valor; si el resultado es falso, no se devuelve nada: ni 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 booleano 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 ávido observador de aves que lleva un registro de cuántos pájaros han visitado tu jardín en los últimos siete días.

Tienes cinco tareas, todas ellas relacionadas con las cantidades de pájaros que visitaron tu jardín.

1. Comprueba cuáles fueron los recuentos de la semana pasada

Almacenas tus recuentos de pájaros en formato JSON. Un array «principal» almacena arrays de recuentos semanales. Cada recuento semanal es un array de siete números enteros, un número por cada día de la semana. Siempre añades las nuevas semanas al final del array principal. Implementa el filtro que devuelve los recuentos 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. Comprueba cuántos pájaros visitaron ayer

Implementa el filtro para devolver cuántos pájaros visitaron tu jardín ayer. Los recuentos de pájaros están ordenados por día: el primer elemento es el recuento del día más antiguo y el último es el recuento de hoy.

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

3. Calcula el número total de pájaros que han visitado el jardín

Implementa el filtro para devolver el número total de pájaros que han visitado tu jardín esta semana.

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

4. Calcula el número de días ajetreados

Algunos días están más ajetreados que otros. Un día ajetreado es aquel en el que cinco o más pájaros han visitado tu jardín. Implementa el filtro para devolver el número de días ajetreados de esta semana.

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

5. Comprueba si hubo algún día sin pájaros visitantes

Implementa el filtro que devuelve true si hubo algún día esta semana en el que cero pájaros 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 pestaña nueva
jq Exercism

¿Listo para empezar Recuento de aves?

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