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

Compra de un vehículo

Ejercicio de aprendizaje

Introducción

Comparar

Comparar 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.

Comparar strings

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

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

Ten 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 number.

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 las 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.

Comparar 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

Comparar 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 todos los builtins de jq: recibe una entrada y produce una salida.

Si la expresión A produce un valor «truthy», entonces el filtro if evalúa B. De lo contrario, evalúa C. La entrada del filtro if se pasará 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 sentencias siguientes son equivalentes.

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

Condicionales if anidados

Se pueden agregar 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, el array y el objeto vacíos.

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. Esto es un filtro, no un operador.

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

Operador alternativo

El operador alternativo te permite especificar un valor «predeterminado» si una expresión es false o null.

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, escribirás un poco de código para ayudarte a prepararte para comprar un vehículo.

Tienes tres tareas: determinar si vas a necesitar una licencia; elegir entre dos vehículos; y estimar el precio aceptable de un vehículo usado.

1. Determina si vas a necesitar una licencia de conducir

Algunos tipos de vehículos requieren una licencia de conducir para poder conducirlos. Asume que solo los tipos "car" y "truck" requieren una licencia; todo lo demás se puede conducir sin una.

Implementa la función needs_license que recibe el tipo de vehículo y devuelve un valor Boolean que indica si necesitas una licencia para ese tipo de vehículo.

"car" | needs_license
# => true

"bike" | needs_license
# => false

2. Elige entre dos posibles vehículos para comprar

Has evaluado tus opciones de vehículos disponibles. Lograste reducirlas a dos opciones, pero necesitas ayuda para tomar la decisión final. Implementa la función choose_vehicle que recibe un array de dos vehículos como argumento y devuelve una decisión, que es la opción que aparece primero en el orden del diccionario.

["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 usado

Ahora que has tomado tu decisión, quieres asegurarte de obtener un precio justo en la concesionaria. Como te interesa comprar un vehículo usado, el precio depende de la 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. Recibe un objeto que contiene el precio original y la edad del vehículo, y devuelve el precio estimado en la concesionaria.

{"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 una pestaña nuevas
jq Exercism

¿Todo 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.