ট্রেন চালক

ট্রেন চালক

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

ভূমিকা

JavaScript-এ একটি বিল্ট-ইন ... অপারেটর আছে, যা অনির্দিষ্ট সংখ্যক এলিমেন্ট নিয়ে কাজ করা সহজ করে দেয়। কোন প্রসঙ্গে ব্যবহার হচ্ছে তার উপর নির্ভর করে এটিকে হয় রেস্ট অপারেটর নাকি স্প্রেড অপারেটর বলা হয়।

রেস্ট অপারেটর

রেস্ট এলিমেন্ট

কোনো অ্যাসাইনমেন্টের বাম দিকে যখন ... থাকে, তখন ওই তিনটি বিন্দুকে rest অপারেটর বলা হয়। তিনটি বিন্দুর সঙ্গে একটি ভ্যারিয়েবল নাম মিলে যা হয়, তাকে বলা হয় রেস্ট এলিমেন্ট। এটি শূন্য বা তার বেশি মান সংগ্রহ করে একটি অ্যারেতে জমা রাখে।

const [a, b, ...everythingElse] = [0, 1, 1, 2, 3, 5, 8];
a;
// => 0
b;
// => 1
everythingElse;
// => [1, 2, 3, 5, 8]

লক্ষ্য করুন, অন্য কিছু ভাষার মতো নয়, JavaScript-এ একটি rest এলিমেন্টের শেষে কমা থাকতে পারে না। ডিস্ট্রাকচারিং অ্যাসাইনমেন্টে এটি অবশ্যই শেষ এলিমেন্ট হতে হবে। নিচের উদাহরণটি একটি SyntaxError থ্রো করে:

const [...items, last] = [2, 4, 8, 16]

রেস্ট প্রপার্টি

অ্যারের মতোই, রেস্ট অপারেটর দিয়ে একটি বা তার বেশি অবজেক্ট প্রপার্টি সংগ্রহ করে একটি অবজেক্টে জমা রাখা যায়।

const { street, ...address } = {
  street: 'Platz der Republik 1',
  postalCode: '11011',
  city: 'Berlin',
};
street;
// => 'Platz der Republik 1'
address;
// => {postalCode: '11011', city: 'Berlin'}

রেস্ট প্যারামিটার

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

function concat(...strings) {
  return strings.join(' ');
}
concat('one');
// => 'one'
concat('one', 'two', 'three');
// => 'one two three'

স্প্রেড

স্প্রেড এলিমেন্ট

অ্যাসাইনমেন্টের ডান দিকে যখন ... থাকে, তখন এটিকে spread অপারেটর বলা হয়। এটি একটি অ্যারে প্রসারিত করে এলিমেন্টের তালিকায় পরিণত করে। রেস্ট এলিমেন্টের বিপরীতে এটি অ্যারে লিটারাল এক্সপ্রেশনের যেকোনো জায়গায় থাকতে পারে, আর একাধিকও থাকতে পারে।

const oneToFive = [1, 2, 3, 4, 5];
const oneToTen = [...oneToFive, 6, 7, 8, 9, 10];
oneToTen;
// => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
const woow = ['A', ...oneToFive, 'B', 'C', 'D', 'E', ...oneToFive, 42];
woow;
// =>  ["A", 1, 2, 3, 4, 5, "B", "C", "D", "E", 1, 2, 3, 4, 5, 42]

স্প্রেড প্রপার্টি

অ্যারের মতোই, স্প্রেড অপারেটর দিয়ে এক অবজেক্ট থেকে অন্য অবজেক্টে প্রপার্টি কপি করা যায়।

let address = {
  postalCode: '11011',
  city: 'Berlin',
};
address = { ...address, country: 'Germany' };
// => {
//   postalCode: '11011',
//   city: 'Berlin',
//   country: 'Germany',
// }

নির্দেশনা

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

Note

অনুশীলন করার জন্য নিচের প্রতিটি কাজ সমাধান করতে রেস্ট বা স্প্রেড অপারেটর ব্যবহার করুন।

1. সব ওয়াগনের একটি তালিকা তৈরি করুন

আপনার বন্ধু প্রতিটি ওয়াগনের শনাক্তকারী (ID) টুকে রেখেছেন, তবে নির্দিষ্ট কোনো সময়ে সিস্টেমকে কতগুলো ওয়াগন প্রক্রিয়া করতে হবে তা নিয়ে তিনি কখনোই নিশ্চিত থাকেন না। এই ডেটা একটি একক array-তে গুছিয়ে রাখলে বাকি লজিস্টিকস প্রোগ্রামের জন্য কাজ অনেক সহজ হয়ে যেত।

getListOfWagons নামে একটি ফাংশন লিখুন, যা যেকোনো সংখ্যক ওয়াগন ID গ্রহণ করে; এগুলো প্রতিটি ওয়াগনের ID। প্রতিটি ID একটি ধনাত্মক ইন্টিজার হবে। এরপর ফাংশনটি প্রদত্ত IDগুলো একটি একক array হিসেবে রিটার্ন করবে।

getListOfWagons(1, 7, 12, 3, 14, 8, 5);
// => [1, 7, 12, 3, 14, 8, 5]

2. প্রথম দুটি এলিমেন্ট অ্যারের শেষে নিয়ে যান

এই পর্যায়ে এসে ডেটা এবং লজিস্টিকস প্রোগ্রামে এটি কীভাবে ব্যবহৃত হয় সে সম্পর্কে আপনি কিছুটা ধারণা পেতে শুরু করেছেন। ID সিস্টেম সবসময় লোকোমোটিভকে 1 ID দেয়, আর ট্রেনের বাকি ওয়াগনগুলোকে 1-এর চেয়ে বড় কোনো এলোমেলোভাবে বাছাই করা ID দেওয়া হয়।

আপনার বন্ধুকে ট্রেনের সাথে দুটি নতুন ওয়াগন জুড়তে হয়েছিল, কিন্তু তিনি সিস্টেম আপডেট করতে ভুলে গিয়েছিলেন! এখন ট্রেনের array-এর প্রথম দুটি ওয়াগনকে শেষে সরাতে হবে, নইলে সবকিছু এলোমেলো হয়ে যাবে।

তাঁর ভুলগুলো সংশোধন করে দিলে Linus সত্যিই আপনার কাছে কৃতজ্ঞ থাকবেন।

fixListOfWagons নামে একটি ফাংশন লিখুন, যা প্রতিটি ওয়াগনের ID-সহ একটি অ্যারে গ্রহণ করে। এটি return করে এমন একটি array, যেখানে প্রথম ২টি এলিমেন্ট array-এর শেষে সরিয়ে দেওয়া হয়, যাতে লোকোমোটিভ সবার সামনে থাকতে পারে।

eachWagonsID = [2, 5, 1, 7, 4, 12, 6, 3, 13];
fixListOfWagons(eachWagonsID);
// => [1, 7, 4,  12, 6, 3, 13, 2, 5]

3. নিখোঁজ মানগুলো যোগ করুন

উফ! মনে হচ্ছে কিছু ওয়াগন হারিয়ে গেছে।

ভাগ্য ভালো, আপনার বন্ধু এইমাত্র আরেকটি array খুঁজে পেয়েছেন, যাতে হারিয়ে যাওয়া ওয়াগন IDগুলো আছে বলে মনে হচ্ছে, এবং তিনি সেগুলো মূল ওয়াগন ID array-তে যোগ করতে চান। তিনি শুধু এটুকু মনে করতে পারছেন যে নিখোঁজ মানগুলো নির্ধারিত লোকোমোটিভের ঠিক পরেই বসাতে হবে।

এই নতুন তথ্য অনুযায়ী, correctListOfWagons নামে একটি ফাংশন লিখুন, যা আর্গুমেন্ট হিসেবে প্রতিটি ওয়াগনের ID-সহ দুটি অ্যারে নেয়। দ্বিতীয় array-এর ওয়াগন IDগুলো প্রথম array-তে লোকোমোটিভের (ID 1) ঠিক পরে যোগ করতে হবে।

eachWagonsID = [1, 5, 20, 7, 4, 8];
missingWagons = [3, 17, 6, 15];
correctListOfWagons(eachWagonsID, missingWagons);
// => [1, 3, 17, 6, 15, 5, 20, 7, 4, 8]

4. রাউটিং তথ্য সম্প্রসারিত করুন

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

extendRouteInformation নামে একটি ফাংশন লিখুন, যা দুটি object গ্রহণ করে। প্রথম object-এ থাকে ট্রেনের রুট কোন কোন শহরের মধ্যে চলাচল করে।

দ্বিতীয় object-এ থাকে ট্রেনের গতি বা দৈর্ঘ্যের মতো অন্যান্য রাউটিং বিবরণ। ফাংশনটি সব রাউটিং তথ্যসহ একটি সমন্বিত objects রিটার্ন করবে।

Note

moreRouteInformation ভ্যারিয়েবলটিতে ভিন্ন ভিন্ন প্রপার্টি থাকতে পারে।

route = { from: 'Berlin', to: 'Hamburg' };
moreRouteInformation = { length: '100', speed: '50' };
extendRouteInformation(route, moreRouteInformation);
// => {from: "Berlin", to: "Hamburg", length: "100", speed: "50"}

5. রাউটিং তথ্য থেকে পৌঁছানোর সময় আলাদা করুন

আপনার বন্ধু লক্ষ্য করেছেন যে রাউটিং তথ্যে পৌঁছানোর সময় তাঁর দরকার নেই। তাই আপনার বন্ধু চান আপনি রাউটিং তথ্য থেকে পৌঁছানোর সময় আলাদা করে দিন।

separateTimeOfArrival নামে একটি ফাংশন লিখুন, যা রাউটিং তথ্যসহ একটি অবজেক্ট গ্রহণ করে। ফাংশনটি একটি অ্যারে রিটার্ন করবে, যার প্রথম এলিমেন্ট হবে পৌঁছানোর সময় আর দ্বিতীয় এলিমেন্ট হবে পৌঁছানোর সময় ছাড়া রাউটিং তথ্যসহ একটি অবজেক্ট।

routeInformation = {
  from: 'Berlin',
  to: 'Hamburg',
  length: '100',
  timeOfArrival: '10:10',
};
separateTimeOfArrival(routeInformation);
// => ["10:10", {from: "Berlin", to: "Hamburg", length: "100"}]
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
JavaScript Exercism

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

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