Parcours
/
Crystal
Crystal
/
Exercices
/
Les montagnes russes colossales de Chaitana
Les montagnes russes colossales de Chaitana

Les montagnes russes colossales de Chaitana

Exercice d'apprentissage

Introduction

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 :

insert

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)

delete

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]

first & last

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)

reverse

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]

Concat(+)

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]]

empty?

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

index

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

size

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

count

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

sort

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]

Instructions

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 :

  1. File normale
  2. File express (aussi appelée Fast-track) - où les gens paient un supplément pour un accès prioritaire.

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.

1. Ajoute une personne à la file d'attente

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.

  1. <ticket_type> est un Int32 avec 1 == express_queue et 0 == normal_queue.
  2. <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"]

2. Où sont mes amis ?

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.

  1. <queue> est un array des personnes qui font la queue.
  2. <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

3. Puis-je les rejoindre ?

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.

  1. <queue> est un array des personnes qui font la queue.
  2. <friend_name> est le nom de l'ami à la position duquel la personne doit être ajoutée.
  3. <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"]

4. Une personne malveillante dans la file d'attente

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.

  1. <queue> est un array des personnes qui font la queue.
  2. <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"]

5. Trie la liste de la file d'attente

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']
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Crystal Exercism

Prêt à commencer Les montagnes russes colossales de Chaitana ?

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