Rutas
/
jq
jq
/
Ejercicios
/
Compra de un vehículo
Compra de un vehículo

Compra de un vehículo

Ejercicio de aprendizaje

Introducción

Comparación

Comparación de números

En jq los números se pueden comparar con los siguientes operadores relacionales y de igualdad.

Comparación Operador
Mayor que a > b
Mayor o igual que a >= b
Menor que a < b
Menor o igual que a <= b
Igual a a == b
Distinto de a != b

El resultado de la comparación siempre es un valor booleano, es decir, 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.

Comparación de strings

Los operadores de comparación anteriores también se pueden usar para comparar strings. En ese caso, se aplica un orden de diccionario (lexicográfico). El orden se basa en el valor del punto de código Unicode.

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

Debes tener cuidado cuando compares dos variables que parecen contener valores numéricos pero son de tipo string. Debido al orden de diccionario, el resultado no será el mismo que al comparar valores de tipo número.

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

Igualdad «estricta»

El operador == de jq es como el === de Javascript en el sentido de que dos cosas que «parecen» iguales, pero son de tipos diferentes, no son iguales.

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

Comparación de arrays

Dos arrays son iguales si todos los elementos correspondientes son iguales.

[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

Comparación de objetos

Dos objetos son iguales si tienen los mismos pares clave-valor.

{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

Condicionales

Expresión if

La expresión condicional de jq es if A then B else C end.

if-then-else es un filtro como todas las funciones integradas de jq: recibe una entrada y produce una salida.

Si la expresión A produce un valor verdadero, el filtro if evalúa B. En caso contrario, evalúa C. La entrada del filtro if se pasa a B o a C.

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

La cláusula else es opcional; las dos instrucciones siguientes son equivalentes.

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

Condicionales anidados

Se pueden añadir más condiciones con elif.

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

Usa tantas cláusulas elif como necesites.

Veracidad

Los únicos valores «falsos» en jq son: false y null. Todo lo demás es «verdadero», incluso el número cero y el string vacío, el array vacío y el objeto vacío.

Operadores booleanos

Los operadores booleanos and y or se pueden usar para construir consultas complejas.

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

Para negar, usa not. Es un filtro, no un operador.

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

Operador de alternativa

El operador de alternativa te permite especificar un valor «predeterminado» si una expresión es falsa o nula.

A // B

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

Para demostrarlo

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

Instrucciones

En este ejercicio vas a escribir algo de código que te ayude a prepararte para comprar un vehículo.

Tienes tres tareas: determinar si vas a necesitar un permiso de conducir, elegir entre dos vehículos y calcular el precio aceptable de un vehículo de segunda mano.

1. Determina si vas a necesitar un permiso de conducir

Algunos tipos de vehículos necesitan un permiso de conducir para poder manejarlos. Supón que solo los tipos "car" y "truck" requieren permiso; todo lo demás se puede manejar sin permiso.

Implementa la función needs_license, que toma el tipo de vehículo y devuelve un valor booleano que indica si necesitas un permiso para ese tipo de vehículo.

"car" | needs_license
# => true

"bike" | needs_license
# => false

2. Elige entre dos posibles vehículos que comprar

Has evaluado tus opciones de vehículos disponibles. Has conseguido reducirlas a dos opciones, pero necesitas ayuda para tomar la decisión final. Implementa la función choose_vehicle, que toma como entrada un array de dos vehículos y devuelve una decisión: la opción que aparece primero en orden alfabético.

["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. Calcula una estimación del precio de un vehículo de segunda mano

Ahora que has tomado tu decisión, quieres asegurarte de conseguir un precio justo en el concesionario. Como te interesa comprar un vehículo de segunda mano, el precio depende de la antigüedad del vehículo. Para una estimación aproximada, supón que si el vehículo tiene menos de 3 años, cuesta el 80 % del precio original que tenía cuando era nuevo. Si tiene más de 10 años, cuesta el 50 %. Si el vehículo tiene al menos 3 años, pero no más de 10, cuesta el 70 % del precio original.

Implementa la función resell_price, que aplica esta lógica usando if, elif y else. Toma un objeto que contiene el precio original y la antigüedad del vehículo, y devuelve el precio estimado en el concesionario.

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

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

{"original_price": 1000, "age": 15} | resell_price
# => 500
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
jq Exercism

¿Listo para empezar Compra de un vehículo?

Regístrate en Exercism para aprender y dominar jq con 12 conceptos75 ejercicios y mentoría humana real, todo gratis.