トラック
/
jq
jq
/
演習
/
鳥の数え上げ
鳥の数え上げ

鳥の数え上げ

学習演習

はじめに

配列

JSONは配列を次のように定義しています。

配列は、順序付けられた値の集まりです。 配列は左角括弧([)で始まり、右角括弧(])で終わります。 値はコンマ(,)で区切られます。

配列には、_あらゆる種類_のJSON値を0個以上入れることができます。 配列の要素がすべて同じ型である必要はありません。

配列の作成

要素を配列にまとめるには、角括弧を使います。

[1, 2, 3]

_ストリーム_の要素は、角括弧で囲むことで配列にまとめることができます。

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

サイズ

length関数は、配列の要素数を返します。

インデックスとスライス

配列のインデックスは0から始まります。

角括弧を使った式で、配列から要素を取り出せます。 .[2]は3番目の要素を取得します。

負のインデックスは、配列の末尾から逆向きに数えます。 .[-1]は最後の要素を取得し、.[-2]は後ろから2番目の要素です。

スライスは、配列の部分列です。 .[10:15]は、インデックス10から始まる5つの要素を返します。終了のインデックスは_含まれません_。

便利な関数もいくつかあります。

  • firstは最初の要素を取得します。
  • lastは最後の要素を取得します。
  • nth(n)はインデックスnの要素を取得します。

繰り返し

jqには、よくある繰り返しの機能をカバーする関数がたくさん用意されています。

  • map(expr)は、exprを各要素に順番に適用した新しい配列を返します。

    [1, 2, 3] | map(. * 10)    # => [10, 20, 30]
    
    
  • select(expr)は、_1つの値_に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)は、配列の要素のいずれか、またはすべてが条件を満たすかどうかを表す真偽値を返します。

    [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
    

説明

あなたは、過去7日間に庭に何羽の鳥が訪れたかを記録している、熱心なバードウォッチャーです。

庭に訪れた鳥の数を扱う、5つのタスクに取り組みます。

1. 先週の記録を確認する

鳥の記録はJSON形式で保存します。 「main」配列には、週ごとの記録の配列が入ります。 各週の記録は7つの整数からなる配列で、1日につき1つの数値が入ります。 新しい週は、いつもmain配列の末尾に追加します。 先週の記録を返すフィルターを実装しましょう。

$ 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. 忙しい日の数を計算する

日によっては、ほかの日より忙しいこともあります。 忙しい日とは、庭に5羽以上の鳥が訪れた日のことです。 今週の忙しい日の数を返すフィルターを実装しましょう。

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

5. 鳥が1羽も訪れなかった日があるか確認する

今週、庭に鳥が1羽も訪れなかった日があればtrueを、そうでなければfalseを返すフィルターを実装しましょう。

$ jq -f bird-count.jq < bird-counting-data.json
{
  ...
  "has_day_without_birds": false
}
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
jq Exercism

鳥の数え上げを始める準備はできましたか?

Exercismに登録すれば、12個のコンセプト75個の演習、そして本物の人間によるメンタリングとともに、jqを学んでマスターできます。すべて無料です。