Tracks
/
jq
jq
/
Übungen
/
Fahrzeugkauf
Fahrzeugkauf

Fahrzeugkauf

Lernübung

Einführung

Vergleichen

Zahlen vergleichen

In jq kannst du Zahlen mit den folgenden Vergleichs- und Gleichheitsoperatoren vergleichen.

Vergleich Operator
Größer als a > b
Größer oder gleich a >= b
Kleiner als a < b
Kleiner oder gleich a <= b
Gleich a == b
Ungleich a != b

Das Ergebnis des Vergleichs ist immer ein boolescher Wert, also entweder true oder 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.

Strings vergleichen

Die obigen Vergleichsoperatoren kannst du auch verwenden, um Strings zu vergleichen. In diesem Fall wird eine Wörterbuchreihenfolge (lexikografische Reihenfolge) angewendet. Die Reihenfolge richtet sich nach dem Unicode-Codepoint-Wert.

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

Du musst vorsichtig sein, wenn du zwei Variablen vergleichst, die numerische Werte zu enthalten scheinen, aber vom Typ String sind. Wegen der Wörterbuchreihenfolge ist das Ergebnis nicht dasselbe wie beim Vergleich von Werten des Typs Zahl.

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

„Strikte" Gleichheit

Der ==-Operator von jq ist wie JavaScripts === in dem Sinne, dass Dinge, die gleich „aussehen", aber von unterschiedlichem Typ sind, nicht gleich sind.

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

Arrays vergleichen

Zwei Arrays sind gleich, wenn alle entsprechenden Elemente gleich sind.

[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

Objekte vergleichen

Zwei Objekte sind gleich, wenn sie dieselben Schlüssel-Wert-Paare haben.

{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

Bedingungen

if-Ausdruck

Der bedingte Ausdruck von jq lautet if A then B else C end.

if-then-else ist ein Filter wie alle eingebauten Funktionen von jq: Er nimmt eine Eingabe und erzeugt eine Ausgabe.

Wenn der Ausdruck A einen „truthy"-Wert erzeugt, wertet der if-Filter B aus. Andernfalls wertet er C aus. Die Eingabe des if-Filters wird an B oder C weitergegeben.

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

Die else-Klausel ist optional; die folgenden beiden Anweisungen sind gleichwertig.

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

Verschachtelte if-Anweisungen

Weitere Bedingungen kannst du mit elif hinzufügen.

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

Verwende so viele elif-Klauseln, wie du brauchst.

Truthiness

Die einzigen „falschen" Werte in jq sind false und null. Alles andere ist „wahr", sogar die Zahl null und der leere String, das leere Array und das leere Objekt.

Boolesche Operatoren

Mit den booleschen Operatoren and und or kannst du komplexe Abfragen aufbauen.

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

Zum Negieren verwendest du not. Das ist ein Filter, kein Operator.

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

Alternativer Operator

Mit dem alternativen Operator kannst du einen „Standardwert" angeben, falls ein Ausdruck falsch oder null ist.

A // B

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

Zur Veranschaulichung

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

Anleitung

In dieser Übung schreibst du etwas Code, um dich auf den Kauf eines Fahrzeugs vorzubereiten.

Du hast drei Aufgaben: Finde heraus, ob du einen Führerschein brauchst; wähle zwischen zwei Fahrzeugen; und schätze den angemessenen Preis für ein gebrauchtes Fahrzeug.

1. Finde heraus, ob du einen Führerschein brauchst

Manche Fahrzeugarten erfordern einen Führerschein, um sie zu fahren. Gehe davon aus, dass nur die Arten "car" und "truck" einen Führerschein erfordern; alles andere kann ohne Führerschein gefahren werden.

Implementiere die Funktion needs_license, die die Fahrzeugart entgegennimmt und einen booleschen Wert zurückgibt, der angibt, ob du für diese Fahrzeugart einen Führerschein brauchst.

"car" | needs_license
# => true

"bike" | needs_license
# => false

2. Wähle zwischen zwei möglichen Fahrzeugen, die du kaufen könntest

Du hast deine Optionen an verfügbaren Fahrzeugen geprüft. Du hast sie auf zwei Optionen eingegrenzt, aber du brauchst Hilfe bei der endgültigen Entscheidung. Implementiere die Funktion choose_vehicle, die ein Array mit zwei Fahrzeugen als Eingabe entgegennimmt und eine Entscheidung zurückgibt: die Option, die in lexikografischer Reihenfolge zuerst kommt.

["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. Berechne eine Schätzung für den Preis eines gebrauchten Fahrzeugs

Jetzt, wo du deine Entscheidung getroffen hast, willst du sichergehen, dass du beim Händler einen fairen Preis bekommst. Da du ein gebrauchtes Fahrzeug kaufen möchtest, hängt der Preis davon ab, wie alt das Fahrzeug ist. Für eine grobe Schätzung gehst du davon aus, dass ein Fahrzeug, das weniger als 3 Jahre alt ist, 80 % des ursprünglichen Preises kostet, den es neu hatte. Ist es älter als 10 Jahre, kostet es 50 %. Ist das Fahrzeug mindestens 3 Jahre alt, aber nicht älter als 10 Jahre, kostet es 70 % des ursprünglichen Preises.

Implementiere die Funktion resell_price, die diese Logik mit if, elif und else anwendet. Sie nimmt ein Objekt entgegen, das den ursprünglichen Preis und das Alter des Fahrzeugs enthält, und gibt den geschätzten Preis beim Händler zurück.

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

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

{"original_price": 1000, "age": 15} | resell_price
# => 500
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
jq Exercism

Bereit, mit Fahrzeugkauf zu starten?

Melde dich bei Exercism an, um jq mit 12 Konzepte75 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.