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.
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'
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
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 |
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'
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)
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.
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'
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"
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'
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!"
Inscris-toi sur Exercism pour apprendre et maîtriser Crystal avec 26 concepts142 exercices, et un vrai mentorat humain, le tout gratuitement.