المسارات
/
jq
jq
/
التمارين
/
شراء مركبة
شراء مركبة

شراء مركبة

تمرين تعلّمي

مقدمة

المقارنة

مقارنة الأعداد

في jq، يمكن مقارنة الأعداد باستخدام عوامل العلاقة والمساواة التالية.

المقارنة العامل
أكبر من a > b
أكبر من أو يساوي a >= b
أصغر من a < b
أصغر من أو يساوي a <= b
يساوي a == b
لا يساوي a != b

نتيجة المقارنة دائمًا قيمة منطقية، أي إما true أو 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.

مقارنة السلاسل النصية

يمكن أيضًا استخدام عوامل المقارنة أعلاه لمقارنة السلاسل النصية. في هذه الحالة، يُطبَّق ترتيب قاموسي (معجمي). ويكون الترتيب حسب قيمة نقطة ترميز يونيكود.

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

عليك أن تكون حريصًا عند مقارنة متغيرين يبدوان وكأنهما يحتويان على قيم عددية، لكن نوعهما سلسلة نصية. بسبب الترتيب القاموسي، لن تكون النتيجة مماثلة لمقارنة قيم من النوع عدد.

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

المساواة "الصارمة"

عامل == في jq يشبه === في JavaScript من حيث أن الأشياء التي "تبدو" متشابهة، ولكنها من أنواع مختلفة، ليست متساوية.

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

مقارنة المصفوفات

تكون المصفوفتان متساويتين إذا كانت جميع عناصرهما المتناظرة متساوية.

[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

مقارنة الكائنات

يكون الكائنان متساويين إذا كان لهما نفس أزواج المفتاح والقيمة.

{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

الجمل الشرطية

تعبير if

التعبير الشرطي في jq هو if A then B else C end.

if-then-else مرشّح شأنه شأن جميع الدوال المدمجة في jq: يأخذ مدخلًا وينتج مخرجًا.

إذا أنتج التعبير A قيمة "تُعتبر صحيحة"، فإن مرشّح if يقيّم B. وإلا فإنه يقيّم C. وسيُمرَّر مدخل مرشّح if إلى B أو C.

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

جملة else اختيارية؛ العبارتان التاليتان متكافئتان.

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

الجمل الشرطية المتداخلة

يمكن إضافة المزيد من الشروط باستخدام elif.

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

استخدم ما تحتاجه من جمل elif.

الصدقية

القيم "الخاطئة" الوحيدة في jq هي: false و null. وكل ما عدا ذلك "صحيح"، حتى العدد صفر والسلسلة النصية الفارغة والمصفوفة الفارغة والكائن الفارغ.

العوامل المنطقية

يمكن استخدام العوامل المنطقية and و or لبناء استعلامات معقدة.

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

للنفي، استخدم not. فهذا مرشّح وليس عاملًا.

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

العامل البديل

يتيح لك العامل البديل تحديد قيمة "افتراضية" إذا كان التعبير خطأ أو null.

A // B

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

للتوضيح

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

التعليمات

في هذا التمرين، ستكتب بعض الكود لمساعدتك على الاستعداد لشراء مركبة.

لديك ثلاث مهام: تحديد ما إذا كنت ستحتاج إلى الحصول على رخصة قيادة؛ والاختيار بين مركبتين؛ وتقدير السعر المقبول لمركبة مستعملة.

1. تحديد ما إذا كنت ستحتاج إلى رخصة قيادة

بعض أنواع المركبات تتطلب رخصة قيادة لتشغيلها. افترض أن النوعين "car" و"truck" فقط هما اللذان يتطلبان رخصة؛ وكل ما عدا ذلك يمكن تشغيله دون رخصة.

نفّذ الدالة needs_license التي تأخذ نوع المركبة وتُرجع قيمة منطقية تشير إلى ما إذا كنت تحتاج إلى رخصة لهذا النوع من المركبات.

"car" | needs_license
# => true

"bike" | needs_license
# => false

2. الاختيار بين مركبتين محتملتين للشراء

لقد قيّمت خياراتك من المركبات المتاحة. تمكنت من تضييق نطاقها إلى خيارين، لكنك تحتاج إلى مساعدة في اتخاذ القرار النهائي. نفّذ الدالة choose_vehicle التي تأخذ مصفوفة من مركبتين كمدخل وتُرجع قرارًا، وهو الخيار الذي يأتي أولًا في الترتيب المعجمي.

["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. حساب تقدير لسعر مركبة مستعملة

الآن بعد أن اتخذت قرارك، تريد أن تتأكد من حصولك على سعر عادل في الوكالة. وبما أنك مهتم بشراء مركبة مستعملة، فإن السعر يعتمد على عمر المركبة. وللحصول على تقدير تقريبي، افترض أنه إذا كان عمر المركبة أقل من 3 سنوات، فإنها تكلّف 80% من سعرها الأصلي عندما كانت جديدة تمامًا. وإذا كان عمرها أكثر من 10 سنوات، فإنها تكلّف 50%. وإذا كان عمر المركبة 3 سنوات على الأقل ولكن ليس أكثر من 10 سنوات، فإنها تكلّف 70% من السعر الأصلي.

نفّذ الدالة resell_price التي تطبق هذا المنطق باستخدام if وelif وelse. تأخذ كائنًا يحمل السعر الأصلي وعمر المركبة وتُرجع السعر المقدّر في الوكالة.

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

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

{"original_price": 1000, "age": 15} | resell_price
# => 500
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
jq Exercism

مستعد لبدء شراء مركبة؟

سجّل في Exercism لتتعلّم وتتقن jq عبر 12 مفهومًا75 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.