مسیرها
/
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. بررسی یک هفته‌ی غیرعادی

در طول یک سال گذشته دریافته‌اید که برخی هفته‌ها الگوهای غیرعادی یکسانی دارند:

  • در هر روز زوج هفته، هیچ پرنده‌ای نبود
  • در هر روز زوج هفته، دقیقاً ۱۰ پرنده دیده می‌شد
  • در هر روز فرد هفته، دقیقاً ۵ پرنده دیده می‌شد

تابع unusualWeek را پیاده‌سازی کنید که اگر الگوی شمارش پرنده‌های این هفته با یکی از الگوهای غیرعادی مطابقت داشته باشد، true را برمی‌گرداند:

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

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

(توجه کنید که زوج یا فرد بودن روزها بر پایه‌ی شماره‌گذاری از ۱ است، نه از ۰؛ اولین عنصر آرایه مربوط به یک روز فرد است)

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
F# Exercism

آماده‌اید پرنده‌نگر را شروع کنید؟

در Exercism ثبت‌نام کنید تا F# را همراه با 18 مفهوم148 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.