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

مراقب الطيور

تمرين تعلّمي

مقدمة

المصفوفات

array في F# هي مجموعة قابلة للتغيير مكوَّنة من صفر أو أكثر من القيم وذات طول ثابت. وهذا يعني أنه بمجرد إنشاء المصفوفة، لا يمكن أن يتغير حجمها، لكن يمكن أن تتغير قيمها. ويجب أن تكون جميع القيم في المصفوفة من النوع نفسه. ويمكن تعريف المصفوفات كما يلي:

let empty = [| |]
let emptyAlternative = Array.empty

let singleValue = [| 5 |]
let singleValueAlternative = Array.singleton 5

let threeValues = [| "a"; "b"; "c" |]

يمكن إسناد العناصر إلى المصفوفة أو استرجاعها منها باستخدام فهرس. ومصفوفات F# مفهرسة بدءًا من الصفر، بمعنى أن فهرس العنصر الأول يساوي صفرًا دائمًا:

let numbers = [| 2; 3; 5 |]

// Update value in array
numbers[2] <- 9

// Read value from array
numbers[2]
// => 9

تتم معالجة المصفوفات إما بدوال وعوامل معرَّفة في وحدة Array، أو يدويًا باستخدام مطابقة الأنماط عبر نمط المصفوفة:

let describe array =
    match array with
    | [| |] -> "Empty"
    | [| 1; 2; three |] -> sprintf "1, 2, %d" three
    | _ -> "Other"

describe [| |]         // => "Empty"
describe [| 1; 2; 4 |] // => "1, 2, 4"
describe [| 5; 7; 9 |] // => "Other"

يمكنك أيضًا تجاهل قيمة أثناء مطابقة الأنماط؛ فعندما لا تهمّك قيمة في حالة معينة (أي أنك لن تستخدم القيمة) يمكنك استخدام الشرطة السفلية ('_') للدلالة على ذلك:

let describe array =
    match array with
    | [| |] -> "Empty array"
    | [| x |] -> "Array with one item"
    | [| _; y |] -> "Array with two items (first item ignored)"
    | _ -> "Array with many items (all items ignored)"

describe [| |]          // => "Empty array"
describe [| 1 |]        // => "Array with one item"
describe [| 5; 7 |]     // => "Array with two items (first item ignored)"
describe [| 5; 7; 9 |]  // => "Array with many items (all items ignored)"

يجب أن تأتي الشرطة السفلية الواحدة '_' دائمًا في النهاية عند مطابقة الأنماط، فأي قيمة لا تطابق أيًّا من الحالات الأخرى ستُعالَج بهذه الحالة.

التعليمات

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

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

1. تحقّق من أعداد الأسبوع الماضي

لأغراض المقارنة، تحتفظ دائمًا بنسخة من أعداد الأسبوع الماضي في متناول يدك، وهي: 0، 2، 5، 3، 7، 8، و4. عرّف ارتباط lastWeek الذي يحتوي على أعداد الأسبوع الماضي:

lastWeek
// => [| 0; 2; 5; 3; 7; 8; 4 |]

2. تحقّق من عدد الطيور التي زارتك أمس

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

yesterday [| 3; 5; 0; 7; 4; 1 |]
// => 4

3. احسب إجمالي عدد الطيور الزائرة

نفّذ دالة total لتُرجع إجمالي عدد الطيور التي زارت حديقتك:

total [| 3; 5; 0; 7; 4; 1 |]
// => 20

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

نفّذ دالة dayWithoutBirds التي تُرجع true إذا كان هناك يوم لم تزره فيه أي طيور؛ وإلا فإنها تُرجع false:

dayWithoutBirds [| 3; 5; 0; 7; 4; 1 |]
// => true

5. زد عدد طيور اليوم

نفّذ دالة incrementTodaysCount لتزيد عدد طيور اليوم وتُرجع الأعداد المحدَّثة:

let birdCount = [| 3; 5; 0; 7; 4; 1 |]
incrementTodaysCount birdCount
// => [| 3; 5; 0; 7; 4; 2 |]

6. تحقّق من وجود أسبوع غير معتاد

خلال العام الماضي، وجدت أن بعض الأسابيع تتكرر فيها الأنماط غير المعتادة ذاتها:

  • في كل يوم زوجي من أيام الأسبوع، لم تكن هناك أي طيور
  • في كل يوم زوجي من أيام الأسبوع، رُصد 10 طيور بالضبط
  • في كل يوم فردي من أيام الأسبوع، رُصد 5 طيور بالضبط

نفّذ دالة unusualWeek التي تُرجع true إذا طابق نمط أعداد الطيور في هذا الأسبوع أحد الأنماط غير المعتادة:

unusualWeek [| 1; 0; 5; 0; 12; 0; 2 |]
// => true

unusualWeek [| 5; 0; 5; 12; 5; 3; 5|]
// => true

(لاحظ أن زوجية الأيام مفهرسة بدءًا من 1، وليس من 0؛ فأول عنصر في المصفوفة يقابل يومًا فرديًا)

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
F# Exercism

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

سجّل في Exercism لتتعلّم وتتقن F# عبر 18 مفهومًا148 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.