vector у Clojure - це послідовна, індексована та незмінна колекція з нуля або більше значень. Це означає, що після створення вектора його вже не можна змінити. Функції, які працюють із векторами, повертають новий вектор, а початковий вектор залишається незмінним. Значення у векторі можуть бути різнорідних типів. Вектори можна визначати так:
(def empty [])
(def single-value [5])
(def single-value-alternative (vector 5))
(def three-values [1 "a" "b"])
Елементи вектора можна отримати за індексом. Вектори в Clojure мають нульову індексацію, тобто індекс першого елемента завжди дорівнює нулю:
(def numbers [2 3 5])
;; Read value from vector
(get numbers 2)
;;=> 5
;; Update value in vector
(assoc numbers 2 9)
;;=> [2 3 9]
Початковий вектор залишається незмінним:
numbers
;;=> [2 3 5]
Щоб запамʼятати оновлене значення, потрібно передати його далі або зберегти у var:
(def updated-numbers
(assoc numbers 2 9))
(get updated-numbers 2)
;;=> 9
Ми завзяті спостерігачі за птахами й ретельно записуємо, скільки птахів відвідало наш сад за останні сім днів.
У нас шість завдань, і всі вони стосуються кількості птахів, що відвідали наш сад.
Для порівняння ми завжди тримаємо напохваті копію підрахунків за минулий тиждень, а саме: 0, 2, 5, 3, 7, 8 і 4. Створіть вектор із підрахунками минулого тижня:
last-week
;;=> [0 2 5 3 7 8 4]
Реалізуйте функцію today, щоб вона повертала кількість птахів, які відвідали наш сад сьогодні. Підрахунки птахів упорядковано за днями: перший елемент показує кількість за найдавніший день, а останній - за сьогодні.
(def birds-per-day [2 5 0 7 4 1])
(today birds-per-day)
;;=> 1
Реалізуйте функцію inc-bird, щоб збільшити сьогоднішній підрахунок на одиницю:
(inc-bird birds-per-day)
;;=> [2 5 0 7 4 2]
Реалізуйте функцію-предикат day-without-birds?, яка повертає true, якщо був день, коли до саду не прилетів жоден птах; інакше повертається false:
(day-without-birds? birds-per-day)
;;=> true
Реалізуйте функцію n-days-count, яка повертає кількість птахів, що відвідали наш сад від початку тижня, обмежену вказаною кількістю днів від початку тижня.
(n-days-count birds-per-day 4)
;;=> 14
Деякі дні бувають насиченішими за інші. Насичений день - це день, коли до нашого саду прилетіло пʼять або більше птахів.
Реалізуйте функцію busy-days, щоб вона повертала кількість насичених днів:
(busy-days birds-per-day)
;;=> 2
За останній рік ми помітили, що деякі тижні мають ту саму непарну закономірність, коли кількість птахів чергується між одиницею та нулем. Реалізуйте функцію odd-week?, яка повертає true, якщо закономірність підрахунку птахів цього тижня збігається з непарною закономірністю:
(odd-week? [1 0 1 0 1 0 1])
;;=> true
Зареєструйтеся на Exercism, щоб вивчати й опановувати Clojure, а також 12 концепцій105 вправ та справжнє наставництво від людей, і все це безкоштовно.