লাসাগনা

লাসাগনা

লার্নিং অনুশীলনী

ভূমিকা

ভ্যারিয়েবল

মনে করুন, একটি jq প্রোগ্রাম হলো এক্সপ্রেশনের একটি পাইপলাইন। ভ্যারিয়েবল অ্যাসাইনমেন্ট এই নিয়মটি মেনে চলে: একটি ভ্যারিয়েবল অ্যাসাইনমেন্ট হলো এমন একটি এক্সপ্রেশন, যা দেখতে এরকম:

... | expr as $varname | ...

ফিল্টারটি ইনপুট আউটপুট করে

আইডেন্টিটি এক্সপ্রেশন .-এর মতোই, ভ্যারিয়েবল অ্যাসাইনমেন্ট-এর আউটপুটও তার ইনপুটের মতোই। ভ্যারিয়েবলের মান সেট করা একটি সাইড-এফেক্ট মাত্র।

উদাহরণ, যা দেখায় যে অ্যাসাইনমেন্টের পরে . শুরুর ইনপুটের মতোই থাকে:

$ jq -c -n '42 | (. * 2) as $double | [., $double]'
[42,84]

ভ্যারিয়েবলের স্কোপ

ভ্যারিয়েবলের স্কোপ "লেক্সিকাল", অর্থাৎ পাইপলাইনের বাকি অংশজুড়ে ভ্যারিয়েবলটি স্কোপে থাকবে। ফাংশনের ভেতরে ডিফাইন করা ভ্যারিয়েবল (ফাংশন নিয়ে আমরা পরে আলোচনা করব) ফাংশনের কাছে "লোকাল"।

ভ্যারিয়েবলের নাম

ভ্যারিয়েবলের নাম অবশ্যই $ দিয়ে শুরু হতে হবে। নামের বাকি অংশটি একটি আইডেন্টিফায়ার: একটি অক্ষর বা আন্ডারস্কোর দিয়ে শুরু হয়, তারপর আসে অক্ষর, সংখ্যা বা আন্ডারস্কোর।

ডিস্ট্রাকচারিং অ্যাসাইনমেন্ট

ম্যানুয়াল থেকে:

একটিমাত্র as এক্সপ্রেশন ব্যবহার করে একাধিক ভ্যারিয়েবল ঘোষণা করা যায়, যদি এমন একটি প্যাটার্ন দেওয়া হয় যা ইনপুটের গঠনের সঙ্গে মেলে (একে বলা হয় "ডিস্ট্রাকচারিং")।

উদাহরণ:

[1, 2, 3] as [$a, $b, $c]
| [$a, $b, $c]     # => [1, 2, 3]
{"foo": "bar", "len": [10, 20]} as {foo: $f, len: [$h, $w]}
| [$f, $h, $w]     # => ["bar", 10, 20]

ভ্যারিয়েবলের নাম অবজেক্ট কী (key)-এর সঙ্গে মিলিয়ে দিলে একটি শর্টকাট পাওয়া যায়:

{"x": 4, "y": 7} as {$x, $y}
| [$x, $y]         # => [4, 7]
{"foo": "bar", "len": [10, 20]} as {$foo, $len}
| [$foo, $len]     # => ["bar", [10, 20]]
Note

একই শর্টকাটটি অবজেক্ট তৈরি-র ক্ষেত্রে উল্টো দিকেও কাজ করে

4 as $x | 7 as $y | {$x, $y}    # => {"x":4, "y": 7}

কনস্ট্যান্ট

উপরের উদাহরণেই দেখা গেছে, কনস্ট্যান্ট সংরক্ষণ করার জন্য ভ্যারিয়েবল সুবিধাজনক। কোডে "ম্যাজিক নাম্বার" দেখানোর চেয়ে কনস্ট্যান্টকে একটি নাম দেওয়া ভালো।

অনেক সময় ভ্যারিয়েবলের দরকার হয় না

অনেক সময়ই ভ্যারিয়েবল বাদ দিলে কোড পড়তে আরও সহজ হয়।

সংখ্যার একটি তালিকার গড় নির্ণয় করার কথা ভাবুন

[2, 4, 8, 7]
| add as $sum
| length as $len
| $sum / $len

এর তুলনায়

[2, 4, 8, 7] | add / length

এটি jq-এর সবচেয়ে শক্তিশালী দিকগুলোর একটি তুলে ধরে: একটি ফিল্টারের ইনপুট প্রতিটি সাব-এক্সপ্রেশনকে দেওয়া হয়:

  • ইনপুট অ্যারে [2,4,8,7] পাঠানো হয় add-এ (যা সব এলিমেন্টে + অপারেটর প্রয়োগ করে সংখ্যাগুলো যোগ করে)
  • একই সঙ্গে, [2,4,8,7] পাঠানো হয় length-এও
  • এই সাব-এক্সপ্রেশনগুলো শেষ হলে তাদের ফলাফল ভাগ করা হয়, ফলে ইনপুট অ্যারেতে থাকা সংখ্যাগুলোর গড় মান পাওয়া যায়।

শেখার অনুশীলনীর জন্য যে jq অপারেটরগুলো আপনার দরকার হবে

বিকল্প অপারেটর: //

a // b এক্সপ্রেশনটি a যদি ফলস বা null হয় তাহলে b আউটপুট করে, অন্যথায় a আউটপুট করে। ভ্যারিয়েবল সেট করার সময় একটি ডিফল্ট মান দেওয়ার জন্য এটি খুবই সুবিধাজনক:

(.input.theAnswer // 42) as $answer | ...
পাটিগণিত অপারেটর
  • +, -, * হলো স্বাভাবিক সংখ্যাগত যোগ, বিয়োগ ও গুণের অপারেটর।

নির্দেশনা

এই অনুশীলনীতে আপনি কিছু কোড লিখবেন, যা আপনার প্রিয় রান্নার বই থেকে একটি দুর্দান্ত লাসাগনা বানাতে সাহায্য করবে।

আপনার সামনে চারটি কাজ আছে, সবগুলোই লাসাগনা রান্নায় ব্যয় হওয়া সময়ের সাথে সম্পর্কিত।

1. মিনিটে ওভেনে রাখার প্রত্যাশিত সময় নির্ধারণ করুন

$expected_minutes_in_oven নামে একটি কনস্ট্যান্ট ডিফাইন করুন। রান্নার বই অনুযায়ী, ওভেনে রাখার প্রত্যাশিত সময় মিনিটে ৪০:

$ jq -n -f lasagna.jq
{
  "expected_minutes_in_oven": 40,
  ...

2. মিনিটে ওভেনে বাকি সময় হিসাব করুন

এই মানটি ইনপুট হিসেবে নেয় লাসাগনা ওভেনে কত মিনিট ছিল, আর আগের কাজে পাওয়া মিনিটে প্রত্যাশিত ওভেন সময়ের ভিত্তিতে রিটার্ন করে লাসাগনাকে ওভেনে আরও কত মিনিট থাকতে হবে।

$ echo '{"actual_minutes_in_oven": 18}' | jq -f lasagna.jq
{
  "expected_minutes_in_oven": 40,
  "remaining_minutes_in_oven": 22,
  ...

3. মিনিটে প্রস্তুতির সময় হিসাব করুন

প্রস্তুতির সময় হলো লাসাগনা ওভেনে দেওয়ার আগে সেটি তৈরি করতে যত সময় লাগে। প্রতিটি স্তর প্রস্তুত করতে ২ মিনিট লাগে।

$ echo '{"number_of_layers": 3}' | jq -f lasagna.jq
{
  ...
  "preparation_time": 6,
  ...

4. মিনিটে মোট কাজের সময় হিসাব করুন

লাসাগনা রান্না করতে আপনি মোট কত মিনিট কাজ করেছেন, তা হিসাব করুন। এটি হলো মিনিটে প্রস্তুতির সময় এবং এই মুহূর্তে লাসাগনা ওভেনে যত মিনিট কাটিয়েছে তার যোগফল।

$ echo '{"actual_minutes_in_oven": 10, "number_of_layers": 2}' | jq -f lasagna.jq
{
  ...
  "total_time": 14,
  ...
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
jq Exercism

লাসাগনা শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, jq ট্র্যাকের 12টি কনসেপ্ট75টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।