Parcours
/
Crystal
Crystal
/
Exercices
/
La bibliothèque de Luton
La bibliothèque de Luton

La bibliothèque de Luton

Exercice d'apprentissage

Introduction

Char est un type de données en Crystal qui représente un point de code Unicode sur 32 bits. Leur taille les rend économes en mémoire et leur confère des propriétés spécifiques que les String n'ont pas. On les crée à l'aide de guillemets simples (') et ils n'acceptent qu'un seul point de code Unicode à l'intérieur.

'a' # => 'a'
'a'.class # => Char

Il est assez courant de manipuler des Char quand on travaille avec des String en Crystal, car un certain nombre de méthodes de la classe String renvoient des Char ou prennent des Char en argument. Par exemple, la méthode String#[] renvoie un Char, ou la méthode String#chars renvoie une collection de Char.

Incrémentation / Décrémentation

Comme un char représente un point Unicode sur 32 bits, il prend en charge l'incrémentation et la décrémentation, ce qui permet, si tu as 'a', d'obtenir 'b' en ajoutant un.

'a' + 5
# => 'f'

'z' - 25
# => 'a'

Il existe aussi une méthode appelée Char#succ, qui renvoie le char suivant dans la table Unicode, et Char#pred, qui renvoie le char précédent dans la table Unicode.

'a'.succ
# => 'b'

'z'.pred
# => 'y'

Concaténation

Comme les Char ne sont censés représenter qu'un point Unicode sur 32 bits, deux char ne peuvent pas être concaténés. Par conséquent, un Char ne peut être concaténé qu'avec des String.

'a' + "bc"
# => "abc"

'a' + 'b'
# => error: expected argument #1 to 'Char#+' to be Int or String, not Char

Méthodes de propriété

Crystal propose quelques méthodes pour obtenir des informations sur un caractère, par exemple s'il s'agit d'un nombre ou d'une lettre, ou s'il est en majuscule ou en minuscule. Voici une liste de quelques-unes de ces méthodes ; pour la liste complète, consulte l'API de Char :

Method Description
Char#number? Renvoie true si le char est un nombre
Char#letter? Renvoie true si le char est une lettre
Char#lowercase? Renvoie true si le char est en minuscule
Char#uppercase? Renvoie true si le char est en majuscule
Char#ascii? Renvoie true si le char est un caractère ASCII
Char#whitespace? Renvoie true si le char est un caractère d'espacement

Conversion

Conversion entre points de code et Char

Comme un Char est un point Unicode sur 32 bits, on peut convertir un Char en point de code (un Int), et inversement. Pour cela, on peut utiliser la méthode Char#ord, qui renvoie le point de code du char, ou la méthode Int#chr, qui renvoie le char correspondant au point de code.

'a'.ord
# => 97

97.chr
# => 'a'

Conversion entre types

Comme pour les autres types de données, les char disposent de quelques méthodes pour convertir d'un type à un autre. La plus courante est la méthode Char#to_s, qui convertit le char en String. Il existe cependant aussi la méthode Char#to_i, qui convertit le char en Int, et la méthode Char#to_f, qui convertit le char en Float.

'a'.to_s
# => "a"

'4'.to_i
# => 4

'a'.to_i
# => Error: Invalid integer: a (ArgumentError)

Instructions

La bibliothèque de Luton est une grande bibliothèque avec une vaste collection d'ouvrages, allant des livres à l'art. La bibliothèque dispose d'une section où l'on étudie la littérature et où l'on ajoute des livres au système informatique.

Certaines parties visent à être automatisées et on te demande de les aider. Cela va de l'automatisation des formulaires d'inscription au déchiffrement de textes.

1. Récupère la première lettre du titre

Les livres d'une bibliothèque sont censés être faciles à trouver, c'est pourquoi ils sont triés par la première lettre du titre.

Implémente la méthode Library.first_letter, qui prend un argument title, lequel contient le titre du livre. La méthode doit renvoyer la première lettre du titre.

Library.first_letter("Mystery of the Crystal Skull")
# => 'M'

2. Récupère les initiales de l'auteur

La bibliothèque possède beaucoup de livres écrits par différents auteurs. On désigne souvent les auteurs par leurs initiales, c'est pourquoi la bibliothèque a demandé un système qui donne les initiales de l'auteur à partir de son prénom et de son nom. Les initiales doivent être au format suivant : {first_letter_of_first_name}.{first_letter_of_last_name}

Implémente la méthode Library.initials, qui prend deux arguments first_name et last_name, lesquels contiennent le prénom et le nom de famille de l'auteur. La méthode doit renvoyer les initiales de l'auteur.

Library.initials("William", "Shakespeare")
# => "W.S"

3. Déchiffre une lettre

Certains ouvrages sont chiffrés et la bibliothèque possède beaucoup de textes chiffrés. La bibliothèque souhaiterait un nouveau système de déchiffrement pour un chiffrement particulier.

Le chiffrement consiste à prendre une lettre et à la remplacer par la lettre qui la précède dans l'alphabet. Par exemple, a devient z, b devient a, c devient b, et ainsi de suite.

La bibliothèque souhaite qu'il puisse déchiffrer aussi bien les lettres majuscules que les lettres minuscules et conserver la casse de la lettre d'origine.

Implémente la méthode Library.decrypt_character, qui prend un argument character, lequel contient la lettre à déchiffrer. La méthode doit renvoyer la lettre déchiffrée.

Library.decrypt_character('a')
# => 'z'

4. Déchiffre un texte

La bibliothèque souhaiterait aussi déchiffrer un texte entier, avec le chiffrement qui prend la lettre précédente dans l'alphabet.

Le déchiffreur ne doit déchiffrer que les lettres et laisser tous les autres caractères tels quels.

Implémente la méthode Library.decrypt_text, qui prend un argument text, lequel contient le texte à déchiffrer. La méthode doit renvoyer le texte déchiffré.

Library.decrypt_text("Ifmmp Xpsme!")
# => "Hello World!"
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Crystal Exercism

Prêt à commencer La bibliothèque de Luton ?

Inscris-toi sur Exercism pour apprendre et maîtriser Crystal avec 26 concepts142 exercices, et un vrai mentorat humain, le tout gratuitement.