المسارات
/
R
R
/
التمارين
/
مراقب الطيور
مراقب الطيور

مراقب الطيور

تمرين تعلّمي

مقدمة

هذا مفهوم كبير في R. ولكي نستوعب الاحتمالات الممكنة، قد يفيدنا أن نتأمل أبعاد المدخل والمخرج في مختلف الدوال.

مدخل متجهي، مخرج قياسي

رأينا بالفعل دوالًّا تأخذ متجهًا وتُرجع قيمة واحدة شبيهة بالقيم القياسية:

> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15

وتندرج دوال إحصائية كثيرة أيضًا ضمن هذه الفئة، مثل mean().

أما المتجهات المنطقية، فلدينا all() وany().

مدخل متجهي، مخرج متجهي

تعمل دوال كثيرة في R على متجهات كاملة، وكثيرًا ما تعطي مخرجات متجهية. ويشمل ذلك معظم الدوال الرياضية:

> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5

وهذا ليس مجرد أسلوب موجز ومريح يغنيك عن الحلقات أو استيعاب القوائم أو الاستدعاء الذاتي، وهي أساليب شائعة في لغات أخرى. وفي R، غالبًا ما تعمل الدوال المتجهية أسرع بكثير من تلك الأساليب.

ولترتيب متجه، لدينا sort() لإرجاع القيم وorder() لإرجاع الفهارس:

> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am"    "I"     "in"    "not"   "order"
> order(v)
#> [1] 2 1 4 3 5

الترتيب الافتراضي تصاعدي. حدّد decreasing = TRUE عند الحاجة، أو استخدم rev() لعكس متجه موجود.

v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not"   "in"    "I"     "am"

rev(1:4)
#> [1] 4 3 2 1

وهناك أيضًا دوال تنتج مخرجات متجهية تراكمية، إذ تعمل على متجه المدخل من اليسار إلى اليمين:

> cumsum(1:5)
#> [1]  1  3  6 10 15  # sums
> cumprod(1:5)
#> [1]   1   2   6  24 120 # equivalent to factorials

مدخل متعدد المتجهات، مخرج متجهي

ويمكن أيضًا استخدام امتداد لهذا المفهوم لمقارنة المتجهات. على سبيل المثال، تأمل دالة القيمة العظمى لكل زوج pmax():

> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison

التعليمات

أنت مراقب طيور شغوف يتابع عدد الطيور التي زارت حديقتك خلال الأيام السبعة الماضية.

أمامك ست مهام، وكلها تتعلق بأعداد الطيور التي زارت حديقتك.

1. تحقّق من عدد الطيور التي زارت اليوم

نفّذ الدالة today() لتُرجع عدد الطيور التي زارت حديقتك اليوم. أعداد الطيور مرتبة حسب اليوم، بحيث يكون العنصر الأول عدد أقدم يوم، والعنصر الأخير عدد اليوم الحالي.

birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1

2. زد عدد اليوم

نفّذ الدالة increment_todays_count() لزيادة عدد اليوم:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)

3. تحقّق مما إذا كان هناك يوم بلا طيور زائرة

نفّذ الدالة has_day_without_birds() التي تُرجع TRUE إذا كان هناك يوم لم تزر فيه أي طيور الحديقة؛ وإلا فتُرجع FALSE:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true

4. احسب عدد الطيور الزائرة خلال أول عدد من الأيام

نفّذ الدالة count_for_first_days() التي تُرجع عدد الطيور التي زارت حديقتك منذ بداية الأسبوع، لكن اقتصر العدد على عدد الأيام المحدد من بداية الأسبوع.

birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14

5. احسب عدد الأيام المزدحمة

بعض الأيام أكثر ازدحامًا من غيرها. اليوم المزدحم هو الذي زارت فيه خمسة طيور أو أكثر حديقتك. نفّذ الدالة busy_days() لتُرجع عدد الأيام المزدحمة:

birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2

6. احسب المجموع التراكمي لزيارات الطيور خلال الأسبوع الماضي

أنت فضولي لمعرفة العدد الإجمالي للطيور التي زارت حتى الآن هذا الأسبوع. احسب المجاميع التراكمية لكل يوم.

running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1]  7 13 18 22 25 27 28

7. رتّب أسماء الأيام حسب مدى ازدحامها

تشك أن زيارات الطيور تتأثر بأنماط حركة المرور على الطرق القريبة، فتختلف في عطلة نهاية الأسبوع عنها في أيام الأسبوع.

رتّب اختصارات الأيام بترتيب تنازلي حسب عدد الطيور التي زارت.

day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
R Exercism

مستعد لبدء مراقب الطيور؟

سجّل في Exercism لتتعلّم وتتقن R عبر 21 مفهومًا111 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.