Les tableaux sont une structure de données très courante. Il existe d'ailleurs tout un ensemble de méthodes pour les manipuler, notamment pour les trier, les inverser, y insérer des éléments, et bien d'autres choses encore.
Certaines de ces méthodes sont destructives, c'est-à-dire qu'elles modifient le tableau d'origine. D'autres ne le sont pas : elles renvoient un nouveau tableau sans toucher à l'original.
Voici quelques-unes des méthodes les plus courantes pour manipuler les tableaux :
Pour insérer un élément dans un tableau, on peut utiliser la méthode insert, qui prend un indice et un élément en arguments.
L'élément est inséré à l'indice indiqué, et le reste du tableau est décalé vers la droite.
Si l'indice est hors limites, une IndexError est levée.
numbers = [1, 2, 3]
numbers.insert(1, 4)
numbers # => [1, 4, 2, 3]
numbers.insert(5, 5) # => Error: Index out of bounds (IndexError)
Pour supprimer un élément précis d'un tableau, on peut utiliser la méthode delete, qui prend un élément en argument.
La méthode renvoie l'élément qui a été supprimé.
Si l'élément n'est pas présent dans le tableau, la méthode renvoie nil.
numbers = [1, 2, 3]
numbers.delete(2) # => 2
numbers # => [1, 3]
Pour récupérer le premier ou le dernier élément d'un tableau, on peut utiliser les méthodes first et last.
Ces méthodes prennent un argument facultatif qui indique combien d'éléments renvoyer.
C'est plus lisible que d'utiliser l'indice 0 ou -1, ou un intervalle.
Si le tableau est vide, une Enumerable::EmptyError est levée.
numbers = [1, 2, 3]
numbers.first # => 1
numbers.last # => 3
numbers.first(2) # => [1, 2]
numbers.last(2) # => [2, 3]
empty_array = [] of Int32
empty_array.last # => Error: Empty enumerable (Enumerable::EmptyError)
Pour inverser un tableau, on peut utiliser la méthode reverse, qui renvoie un nouveau tableau dont les éléments sont dans l'ordre inverse.
Il est important de noter que reverse renvoie un nouveau tableau et ne modifie pas le tableau d'origine.
Si tu veux modifier le tableau d'origine, ajoute un ! à la fin du nom de la méthode.
numbers = [1, 2, 3]
numbers.reverse # => [3, 2, 1]
numbers # => [1, 2, 3]
numbers.reverse! # => [3, 2, 1]
numbers # => [3, 2, 1]
+)La méthode d'ajout (<<) est utile pour ajouter des objets à un tableau.
En revanche, pour combiner deux tableaux, on peut utiliser l'opérateur +, qui renvoie un nouveau tableau contenant les éléments des deux.
[1, 2] + [3, 4] # => [1, 2, 3, 4]
Si tu ajoutes un tableau à un autre tableau, il est alors ajouté comme un seul élément.
[1, 2] << [3, 4] # => [1, 2, [3, 4]]
Pour vérifier si un tableau est vide, on peut utiliser la méthode empty?, qui renvoie true si le tableau est vide et false sinon.
C'est plus lisible que de comparer la taille du tableau à 0.
[].empty? # => true
[1, 2, 3].empty? # => false
Pour obtenir l'indice d'un élément dans un tableau, on peut utiliser la méthode index, qui prend un élément en argument.
Si l'élément n'est pas présent dans le tableau, la méthode renvoie nil.
numbers = [1, 2, 3]
numbers.index(2) # => 1
Pour connaître le nombre d'éléments d'un tableau, on peut utiliser la méthode size.
numbers = [1, 2, 3]
numbers.size # => 3
Pour compter le nombre de fois qu'un élément est présent dans un tableau, on peut utiliser la méthode count.
fruits = ["apple", "banana", "apple"]
fruits.count("apple") # => 2
fruits.count("banana") # => 1
fruits.count("watermelon") # => 0
Pour trier un tableau, on peut utiliser la méthode sort, qui renvoie un nouveau tableau avec les éléments triés.
Comme pour reverse, cette méthode renvoie un nouveau tableau et ne modifie pas le tableau d'origine.
numbers = [3, 2, 1]
numbers.sort # => [1, 2, 3]
numbers # => [3, 2, 1]
numbers.sort! # => [1, 2, 3]
numbers # => [1, 2, 3]
Chaitana possède un parc d'attractions très populaire. Elle n'a qu'une seule attraction, située au beau milieu d'un parc magnifiquement paysagé : Les Plus Grandes Montagnes Russes du Monde(TM). Même s'il n'y a que cette unique attraction, des gens viennent des quatre coins du monde et font la queue pendant des heures pour avoir la chance de monter dans l'hypercoaster de Chaitana.
Cette attraction a deux files d'attente, chacune représentée par un array :
On t'a demandé d'écrire du code pour mieux gérer les visiteurs du parc. Tu dois implémenter les fonctions suivantes au plus vite, avant que les visiteurs (et ta patronne, Chaitana !) ne s'énervent.
Définis la méthode ColossalCoaster.add_to_queue qui prend 4 arguments <express_queue>, <normal_queue>, <ticket_type>, <person_name> et renvoie la file d'attente appropriée, mise à jour avec le nom de la personne.
<ticket_type> est un Int32 avec 1 == express_queue et 0 == normal_queue.<person_name> est le nom (sous forme de String) de la personne à ajouter à la file d'attente correspondante.express_queue = ["Tony", "Bruce"]
normal_queue = ["RobotGuy", "WW"]
ColossalCoaster.add_to_queue(express_queue, normal_queue, 1, "RichieRich")
# => ["Tony", "Bruce", "RichieRich"]
Une personne est arrivée en retard au parc, mais elle veut rejoindre la file d'attente où ses amis patientent. Sauf qu'elle n'a aucune idée de l'endroit où ils se trouvent, et il n'y a pas de réseau téléphonique pour les appeler.
Définis la méthode ColossalCoaster.find_my_friend qui prend 2 arguments queue et friend_name et renvoie la position dans la file d'attente du nom de la personne.
<queue> est un array des personnes qui font la queue.<friend_name> est le nom de l'ami dont tu dois trouver l'indice (sa place dans la file d'attente).ColossalCoaster.find_my_friend(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve")
# => 1
Maintenant que ses amis ont été trouvés (dans la tâche n° 2 ci-dessus), la personne en retard aimerait les rejoindre à leur place dans la file d'attente.
Définis la méthode ColossalCoaster.add_with_friends qui prend 3 arguments queue, friend_name et person_name.
<queue> est un array des personnes qui font la queue.<friend_name> est le nom de l'ami à la position duquel la personne doit être ajoutée.<person_name> est le nom de la personne à ajouter à cette position d'indice.Renvoie la file d'attente mise à jour avec le nom de la personne arrivée en retard.
ColossalCoaster.add_with_friends(["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], "Steve", "Bucky")
# => ["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]
Tu viens d'apprendre, par la file d'attente, qu'une personne vraiment malveillante bouscule, crie et sème le trouble. Tu dois virer ce malfrat pour mauvais comportement !
Définis la méthode ColossalCoaster.remove_from_queue qui prend 2 arguments queue et person_name.
<queue> est un array des personnes qui font la queue.<person_name> est le nom de la personne à exclure.Renvoie la file d'attente mise à jour, sans le nom de la personne malveillante.
ColossalCoaster.remove_from_queue(["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], "Eltran")
# => ["Natasha", "Steve", "Wanda", "Rocket"]
Pour des raisons administratives, tu dois obtenir tous les noms d'une file d'attente donnée par ordre alphabétique.
Définis la méthode ColossalCoaster.sorted_queue qui prend 1 argument, queue (le array des personnes qui font la queue).
La méthode doit renvoyer une copie triée du array.
ColossalCoaster.sorted_queue(["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
# => ['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']
Inscris-toi sur Exercism pour apprendre et maîtriser Crystal avec 26 concepts142 exercices, et un vrai mentorat humain, le tout gratuitement.