Parcours
/
Julia
Julia
/
Exercices
/
Badges nominatifs
Badges nominatifs

Badges nominatifs

Exercice d'apprentissage

Introduction

De nombreux langages disposent d'un moyen, comme null ou none, pour indiquer une valeur inexistante. Comme Julia est conçu pour traiter de gros volumes de données (souvent désordonnées), il possède plusieurs formes de néant.

L'objectif général est de signaler les valeurs manquantes ou suspectes au moment où on les rencontre, puis de continuer sans lever d'exception.

nothing

Si une valeur n'existe vraiment pas, elle est représentée par nothing. C'est probablement ce qui se rapproche le plus de ce que font C (NULL) ou Python (None).

julia> n = nothing

julia> isnothing(n)
true

julia> typeof(n)
Nothing

nothing est donc une valeur singleton de type Nothing, et on peut la tester.

Un usage courant de nothing est d'être une valeur de retour (ou plutôt une non-valeur) pour les fonctions qu'on n'utilise que pour leurs effets de bord (affichage, configuration réseau, ou autre).

missing

Quand une valeur existe en théorie mais qu'on ne sait pas ce qu'elle est, on utilise missing. Par exemple, lorsqu'on compte les véhicules qui circulent sur une route, il peut arriver que les observateurs humains aient besoin d'une pause, ou que les capteurs automatiques tombent en panne, alors que le trafic continue de s'écouler.

missing est donc un espace réservé, qui avertit les humains qu'ils doivent décider comment gérer ce manque dans les données.

julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
 1
 2
  missing

julia> typeof(mv)
Vector{Union{Missing, Int64}} (alias for Array{Union{Missing, Int64}, 1})

julia> ismissing.(mv)  # broadcast function, displays as 1 for true, 0 for false
3-element BitVector:
 0
 0
 1

Peu d'autres langages intègrent cette fonctionnalité nativement, mais des équivalents proches existent : NA en R ou NULL en SQL.

Les expressions renvoient généralement missing par défaut si des valeurs missing sont présentes. Si tu veux que ces valeurs soient ignorées, utilise la fonction skipmissing() pour le rendre explicite :

julia> mv = [1, 2, missing]
3-element Vector{Union{Missing, Int64}}:
 1
 2
  missing

julia> sum(mv)  # missing in, missing out
missing

julia> skipmissing(mv)
skipmissing(Union{Missing, Int64}[1, 2, missing])

julia> collect(skipmissing(mv))
2-element Vector{Int64}:
 1
 2

julia> sum(skipmissing(mv))  # functions like sum() can work with iterators
3

Comme skipmissing crée un itérateur, il faut l'envelopper dans collect() si on a besoin d'un vecteur.

Il est parfois utile de remplacer les valeurs missing par une valeur par défaut. La macro @coalesce() est utile pour cela : elle renvoie la première valeur non manquante (ou missing s'il n'y en a pas d'autre).

julia> str = ["I", "exist", missing]
3-element Vector{Union{Missing, String}}:
 "I"
 "exist"
 missing

julia> [@coalesce(s, "-") for  s in str]
3-element Vector{String}:
 "I"
 "exist"
 "-"

NaN

Abréviation de « Not a Number », NaN signale un problème de calcul dans les situations où l'on attendait un nombre.

julia> v = [0, 1, -1]
3-element Vector{Int64}:
  0
  1
 -1

julia> v / 0
3-element Vector{Float64}:
 NaN
  Inf
 -Inf
 
julia> sum(v / 0)
NaN

Tout calcul sur des données contenant un NaN donnera un résultat NaN.

Il n'existe actuellement aucune fonction spéciale pour supprimer les valeurs NaN, mais la fonction standard filter() peut le faire très simplement. Seules les valeurs pour lesquelles une condition donnée vaut true seront copiées dans le tableau résultat :

julia> filter(!isnan, [1, 2, NaN])
2-element Vector{Float64}:
 1.0
 2.0

Instructions

Dans cet exercice, tu vas écrire du code pour créer des badges nominatifs que les employés de l'usine porteront. Les employés ont un identifiant, un nom et un service. Les libellés des badges des employés sont formatés comme suit : "[id] - name - DEPARTMENT".

1. Crée un badge pour un employé

Implémente la fonction print_name_badge. Elle doit prendre un identifiant, un nom et un service. Elle doit renvoyer le libellé du badge, avec le nom du service en majuscules.

julia> print_name_badge(67, "Katherine Williams", "Strategic Communication")
"[67] - Katherine Williams - STRATEGIC COMMUNICATION"

2. Crée un badge pour un nouvel employé

En raison d'une bizarrerie du système informatique, les nouveaux employés n'ont parfois pas encore d'identifiant lorsqu'ils commencent à travailler à l'usine. Comme les badges sont obligatoires, ils reçoivent un badge temporaire sans le préfixe d'identifiant.

Étends la fonction print_name_badge. Lorsque l'identifiant manque, elle doit créer un badge sans identifiant.

julia> print_name_badge(missing, "Robert Johnson", "Procurement")
"Robert Johnson - PROCUREMENT"

3. Crée un badge pour le propriétaire

Même le propriétaire de l'usine doit porter un badge en permanence. Cependant, un propriétaire n'a pas de service et n'en aura jamais : il est au-dessus de tous les services. Dans ce cas, le libellé doit renvoyer "OWNER" au lieu du nom du service.

Étends la fonction print_name_badge. Lorsque le service vaut nothing, considère que le badge appartient au propriétaire de l'entreprise.

julia> print_name_badge(204, "Rachel Miller", nothing)
"[204] - Rachel Miller - OWNER"

Note qu'il est possible que le propriétaire soit aussi un nouvel employé.

julia> print_name_badge(missing, "Rachel Miller", nothing)
"Rachel Miller - OWNER"

4. Calcule le salaire total des employés sans identifiant

Pour avoir une idée approximative de la qualité de l'attribution des identifiants, on veut voir le salaire cumulé des employés sans identifiant. Une valeur élevée signifie que beaucoup de personnes attendent, ou que le problème touche des personnes expérimentées : dans les deux cas, c'est mauvais.

Implémente la fonction salaries_no_id qui prend un vecteur d'identifiants et un vecteur de salaires correspondant, et qui renvoie la somme des salaires des personnes qui n'ont pas encore d'identifiant. Les deux vecteurs ont la même longueur.

julia> ids = [204, missing, 210, 352, missing, 263]
julia> salaries = [23, 21, 47, 35, 17, 101] * 1000
julia> salaries_no_id(ids, salaries)
38,000
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Julia Exercism

Prêt à commencer Badges nominatifs ?

Inscris-toi sur Exercism pour apprendre et maîtriser Julia avec 35 concepts128 exercices, et un vrai mentorat humain, le tout gratuitement.