Track
/
jq
jq
/
Esercizi
/
Acquisto di un veicolo
Acquisto di un veicolo

Acquisto di un veicolo

Esercizio di apprendimento

Introduzione

Confronto

Confrontare i numeri

In jq i numeri si possono confrontare usando i seguenti operatori relazionali e di uguaglianza.

Confronto Operatore
Maggiore di a > b
Maggiore o uguale a a >= b
Minore di a < b
Minore o uguale a a <= b
Uguale a a == b
Diverso da a != b

Il risultato del confronto è sempre un valore booleano, quindi true o 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.

Confrontare le stringhe

Gli operatori di confronto precedenti possono essere usati anche per confrontare le stringhe. In tal caso, si applica un ordine lessicografico. L'ordinamento è in base al valore del punto di codice Unicode.

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

Devi fare attenzione quando confronti due variabili che sembrano contenere valori numerici ma sono di tipo stringa. A causa dell'ordine lessicografico, il risultato non sarà lo stesso che confrontare valori di tipo numero.

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

Uguaglianza «rigorosa»

L'operatore == di jq è simile a === di JavaScript, nel senso che le cose che «sembrano» uguali, ma sono di tipi diversi, non sono uguali.

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

Confrontare gli array

Due array sono uguali se tutti gli elementi corrispondenti sono uguali.

[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

Confrontare gli oggetti

Due oggetti sono uguali se hanno le stesse coppie chiave-valore.

{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

Condizionali

Espressione if

L'espressione condizionale di jq è if A then B else C end.

if-then-else è un filtro come tutte le funzioni predefinite di jq: prende un input e produce un output.

Se l'espressione A produce un valore «veritiero», allora il filtro if valuta B. Altrimenti valuta C. L'input del filtro if verrà passato a B o C.

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

La clausola else è opzionale; le due istruzioni seguenti sono equivalenti.

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

Istruzioni if annidate

Si possono aggiungere altre condizioni con elif.

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

Usa tutte le clausole elif che ti servono.

Veridicità

Gli unici valori «falsi» in jq sono: false e null. Tutto il resto è «vero», persino il numero zero e la stringa vuota, l'array vuoto e l'oggetto vuoto.

Operatori booleani

Gli operatori booleani and e or possono essere usati per costruire query complesse.

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

Per negare, usa not. Questo è un filtro, non un operatore.

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

Operatore alternativo

L'operatore alternativo ti permette di specificare un valore «predefinito» se un'espressione è falsa o null.

A // B

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

Per dimostrarlo

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

Istruzioni

In questo esercizio, scriverai del codice per aiutarti a prepararti all'acquisto di un veicolo.

Hai tre compiti: stabilire se ti servirà una patente; scegliere tra due veicoli; e stimare il prezzo accettabile per un veicolo usato.

1. Stabilisci se ti servirà una patente di guida

Alcuni tipi di veicoli richiedono una patente di guida per essere guidati. Supponi che solo i tipi "car" e "truck" richiedano una patente; tutto il resto può essere guidato senza.

Implementa la funzione needs_license che prende il tipo di veicolo e restituisce un booleano che indica se ti serve una patente per quel tipo di veicolo.

"car" | needs_license
# => true

"bike" | needs_license
# => false

2. Scegli tra due potenziali veicoli da acquistare

Hai valutato le opzioni di veicoli disponibili. Sei riuscito a restringerle a due, ma ti serve una mano per prendere la decisione finale. Implementa la funzione choose_vehicle che prende come input un array di due veicoli e restituisce una decisione, cioè l'opzione che viene prima in ordine alfabetico.

["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. Calcola una stima del prezzo di un veicolo usato

Ora che hai preso la tua decisione, vuoi assicurarti di ottenere un prezzo equo dal concessionario. Dato che sei interessato a comprare un veicolo usato, il prezzo dipende da quanto è vecchio il veicolo. Per una stima approssimativa, supponi che se il veicolo ha meno di 3 anni, costi l'80% del prezzo originale che aveva quando era nuovo di zecca. Se ha più di 10 anni, costa il 50%. Se il veicolo ha almeno 3 anni ma non più di 10, costa il 70% del prezzo originale.

Implementa la funzione resell_price che applica questa logica usando if, elif ed else. Prende un oggetto che contiene il prezzo originale e l'età del veicolo e restituisce il prezzo stimato dal concessionario.

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

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

{"original_price": 1000, "age": 15} | resell_price
# => 500
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
jq Exercism

Vuoi iniziare Acquisto di un veicolo?

Iscriviti a Exercism per imparare e padroneggiare jq con 12 concetti75 esercizi e il mentoring di persone reali, tutto gratis.