Parcours
/
Ruby
Ruby
/
Exercices
/
Port de Palerme
Port de Palerme

Port de Palerme

Exercice d'apprentissage

Introduction

Les symboles sont des identifiants nommés qui permettent de faire référence à une valeur. Les symboles sont créés au moyen d'un littéral de symbole, qui consiste à faire précéder un nom du caractère :, par exemple :foo. Ils peuvent aussi s'écrire entre guillemets, par exemple :"foo", ce qui permet par exemple d'avoir des espaces dans le nom.

:foo # => :foo
:"foo boo" # => :"foo boo"

Les symboles s'utilisent à de nombreux endroits du langage, notamment comme clés de hash, pour représenter des noms de méthodes et de variables.

Identifiant

Ce qui distingue les symboles des strings, c'est qu'ils sont des identifiants et ne représentent ni des données ni du texte. Cela signifie que deux symboles portant le même nom sont toujours le même objet.

"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748

Modifie les symboles

Les symboles sont immuables, ce qui signifie qu'on ne peut pas les modifier. Cela signifie que quand on « modifie » un symbole, on crée en réalité un nouveau symbole. Il existe quelques méthodes qui permettent de manipuler les symboles ; elles renvoient toutes de nouveaux symboles. Toutes ces méthodes sont répertoriées dans l'API Symbol.

:foo.upcase # => :FOO

:foo.object_id # => 1086748
:foo.upcase.object_id # => 60

Le fait que les symboles soient immuables présente l'avantage qu'ils sont plus économes en mémoire que les strings, mais aussi plus sûrs à utiliser comme identifiants.

Conversion

Les symboles peuvent être convertis en strings, et inversement. Cela peut être utile lorsque tu veux modifier un symbole, ou lorsque tu veux utiliser un symbole comme string. Pour présenter une string comme un symbole, tu peux utiliser la méthode String#to_sym ; pour faire l'inverse, tu peux utiliser la méthode Symbol#to_s. Comme les symboles ne disposent que d'un ensemble limité de méthodes, il peut être utile de convertir un symbole en string pour lui appliquer des méthodes de string, si l'on a besoin d'un nouveau symbole.

:foo.to_s # => "foo"
"foo".to_sym # => :foo

Instructions

Le port de Palerme est un port très fréquenté, où de nombreux navires vont et viennent. Depuis longtemps, il utilise un système manuel pour suivre les navires actuellement présents dans le port. Ce système est très sujet aux erreurs, et le chef du port a décidé de le remplacer par un système informatisé.

Le chef du port t'a engagé pour mettre en place le nouveau système. Le système doit gérer les identifiants des navires, mais aussi ceux des destinations.

1. Crée l'identifiant du port

La première chose à faire est de créer l'identifiant du port de Palerme. L'identifiant est constitué des quatre premières lettres du nom du port, en majuscules.

Définis la constante Port::IDENTIFIER comme un symbole ayant la valeur :PALE.

Port::IDENTIFIER 
# => :PALE

2. Récupère les identifiants d'autres ports

Le programme devra aussi gérer d'autres ports, il te faut donc également créer des identifiants pour eux. Le port aimerait que le système soit automatisé et, comme les ports utilisent des conventions de nommage différentes, les identifiants doivent être générés à partir du nom du port. L'identifiant est constitué des quatre premières lettres du nom du port, en majuscules.

Définis la méthode Port.get_identifier pour qu'elle prenne une string en argument et renvoie l'identifiant de ce port sous forme de symbole.

Port.get_identifier("Hamburg") 
# => :HAMB

3. Détermine à quel terminal un navire doit s'amarrer

Le port possède deux terminaux, et le système doit déterminer à quel terminal un navire doit s'amarrer. Le terminal est déterminé par l'identifiant du navire.

L'identifiant est composé de 2 parties : la première est constituée de 3 lettres majuscules qui indiquent la cargaison transportée par le navire, puis 3 chiffres qui constituent l'identifiant unique du navire.

Si le navire transporte OIL ou GAS, il doit s'amarrer au terminal A. Sinon, le navire doit s'amarrer au terminal B.

Définis la méthode Port.get_terminal pour qu'elle prenne en argument un symbole qui est l'identifiant du navire. La méthode doit renvoyer le terminal sous forme de symbole.

Port.get_terminal(:OIL123)
# => :A
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Ruby Exercism

Prêt à commencer Port de Palerme ?

Inscris-toi sur Exercism pour apprendre et maîtriser Ruby avec 21 concepts121 exercices, et un vrai mentorat humain, le tout gratuitement.