Angenommen, du willst alle nicht-negativen Ganzzahlen bis 1000 haben. Es wäre absurd, wenn du sie alle in ein Array eintippen müsstest.
Dafür gibt es den Typ range:
julia> 0:1000
0:1000
julia> typeof(0:1000)
UnitRange{Int64}
Ranges sind sehr verbreitet: nicht nur, um dir Tipparbeit zu sparen, sondern auch als Rückgabetypen von Funktionen.
Beachte, dass Ranges keine Vektoren sind. Sie sind nur eine Reihe von Anweisungen, um eine Sequenz zu erzeugen (eine „lazy“ Auswertung, also ein „Iterator“).
Wenn du eine Range als Vektor brauchst, wandelst du sie mit der Funktion collect() um:
julia> collect(0:5)
6-element Vector{Int64}:
0
1
2
3
4
5
Die Schrittweite lässt sich angeben, in diesem Fall 0.3:
julia> collect(1.0:0.3:2.0)
4-element Vector{Float64}:
1.0
1.3
1.6
1.9
Die Syntax ist also start:stepsize:stop.
Beide Endpunkte sind inklusiv, wie im Ganzzahl-Beispiel zu sehen.
Wenn die Schrittweite stop - start nicht genau teilt, überschreitet das letzte Element stop nicht.
In Ranges lassen sich auch nicht-numerische Sequenzen verwenden. Das einfachste Beispiel sind ASCII-Buchstaben:
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)
Der Typ Char wird in einem anderen Konzept ausführlicher behandelt.
Betrachte diese vorerst einfach als einzelne Zeichen in einfachen Anführungszeichen.
Mit first() und last() kannst du die Grenzen einer Range prüfen.
r = 1:10 # => 1:10
first(r) # => 1
last(r) # => 10
Ganzzahl-Ranges und Vektoren kannst du zum Indexieren von Vektoren verwenden:
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]
Als Schachfan würdest du gerne deine eigene Version des Spiels schreiben. Ja, es gibt online vielleicht schon jede Menge Schach-Implementierungen, aber deine wird einzigartig sein!
Doch bevor du deiner Fantasie freien Lauf lassen kannst, musst du dich um die Grundlagen kümmern. Fangen wir damit an, das Brett zu erzeugen.
Jedes Feld des Schachbretts wird durch ein Buchstaben-Zahlen-Paar identifiziert. Die senkrechten Spalten der Felder heißen Linien und sind mit A bis H beschriftet. Die waagerechten Zeilen der Felder heißen Reihen und sind mit 1 bis 8 nummeriert.
Implementiere die Funktion rank_range(). Sie sollte einen Bereich von Ganzzahlen von 1 bis 8 zurückgeben.
julia> rank_range()
# output omitted
Implementiere die Funktion file_range().
Sie sollte einen Bereich von Zeichen zurückgeben, vom Großbuchstaben A bis zum Großbuchstaben H.
julia> file_range()
# output omitted
Implementiere die Funktion ranks(). Sie sollte einen Vektor von Ganzzahlen von 1 bis 8 zurückgeben.
Schreibe den Vektor nicht von Hand, sondern erzeuge ihn aus dem Bereich, den die Funktion rank_range() zurückgibt.
julia> ranks()
[1, 2, 3, 4, 5, 6, 7, 8]
Implementiere die Funktion files. Sie sollte einen Vektor von Zeichen von 'A' bis 'H' zurückgeben.
Schreibe den Vektor nicht von Hand, sondern erzeuge ihn aus dem Bereich, den die Funktion file_range() zurückgibt.
julia> files()
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.