Parcours
/
jq
jq
/
Exercices
/
Achat de véhicule
Achat de véhicule

Achat de véhicule

Exercice d'apprentissage

Introduction

Comparer

Comparer des nombres

En jq, les nombres peuvent être comparés à l'aide des opérateurs relationnels et d'égalité suivants.

Comparaison Opérateur
Supérieur à a > b
Supérieur ou égal à a >= b
Inférieur à a < b
Inférieur ou égal à a <= b
Égal à a == b
Différent de a != b

Le résultat de la comparaison est toujours une valeur booléenne, donc soit true, soit false.

1 < 3,      # => true
2 != 2,     # => false
1 == 1.0    # => true
            # All numbers are floating-points, so this is different syntax
            # for the exact same value.

Comparer des strings

Les opérateurs de comparaison ci-dessus peuvent aussi servir à comparer des strings. Dans ce cas, c'est un ordre lexicographique (de dictionnaire) qui s'applique. Le classement se fait par valeur de point de code Unicode.

"Apple" > "Pear",   # => false
"a" < "above",      # => true
"a" == "A"          # => false

Il faut faire attention quand on compare deux variables qui semblent contenir des valeurs numériques mais qui sont de type string. À cause de l'ordre lexicographique, le résultat ne sera pas le même que si l'on comparait des valeurs de type nombre.

10 < 2,     # => false
"10" < "2"  # => true (because "1" comes before "2")

L'égalité « stricte »

L'opérateur == de jq est comme le === de JavaScript en ce sens que des choses qui « se ressemblent » mais qui sont de types différents ne sont pas égales.

"3" == 3    # => false
            # the value on the left has type string,
            # the value on the right has type number.

Comparer des tableaux

Deux tableaux sont égaux si tous les éléments correspondants sont égaux.

[1, 2, 3] == [1, 2, 3]      # => true
[1, 2, 3] == [1, 3, 2]      # => false, different order
[1, 2, 3] == [1, 2, "3"]    # => false, different types

Comparer des objets

Deux objets sont égaux s'ils ont les mêmes paires clé-valeur.

{name: "Joe", age: 42} == {age: 42, name: "Joe"}                # => true
{name: "Joe", age: 42} == {age: 42, name: "Jane"}               # => false
{name: "Joe", age: 42} == {age: "42", name: "Joe"}              # => false
{name: "Joe", age: 42} == {age: 42, name: "Joe", height: 175}   # => false

# comparisons will drill down as deeply as required
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2]}}}                  # => true
{a: {b: {c: [1, 2]}}} == {a: {b: {c: [1, 2, 3]}}}               # => false

Les conditions

L'expression if

L'expression conditionnelle de jq s'écrit if A then B else C end.

if-then-else est un filtre, comme toutes les fonctions natives de jq : il prend une entrée et produit une sortie.

Si l'expression A produit une valeur considérée comme vraie, le filtre if évalue B. Sinon, il évalue C. L'entrée du filtre if est transmise à B ou à C.

42 | if . < 50 then "small" else "big" end      # => "small"
5 | if . % 2 == 0 then . / 2 else . * 4 end     # => 20
Note

La clause else est facultative ; les deux instructions suivantes sont équivalentes.

if A then B else . end
if A then B end

Les instructions if imbriquées

On peut ajouter d'autres conditions avec elif.

42 | if . < 33 then "small"
     elif . < 66 then "medium"
     else "big"
     end
# => "medium"

Utilise autant de clauses elif que nécessaire.

Valeurs vraies et fausses

Les seules valeurs « fausses » en jq sont : false et null. Tout le reste est « vrai », même le nombre zéro, la chaîne vide, le tableau vide et l'objet vide.

Les opérateurs booléens

Les opérateurs booléens and et or permettent de construire des requêtes complexes.

42 | if . < 33 or . > 66 then "big or small"
     else "medium"
     end

Pour nier, utilise not. C'est un filtre, pas un opérateur.

42 | if (. < 33 or . > 66 | not) then "medium"
     else "big or small"
     end

L'opérateur alternatif

L'opérateur alternatif permet de spécifier une valeur « par défaut » quand une expression est fausse ou nulle.

A // B

# This is identical to
if A then A else B end

Pour illustrer

[3, 5, 18] | add / 2       # => 13
[]         | add / 2       # => error: null (null) and number (2) cannot be divided
[]         | add // 0 / 2  # => 0

Instructions

Dans cet exercice, tu vas écrire du code pour t'aider à te préparer à acheter un véhicule.

Tu as trois tâches : déterminer si tu auras besoin d'un permis de conduire ; choisir entre deux véhicules ; et estimer le prix acceptable pour un véhicule d'occasion.

1. Détermine si tu auras besoin d'un permis de conduire

Certains types de véhicules exigent un permis de conduire pour être conduits. Suppose que seuls les types "car" et "truck" exigent un permis ; tout le reste peut être conduit sans permis.

Implémente la fonction needs_license, qui prend le type de véhicule et renvoie un booléen indiquant si tu as besoin d'un permis pour ce type de véhicule.

"car" | needs_license
# => true

"bike" | needs_license
# => false

2. Choisis entre deux véhicules potentiels à acheter

Tu as évalué les véhicules disponibles. Tu as réussi à réduire ton choix à deux options, mais tu as besoin d'aide pour prendre la décision finale. Implémente la fonction choose_vehicle qui prend un tableau de deux véhicules en entrée et renvoie une décision, à savoir l'option qui vient en premier dans l'ordre du dictionnaire.

["Wuling Hongguang", "Toyota Corolla"] | choose_vehicle
# =>  "Toyota Corolla is clearly the better choice."

["Volkswagen Beetle", "Volkswagen Golf"] | choose_vehicle
# =>  "Volkswagen Beetle is clearly the better choice."

3. Calcule une estimation du prix d'un véhicule d'occasion

Maintenant que tu as pris ta décision, tu veux t'assurer de payer un prix équitable chez le concessionnaire. Comme tu cherches à acheter un véhicule d'occasion, le prix dépend de l'âge du véhicule. Pour une estimation approximative, suppose que si le véhicule a moins de 3 ans, il coûte 80 % de son prix d'origine lorsqu'il était neuf. S'il a plus de 10 ans, il coûte 50 %. Si le véhicule a au moins 3 ans mais pas plus de 10 ans, il coûte 70 % de son prix d'origine.

Implémente la fonction resell_price qui applique cette logique à l'aide de if, elif et else. Elle prend un objet contenant le prix d'origine et l'âge du véhicule et renvoie le prix estimé chez le concessionnaire.

{"original_price": 1000, "age": 1} | resell_price
# => 800

{"original_price": 1000, "age": 5} | resell_price
# => 700

{"original_price": 1000, "age": 15} | resell_price
# => 500
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
jq Exercism

Prêt à commencer Achat de véhicule ?

Inscris-toi sur Exercism pour apprendre et maîtriser jq avec 12 concepts75 exercices, et un vrai mentorat humain, le tout gratuitement.