پرنده‌نگر

پرنده‌نگر

تمرین یادگیری

مقدمه

یک vector در Clojure مجموعه‌ای ترتیبی، اندیس‌دار و تغییرناپذیر از صفر یا بیشتر مقدار است. یعنی وقتی یک vector ساخته شد، دیگر نمی‌توان آن را تغییر داد. توابعی که روی vectorها کار می‌کنند یک vector جدید برمی‌گردانند، در حالی که vector اصلی بدون تغییر باقی می‌ماند. مقادیر داخل یک vector می‌توانند از انواع ناهمگون باشند. vectorها را می‌توان به شکل زیر تعریف کرد:

(def empty [])
(def single-value [5])
(def single-value-alternative (vector 5))
(def three-values [1 "a" "b"])

می‌توان با استفاده از یک اندیس، عناصر را از یک vector بازیابی کرد. vectorهای 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]

vector اصلی بدون تغییر باقی می‌ماند:

numbers
;;=> [2 3 5]

برای به خاطر سپردن مقدار به‌روزشده، باید آن را همراه بفرستیم یا در یک var نگه داریم:

(def updated-numbers
  (assoc numbers 2 9))
(get updated-numbers 2)
;;=> 9

دستورالعمل‌ها

شما یک پرنده‌نگر پرشور هستید که پیگیری می‌کنید در هفت روز گذشته چند پرنده از باغتان بازدید کرده‌اند.

شش وظیفه دارید که همه به تعداد پرندگانی مربوط می‌شوند که از باغ شما بازدید کرده‌اند.

1. بررسی کنید شمارش‌های هفته‌ی گذشته چه بوده‌اند

برای مقایسه، همیشه نسخه‌ای از شمارش‌های هفته‌ی گذشته را کنار دستتان نگه می‌دارید: 0، 2، 5، 3، 7، 8 و 4. یک بردار از شمارش‌های هفته‌ی گذشته بسازید:

last-week
;;=> [0 2 5 3 7 8 4]

2. بررسی کنید امروز چند پرنده بازدید کرده است

تابع today را پیاده‌سازی کنید تا تعداد پرندگانی را برگرداند که امروز از باغ شما بازدید کرده‌اند. شمارش پرنده‌ها بر اساس روز مرتب شده است؛ اولین عنصر شمارش قدیمی‌ترین روز و آخرین عنصر شمارش امروز است.

(def birds-per-day [2 5 0 7 4 1])
(today birds-per-day)
;;=> 1

3. شمارش امروز را یک واحد افزایش دهید

تابع inc-bird را پیاده‌سازی کنید تا شمارش امروز را یک واحد افزایش دهد:

(inc-bird birds-per-day)
;;=> [2 5 0 7 4 2]

4. بررسی کنید آیا روزی بدون بازدید پرنده وجود داشته است

تابع شرطی day-without-birds? را پیاده‌سازی کنید که اگر روزی وجود داشته باشد که صفر پرنده از باغ بازدید کرده باشد، true را برمی‌گرداند؛ در غیر این صورت، false را برمی‌گرداند:

(day-without-birds? birds-per-day)
;;=> true

5. محاسبه‌ی تعداد پرندگان بازدیدکننده در چند روز نخست هفته

تابع n-days-count را پیاده‌سازی کنید که تعداد پرندگانی را برمی‌گرداند که از ابتدای هفته از باغ شما بازدید کرده‌اند، اما شمارش را به تعداد روزهای مشخص‌شده از ابتدای هفته محدود می‌کند.

(n-days-count birds-per-day 4)
;;=> 14

6. محاسبه‌ی تعداد روزهای شلوغ

بعضی روزها شلوغ‌تر از بقیه هستند. روز شلوغ روزی است که پنج پرنده یا بیشتر از باغ شما بازدید کرده باشند. تابع busy-days را پیاده‌سازی کنید تا تعداد روزهای شلوغ را برگرداند:

(busy-days birds-per-day)
;;=> 2

7. بررسی هفته‌ی فرد

در طول یک سال گذشته متوجه شده‌اید که بعضی هفته‌ها الگوی فرد یکسانی دارند، طوری که شمارش‌ها بین یک و صفر پرنده‌ی بازدیدکننده در نوسان است. تابع odd-week? را پیاده‌سازی کنید که اگر الگوی شمارش پرنده‌های این هفته با الگوی فرد مطابقت داشته باشد، true را برمی‌گرداند:

(odd-week? [1 0 1 0 1 0 1])
;;=> true
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Clojure Exercism

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

در Exercism ثبت‌نام کنید تا Clojure را همراه با 12 مفهوم105 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.