المسارات
/
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) قيمة منطقية تحدد ما إذا كان أي من عناصر المصفوفة أو كلها يحقق الشرط.

    [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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.