Échiquier

Échiquier

Exercice d'apprentissage

Introduction

Imagine que tu veuilles tous les entiers positifs ou nuls jusqu'à 1000. Il serait ridicule de devoir les saisir un par un dans un tableau.

Pour cela, on dispose du type range :

julia> 0:1000
0:1000

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

Les ranges sont très courants : non seulement pour t'éviter de tout saisir, mais aussi comme types de retour des fonctions.

Note que les ranges ne sont pas des vecteurs. Ce ne sont qu'un ensemble d'instructions permettant de générer une séquence (évaluation « paresseuse », ou un « itérateur »).

Si tu as besoin d'un range sous forme de vecteur, utilise la fonction collect() pour le convertir :

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

On peut préciser le pas, ici 0,3 :

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

La syntaxe est donc start:stepsize:stop. Les deux bornes sont incluses, comme on le voit dans l'exemple avec des entiers. Si le pas ne divise pas exactement stop - start, le dernier élément ne dépassera pas stop.

Les ranges de lettres

On peut aussi utiliser des séquences non numériques dans les ranges. L'exemple le plus simple est celui des lettres 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)

Le type Char sera abordé plus en détail dans un autre concept. Pour l'instant, considère simplement ces valeurs comme des caractères isolés entre apostrophes.

Fonctions et opérateurs pour les ranges

Vérifie les bornes d'un range avec first() et last().

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

En savoir plus sur l'indexation des vecteurs

On peut indexer un vecteur avec des ranges d'entiers ou avec un autre vecteur :

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]

Instructions

En passionné d'échecs, tu aimerais écrire ta propre version du jeu. Oui, il existe sans doute déjà plein d'implémentations d'échecs en ligne, mais la tienne sera unique !

Mais avant de laisser libre cours à ton imagination, il faut d'abord s'occuper des bases. Commençons par générer le plateau.

Chaque case de l'échiquier est identifiée par un couple lettre-nombre. Les lignes verticales de cases, appelées colonnes, sont étiquetées de A à H. Les lignes horizontales de cases, appelées rangées, sont numérotées de 1 à 8.

1. Définis l'intervalle des rangées

Implémente la fonction rank_range(). Elle doit renvoyer un intervalle d'entiers, de 1 à 8.

julia> rank_range()
# output omitted

2. Définis l'intervalle des colonnes

Implémente la fonction file_range(). Elle doit renvoyer un intervalle de caractères, de la lettre majuscule A à la lettre majuscule H.

julia> file_range()
# output omitted

3. Transforme l'intervalle des rangées en un vecteur de rangées

Implémente la fonction ranks(). Elle doit renvoyer un vecteur d'entiers, de 1 à 8. N'écris pas le vecteur à la main, génère-le à partir de l'intervalle renvoyé par la fonction rank_range().

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

4. Transforme l'intervalle des colonnes en un vecteur de colonnes

Implémente la fonction files. Elle doit renvoyer un vecteur de caractères, de 'A' à 'H'. N'écris pas le vecteur à la main, génère-le à partir de l'intervalle renvoyé par la fonction file_range().

julia> files()
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Julia Exercism

Prêt à commencer Échiquier ?

Inscris-toi sur Exercism pour apprendre et maîtriser Julia avec 35 concepts128 exercices, et un vrai mentorat humain, le tout gratuitement.