Tracks
/
Julia
Julia
/
Übungen
/
Schachbrett
Schachbrett

Schachbrett

Lernübung

Einführung

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.

Ranges aus Buchstaben

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.

Funktionen und Operatoren für Ranges

Mit first() und last() kannst du die Grenzen einer Range prüfen.

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

Mehr zur Vektorindizierung

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]

Anleitung

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.

1. Definiere den Bereich der Reihen

Implementiere die Funktion rank_range(). Sie sollte einen Bereich von Ganzzahlen von 1 bis 8 zurückgeben.

julia> rank_range()
# output omitted

2. Definiere den Bereich der Linien

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

3. Wandle den Bereich der Reihen in einen Vektor von Reihen um

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]

4. Wandle den Bereich der Linien in einen Vektor von Linien um

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']
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Julia Exercism

Bereit, mit Schachbrett zu starten?

Melde dich bei Exercism an, um Julia mit 35 Konzepte128 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.