棋盘

棋盘

学习练习

简介

假设你想要 1000 以内的所有非负整数。 如果要把它们一个个敲进数组里,那就太荒唐了。

为此,我们有range类型:

julia> 0:1000
0:1000

julia> typeof(0:1000)
UnitRange{Int64}

区间非常常见:不仅是为了省去你手动输入的麻烦,也常常作为函数的返回类型。

注意,区间并不是向量。 它们只是一组用来生成序列的指令(也就是“惰性”求值,或者说“迭代器”)。

如果你需要把区间当作向量使用,就用collect()函数来转换:

julia> collect(0:5)
6-element Vector{Int64}:
 0
 1
 2
 3
 4
 5

还可以指定步长,这里是 0.3:

julia>  collect(1.0:0.3:2.0)
4-element Vector{Float64}:
 1.0
 1.3
 1.6
 1.9

所以语法是start:stepsize:stop。 正如整数示例中所见,两个端点都是_包含_的。 如果步长不能整除stop - start,最后一个元素就不会超过stop。

字母区间

区间中也可以使用非数字序列。 最简单的例子是 ASCII 字母:

julia> 'a':'d'
'a':1:'d'

julia> typeof('a':'d')
StepRange{Char, Int64}

julia> collect('a':'d')
4-element Vector{Char}:
 'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
 'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
 'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)

Char类型会在另一个概念中更详细地讲解。 现在,只需把它们当作单引号里的单个字符即可。

区间相关的函数和运算符

用first()和last()查看区间的端点。

 r = 1:10  # => 1:10
 first(r)  # => 1
 last(r)   # => 10

关于向量下标的更多内容

整数区间和向量都可以用在向量下标中:

nums = collect(10.0:50.0)
nums[3:2:7]  # gives [12.0, 14.0, 16.0]
nums[ [3, 5, 7] ] # also gives [12.0, 14.0, 16.0]

说明

作为一名国际象棋爱好者,你很想写出属于自己的版本。没错,网上可能已经有很多现成的国际象棋实现了,但你的版本会独一无二!

不过,在放飞想象力之前,得先把基础打好。我们就从生成棋盘开始吧。

棋盘上的每一格都由一个字母与数字的组合来标识。竖直方向的一列格子称为 file,用字母 A 到 H 标记;水平方向的一行格子称为 rank,用数字 1 到 8 编号。

1. 定义 rank 范围

实现rank_range()函数,它应该返回一个整数范围,从 1 到 8。

julia> rank_range()
# output omitted

2. 定义 file 范围

实现file_range()函数,它应该返回一个字符范围,从大写字母 A 到大写字母 H。

julia> file_range()
# output omitted

3. 将 rank 范围转换成 rank 向量

实现ranks()函数,它应该返回一个整数向量,从 1 到 8。不要手动写出这个向量,而是用rank_range()函数返回的范围来生成它。

julia> ranks()
[1, 2, 3, 4, 5, 6, 7, 8]

4. 将 file 范围转换成 file 向量

实现files函数,它应该返回一个字符向量,从 'A' 到 'H'。不要手动写出这个向量,而是用file_range()函数返回的范围来生成它。

julia> files()
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Julia Exercism

准备好开始 棋盘 了吗?

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