Уявімо, що нам потрібні всі невідʼємні цілі числа до 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]
Як шанувальники шахів, ми хочемо написати власну версію цієї гри. Так, можливо, в інтернеті вже є чимало реалізацій шахів, але наша буде неповторною!
Але перш ніж дати волю уяві, треба подбати про основи. Почнімо з генерації дошки.
Кожна клітинка шахової дошки має позначення з літери та числа. Вертикальні стовпці клітинок, які називають вертикалями, позначені літерами від A до H. Горизонтальні рядки клітинок, які називають горизонталями, пронумеровані від 1 до 8.
Реалізуйте функцію rank_range(). Вона має повертати діапазон цілих чисел від 1 до 8.
julia> rank_range()
# output omitted
Реалізуйте функцію file_range().
Вона має повертати діапазон символів від великої літери A до великої літери H.
julia> file_range()
# output omitted
Реалізуйте функцію ranks(). Вона має повертати вектор цілих чисел від 1 до 8.
Не прописуйте вектор вручну, а згенеруйте його з діапазону, який повертає функція rank_range().
julia> ranks()
[1, 2, 3, 4, 5, 6, 7, 8]
Реалізуйте функцію files. Вона має повертати вектор символів від 'A' до 'H'.
Не прописуйте вектор вручну, а згенеруйте його з діапазону, який повертає функція file_range().
julia> files()
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
Зареєструйтеся на Exercism, щоб вивчати й опановувати Julia, а також 35 концепцій128 вправ та справжнє наставництво від людей, і все це безкоштовно.