Треки
/
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 вправ та справжнє наставництво від людей, і все це безкоштовно.