Trilhas
/
jq
jq
/
Exercícios
/
Compra de veículo
Compra de veículo

Compra de veículo

Exercício de aprendizagem

Introdução

Comparar

Comparando números

No jq, números podem ser comparados com os seguintes operadores relacionais e de igualdade.

Comparação Operador
Maior que a > b
Maior ou igual a a >= b
Menor que a < b
Menor ou igual a a <= b
Igual a a == b
Diferente de a != b

O resultado da comparação é sempre um valor Boolean, ou seja, true ou 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.

Comparando strings

Os operadores de comparação acima também podem ser usados para comparar strings. Nesse caso, é aplicada uma ordem de dicionário (lexicográfica). A ordenação é pelo valor do codepoint Unicode.

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

Você precisa tomar cuidado ao comparar duas variáveis que parecem conter valores numéricos, mas são do tipo string. Por causa da ordem de dicionário, o resultado não será o mesmo de comparar valores do tipo number.

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

Igualdade "estrita"

O operador == do jq é como o === do JavaScript, no sentido de que coisas que "parecem" iguais, mas são de tipos diferentes, não são iguais.

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

Comparando arrays

Dois arrays são iguais se todos os elementos correspondentes forem iguais.

[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

Comparando objetos

Dois objetos são iguais se tiverem os mesmos pares chave-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

Condicionais

Expressão if

A expressão condicional do jq é if A then B else C end.

O if-then-else é um filtro como todos os builtins do jq: ele recebe uma entrada e produz uma saída.

Se a expressão A produzir um valor "truthy", o filtro if avalia B. Caso contrário, avalia C. A entrada do filtro if será passada para B ou C.

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

A cláusula else é opcional; as duas instruções a seguir são equivalentes.

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

Condicionais aninhados

Você pode adicionar mais condições com elif.

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

Use quantas cláusulas elif você precisar.

Veracidade

Os únicos valores "falsos" no jq são: false e null. Todo o resto é "verdadeiro", até o número zero, a string vazia, o array vazio e o objeto vazio.

Operadores Boolean

Os operadores Boolean and e or podem ser usados para construir consultas complexas.

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

Para negar, use not. Isso é um filtro, não um operador.

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

Operador alternativo

O operador alternativo permite especificar um valor "padrão" caso uma expressão seja false ou null.

A // B

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

Para demonstrar

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

Instruções

Neste exercício, você vai escrever um pouco de código para ajudar na sua preparação para comprar um veículo.

Você tem três tarefas: determinar se vai precisar tirar uma carteira de motorista; escolher entre dois veículos; e estimar um preço aceitável para um veículo usado.

1. Determine se você vai precisar de uma carteira de motorista

Alguns tipos de veículos exigem carteira de motorista para serem conduzidos. Considere que apenas os tipos "car" e "truck" exigem carteira; todo o resto pode ser conduzido sem carteira.

Implemente a função needs_license, que recebe o tipo de veículo e retorna um Boolean indicando se você precisa de carteira para aquele tipo de veículo.

"car" | needs_license
# => true

"bike" | needs_license
# => false

2. Escolha entre dois possíveis veículos para comprar

Você avaliou suas opções de veículos disponíveis. Você conseguiu reduzir tudo a duas opções, mas precisa de ajuda para tomar a decisão final. Implemente a função choose_vehicle, que recebe como entrada um array de dois veículos e retorna uma decisão, que é a opção que vem primeiro na ordem alfabética.

["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 uma estimativa para o preço de um veículo usado

Agora que você tomou sua decisão, você quer garantir um preço justo na concessionária. Como você está interessado em comprar um veículo usado, o preço depende de quantos anos o veículo tem. Para uma estimativa aproximada, considere que, se o veículo tiver menos de 3 anos, ele custa 80% do preço original que tinha quando era novo. Se tiver mais de 10 anos, custa 50%. Se o veículo tiver pelo menos 3 anos, mas não mais de 10 anos, custa 70% do preço original.

Implemente a função resell_price, que aplica essa lógica usando if, elif e else. Ela recebe um objeto com o preço original e a idade do veículo e retorna o preço estimado na concessionária.

{"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 via GitHub O link abre em uma nova janela ou aba
jq Exercism

Tudo pronto para começar Compra de veículo?

Crie sua conta no Exercism para aprender e dominar jq com 12 conceitos75 exercícios e mentoria humana de verdade, tudo de graça.