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]
وللاحتفاظ بالقيمة المحدَّثة، نحتاج إما إلى تمريرها معنا أو حفظها في متغير:
(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 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.