Supponi di volere tutti i numeri interi non negativi fino a 1000. Sarebbe assurdo doverli digitare uno per uno in un array.
Per questo abbiamo il tipo range:
julia> 0:1000
0:1000
julia> typeof(0:1000)
UnitRange{Int64}
Gli intervalli sono molto comuni: non solo per risparmiarti di digitare, ma anche come tipi restituiti dalle funzioni.
Nota che gli intervalli non sono vettori. Sono solo un insieme di istruzioni per generare una sequenza (una valutazione «lazy», o un «iteratore»).
Se ti serve un intervallo sotto forma di vettore, usa la funzione collect() per convertirlo:
julia> collect(0:5)
6-element Vector{Int64}:
0
1
2
3
4
5
Si può specificare il passo, in questo caso 0.3:
julia> collect(1.0:0.3:2.0)
4-element Vector{Float64}:
1.0
1.3
1.6
1.9
Quindi la sintassi è start:stepsize:stop.
Entrambi i limiti sono inclusi, come si vede nell'esempio con i numeri interi.
Se il passo non divide esattamente stop - start, l'ultimo elemento eviterà di superare stop.
Negli intervalli si possono usare anche sequenze non numeriche. L'esempio più semplice sono le lettere 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)
Il tipo Char sarà trattato più in dettaglio in un altro concetto.
Per ora, trattali semplicemente come singoli caratteri tra virgolette singole.
Controlla i limiti di un intervallo con first() e last().
r = 1:10 # => 1:10
first(r) # => 1
last(r) # => 10
Gli intervalli di numeri interi e i vettori si possono usare nell'indicizzazione dei vettori:
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]
Da appassionato di scacchi, ti piacerebbe scrivere la tua versione del gioco. Sì, online ci sono già tante implementazioni di scacchi, ma la tua sarà unica!
Ma prima di dare libero sfogo alla fantasia, devi occuparti delle basi. Iniziamo generando la scacchiera.
Ogni casella della scacchiera è identificata da una coppia lettera-numero. Le colonne verticali di caselle, chiamate file, sono contrassegnate dalla A alla H. Le righe orizzontali di caselle, chiamate rank, sono numerate da 1 a 8.
Implementa la funzione rank_range(). Deve restituire un intervallo di numeri interi, da 1 a 8.
julia> rank_range()
# output omitted
Implementa la funzione file_range().
Deve restituire un intervallo di caratteri, dalla lettera maiuscola A alla lettera maiuscola H.
julia> file_range()
# output omitted
Implementa la funzione ranks(). Deve restituire un array di numeri interi, da 1 a 8.
Non scrivere l'array a mano: generalo dall'intervallo restituito dalla funzione rank_range().
julia> ranks()
[1, 2, 3, 4, 5, 6, 7, 8]
Implementa la funzione files. Deve restituire un array di caratteri, da 'A' a 'H'.
Non scrivere l'array a mano: generalo dall'intervallo restituito dalla funzione file_range().
julia> files()
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
Iscriviti a Exercism per imparare e padroneggiare Julia con 35 concetti128 esercizi e il mentoring di persone reali, tutto gratis.