مسیرها
/
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] پنج عنصر را از اندیس ۱۰ به بعد برمی‌گرداند؛ اندیس پایان لحاظ نمی‌شود.

چند تابع کمکی هم وجود دارد:

  • 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) یک مقدار منطقی برمی‌گردانند که آیا هیچ‌کدام یا همه‌ی عناصر آرایه شرط را برآورده می‌کنند یا نه.

    [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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.