轨道
/
Clojure
Clojure
/
练习
/
观鸟者
观鸟者

观鸟者

学习练习

简介

Clojure 中的vector是一种有序、带索引、不可变的集合,可以包含零个或多个值。也就是说,向量一旦创建,就不能再修改。对向量进行操作的函数会返回一个新的向量,而原来的向量保持不变。向量中的值可以有不同的类型。向量可以这样定义:

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

可以使用下标从向量中取出元素。Clojure 的向量下标从零开始,也就是说第一个元素的下标始终是 0:

(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

说明

你是一位热衷观鸟的爱好者,会记录过去七天里有多少只鸟来过你的花园。

你有六个任务,全都与来过你花园的鸟的数量有关。

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. 计算忙碌天数的数量

有些日子比其他日子更忙。忙碌的一天是指有 5 只或更多鸟来过你花园的日子。 实现busy-days函数,返回忙碌天数的数量:

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

7. 检查是否为奇特的一周

过去一年里,你发现有些星期都呈现出同样奇特的规律:鸟的数量在 1 和 0 之间交替。实现odd-week?函数:如果这周的鸟数量规律符合这个奇特规律,就返回true:

(odd-week? [1 0 1 0 1 0 1])
;;=> true
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Clojure Exercism

准备好开始 观鸟者 了吗?

注册 Exercism,借助 12 个概念105 个练习 和真人导师指导,学习并掌握 Clojure,全部免费。