Ein vector in Clojure ist eine sequenzielle, indizierte, unveränderliche Sammlung von null oder mehr Werten. Das heißt: Sobald ein Vektor erstellt wurde, kann er nicht mehr geändert werden. Funktionen, die auf Vektoren arbeiten, geben einen neuen Vektor zurück, während der ursprüngliche Vektor unverändert bleibt. Die Werte in einem Vektor können unterschiedliche Typen haben. Vektoren kannst du so definieren:
(def empty [])
(def single-value [5])
(def single-value-alternative (vector 5))
(def three-values [1 "a" "b"])
Elemente kannst du über einen Index aus einem Vektor abrufen. Clojure-Vektoren sind nullbasiert, das heißt, der Index des ersten Elements ist immer null:
(def numbers [2 3 5])
;; Read value from vector
(get numbers 2)
;;=> 5
;; Update value in vector
(assoc numbers 2 9)
;;=> [2 3 9]
Der ursprüngliche Vektor bleibt unverändert:
numbers
;;=> [2 3 5]
Um den aktualisierten Wert zu behalten, musst du ihn weitergeben oder in einer Var festhalten:
(def updated-numbers
(assoc numbers 2 9))
(get updated-numbers 2)
;;=> 9
Du bist ein begeisterter Vogelbeobachter und behältst im Blick, wie viele Vögel in den letzten sieben Tagen deinen Garten besucht haben.
Du hast sechs Aufgaben, die sich alle mit der Anzahl der Vögel befassen, die deinen Garten besucht haben.
Zu Vergleichszwecken hast du immer eine Kopie der Zählungen der letzten Woche in der Nähe, und zwar: 0, 2, 5, 3, 7, 8 und 4. Erstelle einen Vektor, der die Zählungen der letzten Woche enthält:
last-week
;;=> [0 2 5 3 7 8 4]
Implementiere die Funktion today, die zurückgibt, wie viele Vögel heute deinen Garten besucht haben. Die Vogelzählungen sind nach Tagen geordnet, wobei das erste Element die Zählung des ältesten Tages und das letzte Element die heutige Zählung ist.
(def birds-per-day [2 5 0 7 4 1])
(today birds-per-day)
;;=> 1
Implementiere die Funktion inc-bird, um die heutige Zählung zu erhöhen:
(inc-bird birds-per-day)
;;=> [2 5 0 7 4 2]
Implementiere die Prädikatfunktion day-without-birds?, die true zurückgibt, wenn es einen Tag gab, an dem null Vögel den Garten besucht haben; andernfalls gib false zurück:
(day-without-birds? birds-per-day)
;;=> true
Implementiere die Funktion n-days-count, die die Anzahl der Vögel zurückgibt, die deinen Garten seit Beginn der Woche besucht haben, aber begrenze die Zählung auf die angegebene Anzahl von Tagen ab Beginn der Woche.
(n-days-count birds-per-day 4)
;;=> 14
Manche Tage sind geschäftiger als andere. Ein geschäftiger Tag ist einer, an dem fünf oder mehr Vögel deinen Garten besucht haben.
Implementiere die Funktion busy-days, die die Anzahl der geschäftigen Tage zurückgibt:
(busy-days birds-per-day)
;;=> 2
Im letzten Jahr hast du festgestellt, dass einige Wochen demselben seltsamen Muster folgen, bei dem die Zählungen zwischen einem und null besuchenden Vögeln wechseln. Implementiere die Funktion odd-week?, die true zurückgibt, wenn das Vogelzählungsmuster dieser Woche dem seltsamen Muster entspricht:
(odd-week? [1 0 1 0 1 0 1])
;;=> true
Melde dich bei Exercism an, um Clojure mit 12 Konzepte105 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.