Треки
/
jq
jq
/
Вправи
/
Підрахунок птахів
Підрахунок птахів

Підрахунок птахів

Навчальна вправа

Вступ

Масиви

JSON визначає масив так:

Масив - це впорядкована колекція значень. Масив починається з лівої квадратної дужки [ і закінчується правою квадратною дужкою ]. Значення розділяються комою ,.

Масиви можуть містити нуль або більше значень будь-якого типу JSON. Елементи масиву не обовʼязково мають бути одного типу.

Створення масивів

Використаймо квадратні дужки, щоб зібрати елементи в масив.

[1, 2, 3]

Елементи потоку можна зібрати в масив, узявши його в квадратні дужки.

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

Розмір

Функція length повертає кількість елементів у масиві.

Індексація та зрізи

Індексація масивів починається з нуля.

Щоб отримати елемент із масиву, використаймо вираз із квадратними дужками: .[2] дає третій елемент.

Відʼємні індекси рахуються від кінця масиву: .[-1] дає останній елемент, а .[-2] - передостанній.

Зріз - це підпослідовність масиву. .[10:15] повертає 5 елементів, починаючи з індексу 10; кінцевий індекс не включається.

Є кілька зручних функцій:

  • first дає перший елемент.
  • last дає останній елемент.
  • nth(n) дає елемент за індексом n.

Перебирання

jq надає багато функцій, що покривають типові задачі ітерації:

  • map(expr) повертає новий масив, у якому expr застосовується по черзі до кожного елемента.

    [1, 2, 3] | map(. * 10)    # => [10, 20, 30]
    
    
  • select(expr) - це функція, яка застосовує expr до одного значення; якщо результат виразу - правда, то значення повертається; якщо результат - неправда, то нічого не повертається, не null, а насправді нічого.

    Щоб застосувати це до масиву, поєднаймо його з map.

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

    Або ж застосуймо select до потоку й зберімо результати.

    [range(10) | select(. % 2 == 0)]    # => [0, 2, 4, 6, 8]
    
  • any(condition) і all(condition) повертають булеве значення (англ. Boolean) залежно від того, чи проходять умову будь-які або всі елементи масиву.

    [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
    

Вказівки

Ми завзяті спостерігачі птахів і відстежуємо, скільки птахів відвідало наш сад за останні сім днів.

На нас чекає пʼять завдань, і всі вони стосуються кількості птахів, що відвідали наш сад.

1. Перевірмо, якими були підрахунки минулого тижня

Ми зберігаємо підрахунки птахів у форматі JSON. «Головний» масив зберігає масиви тижневих підрахунків. Кожен тижневий підрахунок - це масив із семи цілих чисел, по одному числу на кожен день тижня. Ми завжди додаємо нові тижні в кінець головного масиву. Реалізуйте фільтр, який повертає підрахунки за минулий тиждень.

$ 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. Перевірмо, скільки птахів відвідало сад учора

Реалізуйте фільтр, який повертає кількість птахів, що відвідали наш сад учора. Підрахунки птахів упорядковано за днями: перший елемент - кількість за найдавніший день, а останній - сьогоднішня кількість.

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

3. Порахуймо загальну кількість птахів, що прилетіли

Реалізуйте фільтр, який повертає загальну кількість птахів, що відвідали наш сад цього тижня.

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

4. Порахуймо кількість насичених днів

Деякі дні насиченіші за інші. Насичений день - це день, коли до нашого саду відвідало пʼять або більше птахів. Реалізуйте фільтр, який повертає кількість насичених днів цього тижня.

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

5. Перевірмо, чи був день, коли птахи не прилітали

Реалізуйте фільтр, який повертає true, якщо цього тижня був хоч один день, коли до саду не прилетів жоден птах; інакше поверніть false.

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "has_day_without_birds": false
}
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
jq Exercism

Час розпочати Підрахунок птахів?

Зареєструйтеся на Exercism, щоб вивчати й опановувати jq, а також 12 концепцій75 вправ та справжнє наставництво від людей, і все це безкоштовно.