Skip to content

Chapter 10: JavaScript Problem Solving -Part 1

10-1: উচ্চতার উষ্ণতা

বিয়ের বাজারে দেখা যায়, পাত্র বা পাত্রীর উচ্চতা যদি 5 ফুট 4 ইঞ্চি হয়, আমরা সেটাকে একটু বাড়িয়ে বলি 5 ফুট সাড়ে 4 ইঞ্চি বা 5 ফুট পৌনে 5 ইঞ্চি। কেউ কেউ আরও এক কাঠি সরস, তারা চালাকি করে উচ্চতাকে সেন্টিমিটার বা ইঞ্চিতে বলে। যাতে মানুষ সহজেই আঁচ করতে না পারে, সরাসরি তুলনা করতে না পারে।

তবে আমরা চালাকি করব না; বরং ইঞ্চি থেকে ফুটে কনভার্ট করব, যাতে সবাই সহজে বুঝতে পারে। এ ছাড়া আমরা সবাই জানি যে, 12 inch = 1 feet।

প্রথমে, একটি ফাংশন লিখে নাম দিবি inchToFeet এবং এখানে ইনপুট নিবি ইঞ্চি (inch) হিসেবে। ইঞ্চি থেকে ফুটে কনভার্ট করার জন্য ইঞ্চিকে 12 দিয়ে ভাগ করতে হবে। ফাংশনটি দেখতে এমন হবে:

javascript
function inchToFeet(inch) {
  const feet = inch / 12;
  return feet;
}

const shuvoHeight = inchToFeet(75);
console.log(shuvoHeight);

// Output: 6.25

এখানে কোড দেখে তুই নিশ্চয়ই বুঝতে পারছিস, কী হয়েছে। প্রথমে আমরা একটি ফাংশন লিখেছি, যেখানে ইঞ্চিকে 12 দিয়ে ভাগ করে সেটিকে feet নামে একটি ভেরিয়েবলে রাখতেছি এবং সেটাকে return করতেছি। এরপর ফাংশনটি কল করে আউটপুট দেখতেছি, যা হলো 6.25 ফুট।

ধর, তুই যেহেতু আউটপুটে দেখতে চাইছিস "6 feet 3 inches", এতে করে আমাদের কাজটা একটু ভালো হবে। ধর, কারো উচ্চতা যদি 75 ইঞ্চি হয়, তাহলে এখানে আমাদের দুইটা কাজ করতে হবে। প্রথমে 75 ইঞ্চিকে 12 দিয়ে ভাগ করলে 6 ফুট এবং অবশিষ্ট 3 ইঞ্চি পাওয়া যাবে। এখন ফাংশনটি এমনভাবে লিখতে হবে:

javascript
function inchToFeet2(inch) {
  const feetFraction = inch / 12;
  const feetNumber = parseInt(feetFraction);

  const inchRemaining = inch % 12;
  const result = feetNumber + " ft " + inchRemaining + " inch.";

  return result;
}

const shuvoHeight = inchToFeet2(75);
console.log(shuvoHeight);

// Output: 6 ft 3 inch.

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

javascript
function mileToKilometer(mile) {
  const kilo = mile * 1.60934;
  return kilo;
}

এইবার চেষ্টা কর, কীভাবে কিলোমিটার থেকে মাইলে কনভার্ট করতে পারবি।

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

Practice:

  1. তুই জানস, 1760 গজে একমাইল। তাহলে একটা ফাংশন লিখে ফেল, যাতে বের করতে পারিস, 13 মাইলে কত গজ।
  2. শুনতে কঠিন, কিন্তু চিন্তা করলে সহজ একটা বিষয় হচ্ছে, 1 কিলোওয়াট ঘণ্টা মানে 860 কিলো ক্যালরি। তাহলে একটা ফাংশন লিখে বের কর। যেটাতে যেকোনো কিলোওয়াট ঘণ্টা দিলে সে সেটাকে কিলো ক্যালরিতে কনভার্ট করে দিবে।
  3. ঘণ্টাকে সেকেন্ডে কনভার্ট করতে একটি ফাংশন বানা। এক ঘণ্টাতে কত মিনিট বা এক মিনিটে কত সেকেন্ড। সেটা আমি বলে দিচ্ছি না। তুই চিন্তা করে বের কর এবং আমাকে একটা ফাংশন লিখে দে, যেটা ঘণ্টা দিলে আমাকে সেকেন্ডে কনভার্ট করে দিবে।
  4. সেন্টিমিটারকে মিটারে কনভার্ট করার জন্য একটি ফাংশন তৈরি কর। তারপর বিভিন্ন মান দিয়ে সেই ফাংশনকে টেষ্টা কর। আর তুই তো জানস, 1 মিটার = 100 সেন্টিমিটার।
  5. ইঞ্চিকে সেন্টিমিটারে রূপান্তর করার ফাংশন লিখ। 1 ইঞ্চি = 2.54 সেন্টিমিটার।
  6. যদি 1 পাউন্ড = 0.453 কিলোগ্রাম হলে পাউন্ড থেকে কিলোগ্রামে কনভার্ট করার একটা ফাংশন লিখে ফেল।
  7. গজকে মিটারে কনভার্ট করার জন্য একটি ফাংশন তৈরি কর। 1 গজ = 0.91 মিটার

10-2: লিপি আপার লিপ ইয়ার

চার বছর পর পর এক বছর পৃথিবী একটু অলস হয়ে যায়। তখন 365 দিনে সূর্যের চারপাশে ঘুরতে গিয়ে আলসেমি করে 1 দিন বেশি লাগায় ফেলে। তখন বাধ্য হয়ে 365 দিনে বছর না হয়ে 366 দিনে এক বছর হয়। সেই একদিন এক্সট্রাওয়ালা বছরকে লিপ ইয়ার (Leap Year) বলে।

এখন একটা প্রোগ্রাম লিখ, যেটা দিয়ে বোঝা যাবে, কোনো একটি বছর Leap Year কি না। যদিও কোনো একটি বছর Leap Year কি না, তা বোঝার জন্য দুটি সিস্টেম রয়েছে:

সহজ-সরল একটু গরল

কোনো একটি বছরকে 4 দিয়ে ভাগ করলে যদি কোনো ভাগশেষ না থাকে, তবে সেটি Leap Year। এখন একটা ফাংশন লেখ, যেটার মধ্যে year নামে একটা প্যারামিটার আছে, আর সেটিকে 4 দিয়ে ভাগ করবি। যদি ভাগশেষ 0 হয়, তাহলে true রিটার্ন করবি, অর্থাৎ বছরটি Leap Year। অন্যথায়, false রিটার্ন করবি।

উদাহরণস্বরূপ, 2043 সাল Leap Year নয়, কিন্তু 2052 সাল Leap Year।

javascript
function isLeapYear(year) {
  if (year % 4 === 0) {
    return true;
  } else {
    return false;
  }
}

const isLipi1 = isLeapYear(2043);
const isLipi2 = isLeapYear(2052);
console.log(isLipi1);
console.log(isLipi2);

// Output:
// false
// true

এই সিস্টেমটি 100% সঠিক ফলাফল দেয় না। কারণ, শুধু 4 দিয়ে ভাগ গেলেই সব সময় লিপ ইয়ার হয়ে যায় না।

কিছু কিছু বছর ঝামেলা করে। বিশেষ করে শতকওয়ালা বছরগুলা ঝামেলা করে। সেজন্য 2100 সাল 4 দিয়ে ভাগ যায়, কিন্তু এইটা লিপ ইয়ার না। একইভাবে 2300 সাল 4 দিয়ে ভাগ হলেও লিপ ইয়ার না। অন্যদিকে 2400 সাল 4 দিয়ে বিভাজ্য, এইটা লিপ ইয়ার। অর্থাৎ শুধু 4 দিয়ে ভাগ হলেও সব বছর লিপ ইয়ার হয়ে যাবে না। আরেকটু কিন্তু আছে।

ভেজাইল্লা সঠিক সিস্টেম

সঠিক লিপ ইয়ার বের করার সিস্টেম হচ্ছে—

  • যদি কোনো বছর 400 দিয়েও ভাগ যায়, তবে সেটি Leap Year হবে।
  • আবার যদি 400 দিয়ে ভাগ যায় না, কিন্তু 100 দিয়ে ভাগ যায়, তবে সেটি Leap Year না।
  • আর আগের হিসাবমতো শতকওয়ালা বছর বাদ দিলে যেসব বছর 4 দিয়ে ভাগ যায়, সেটা লিপ ইয়ার।
  • আর যে বছরগুলা 4 দিয়ে ভাগ যাবে না, সেই বছর লিপ ইয়ার হবে না।

আসলে এইখানে ফর্মুলা মেইন ফ্যাক্টর না; বরং লজিক বুঝে সেটাকে কোডে বসাতে পারতেছস কি না, সেটা বড় ফ্যাক্টর।

প্রথম কাজ হচ্ছে, 400 দিয়ে ভাগ যাচ্ছে কি না। গেলেই সেটা লিপ ইয়ার। তারপর এর লজিক হচ্ছে 400 দিয়ে ভাগ না গেলে যদি 100 দিয়ে ভাগ যায়, তাহলে সেটা লিপ ইয়ার হবে না।

এইটুক যদি আমরা কোড লিখি, তাইলে কী হবে।

javascript
function isLeapYear(year) {
  if (year % 400 === 0) {
    return true;
  } else if (year % 400 !== 0 && year % 100 === 0) {
    return false;
  }
}

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

javascript
function isLeapYear(year) {
  if (year % 400 === 0) {
    return true;
  } else if (year % 100 === 0) {
    return false;
  }
}

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

javascript
function isLeapYear(year) {
  if (year % 400 === 0) {
    return true;
  } else if (year % 100 === 0) {
    return false;
  } else if (year % 4 === 0) {
    return true;
  } else {
    return false;
  }
}

const isLipi1 = isLeapYear(2100);
const isLipi2 = isLeapYear(2400);
const isLipi3 = isLeapYear(1900);
const isLipi4 = isLeapYear(2052);

console.log(isLipi1, isLipi2, isLipi3, isLipi4);

// Output: false true false true

এখানে দেখা যাচ্ছে, 2100 এবং 1900 সাল Leap Year নয়, কিন্তু 2400 এবং 2052 সাল Leap Year।

যদি এই লজিকটি প্রথমে সম্পূর্ণভাবে না বোঝা যায়, তাহলে চিন্তামুক্ত থাক। কারণ, একজন সুস্থ-সবল-স্বাভাবিক মানুষ প্রথম ধাক্কায় সব কিছু বুঝবে না; বরং অল্পকিছু জিনিস বুঝবি, আর বেশির ভাগ জিনিসই মাথার ওপর দিয়ে যাবে। আর যদি কোনো কারণে তুই এই জিনিস প্রথম ধাক্কায় বুঝে ফেলিছ, তাহলে সবাইকে দাওয়াত দিয়ে মেজবান খাওয়াইবি— তুই একটা জিনিয়াস।

Practice:

  1. একটা function লিখ, যেটা একটা income amount প্যারামিটার হিসেবে নিবে এবং কোনো tax bracket-এ পড়ে সেটা রিটার্ন করবে। ইনকাম যদি ≤ 50,000-এর নিচে হয়, তাহলে 10 রিটার্ন করবে। ইনকাম 50,001–100,000-এর মধ্যে হলে 20 ট্যাক্স হবে। আবার 100,001–200,000-এর মধ্যে হলে 30, আর $200,000 ওপরে হলে 40 পার্সেন্ট ট্যাক্স হবে। ফাংশন থেকে শুধু সংখ্যা রিটার্ন করবি। কোনো পার্সেন্টেজ চিহ্ন রিটার্ন করবি না।
  2. একটা প্যাকেজ ডেলিভারির খরচ হিসাব কর। যেখানে 10kg-এর কম হলে 100 টাকা। আর 20kg-এর কম হলে 300 টাকা। 50 kg-এর কম হলে 1000 টাকা। আর তার বেশি হলে কেজিপ্রতি 100 টাকা করে খরচ দিতে হবে।
  3. একটা function বানা, যেটা marks input নিবে এবং তারপর 80 বা তার ওপরে হলে A, 70 থেকে 79 হলে B, 60 থেকে 69-এর মধ্যে হলে C, 50 থেকে 59-এর মধ্যে হলে D, আর 50-এর নিচে হলে F গ্রেড return করবে।
  4. একটি ফাংশন লিখ যেটা ইনপুট হিসেবে একটা অ্যারে নিবে যে অ্যারের মধ্যে অনেকগুলা বছর থাকবে। তারপর সেই অ্যারের মধ্যে যতগুলো লিপ ইয়ার আছে সেটা কাউন্ট করবে। ফাইনালি মোট কয়টা লিপইয়ারওয়ালা বছর পাইছে সেই সংখ্যাটা রিটার্ন করবে।

10-3: বিজোড় সংখ্যার আজিব গড়

এইবার তোর কাজ হলো, একটি অ্যারের বিজোড় সংখ্যাগুলোর গড় বা এভারেজ বের করা।

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

১. তুই জানস, একটি অ্যারেতে লুপ চালিয়ে প্রতিটি উপাদানকে পাওয়া যায়। ২. তুই এইটাও জানস, একটি সংখ্যা জোড় নাকি বিজোড়, সেটা চেক করা যায়। ৩. লুপ চালিয়ে কীভাবে একাধিক সংখ্যার সমষ্টি বা যোগফল বের করা যায়, সেটাও তুই জানস। ৪. এমনকি ভাগ কীভাবে করতে হয়, সেটাও জানস।

অর্থাৎ এই সমস্যা সমাধান করার জন্য যা যা দরকার, তার সবই তুই জানস। শুধু ধৈর্য ধরে ধাপে ধাপে ঠান্ডা মাথায় একটার পর একটা কাজ করতে পারলেই সব কাজ হয়ে যাবে।

স্টেপ-১: একটা বেসিক ফাংশন লিখে ফেল

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

javascript
function oddAverage() {}

স্টেপ-২: প্যারামিটার হিসেবে একটা array পাঠিয়ে দে

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

এই কাজ তুই আগেও করছস। এমনকি সেই লুপের ভিতরে তুই অ্যারের প্রতিটা উপাদান কনসোল লগ করতে পারবি। জাস্ট সিম্পলভাবে নিচের মতো করে।

javascript
function oddAverage(numbers) {
  for (const number of numbers) {
    console.log(number);
  }
}

const nums = [12, 13, 65, 11, 24, 31];
oddAverage(nums);

// Output: 12 13 65 11 24 31

এইবার দেখ, একটু একটু করে খেলা জমতে শুরু করছে। এখন জাস্ট ধাপে ধাপে মোমেন্টাম ধরে এগুতে থাক। ঠিকই শেষ পর্যন্ত চলে যেতে পারবি।

স্টেপ-৩: বিজোড়সংখ্যা রাখার জন্য একটা array ডিক্লেয়ার কর

এখন লুপের ভিতরে চেক কর কোনো কোনো উপাদান বিজোড় কিনা। যদি বিজোড় হয়, তাহলে সেই উপাদানকে array-এর মধ্যে পুশ করে দে।

javascript
function oddAverage(numbers) {
  const odds = [];
  for (const number of numbers) {
    if (number % 2 === 1) {
      odds.push(number);
    }
  }
}

স্টেপ-৪: বিজোড়সংখ্যাগুলোর array দেখ

আগের স্টেপে তুই বিজোড়সংখ্যাগুলোর একটা array নিয়েছিস। সেটাকে লুপের বাইরে console log করে আউটপুট দেখ। মনে রাখবি, console কিন্তু for লুপের বাইরে করতে হবে।

javascript
function oddAverage(numbers) {
  const odds = [];
  for (const number of numbers) {
    if (number % 2 === 1) {
      odds.push(number);
    }
  }
  console.log(odds);
}

const nums = [12, 13, 65, 11, 24, 31];
const oddNumberAvg = oddAverage(nums);

// Output: [13, 65, 11, 31]

স্টেপ-৫: বিজোড় সংখ্যাগুলোর যোগফল বের কর

এখন যেহেতু বিজোড়সংখ্যার একটা array পেয়ে গেছিস, কাজ হচ্ছে গড় বের করা। তবে গড় বের করতে হলে আগে সবগুলা বিজোড়সংখ্যার উপাদানের যোগফল বের করতে হবে।

javascript
function oddAverage(numbers) {
  const odds = [];
  for (const number of numbers) {
    if (number % 2 === 1) {
      odds.push(number);
    }
  }

  let sum = 0;
  for (const number of odds) {
    sum += number;
  }

  console.log(sum);
}

const numbers = [42, 13, 58, 65, 81, 96, 7];
const avg = oddAverage(numbers);

// Output: 166

স্টেপ-৬: গড় বের করার জন্য বিজোড়সংখ্যাগুলো বের কর

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

javascript
function oddAverage(numbers) {
  const odds = [];
  for (const number of numbers) {
    if (number % 2 === 1) {
      odds.push(number);
    }
  }

  let sum = 0;
  for (const number of odds) {
    sum += number;
  }
  const count = odds.length;
  const avg = sum / count;
  return avg;
}

const numbers = [42, 13, 58, 65, 81, 96, 7];
const avg = oddAverage(numbers);
console.log("Average of the odd numbers is: ", avg);

// Output: Average of the odd numbers is: 41.5

স্টেপ-৭: বিভিন্ন array দিয়ে টেস্ট কর

এই রকম একটা ফাংশন লিখলে শুধু একটা array দিয়ে চেক করলে হবে না; বরং বিভিন্ন array দিয়ে চেক কর, যাতে নিশ্চিত হতে পারিস যে, ঠিকমতো কাজ করছে কি না।

javascript
const numbers = [7];
const avg = oddAverage(numbers);
console.log("Average of the odd numbers is: ", avg);

// Output: Average of the odd numbers is: 7

স্টেপ-৮: কোনো বিজোড়সংখ্যা না থাকলে NaN দেখাচ্ছে কেন?

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

javascript
const numbers = [72, 14, 84, 116];
const avg = oddAverage(numbers);
console.log("Average of the odd numbers is: ", avg);

// Output: Average of the odd numbers is: NaN

স্টেপ-৯: NaN সমস্যা সমাধান

প্রথমে বুঝতে হবে, এইটা কেন হচ্ছে। এইটা হওয়ার কারণ হচ্ছে, যদি কোনো কারণে ইনপুট array-এর মধ্যে কোনো বিজোড় উপাদান না থাকে, তাহলে সেই array-এর length শূন্য (0) হয়ে যায়। অর্থাৎ odds.length-এর মান শূন্য হয়। সে কারণে count ভেরিয়েবলের মান 0 হয়ে যায়। তারপর তুই যখন কোনো কিছুকে 0 দিয়ে ভাগ করবি, সেটা অসীম হয়ে যায়। এইটাকে জাভাস্ক্রিপ্ট NaN দিয়ে প্রকাশ করে। অর্থাৎ Not A Number-এর সংক্ষিপ্ত রূপ NaN হয়।

এই সমস্যা তুই একাধিকভাবে সল্ভ করতে পারবি। একটা সিম্পল সিস্টেম হবে। যদি বিজোড়সংখ্যার array-এর উপাদানের সংখ্যার মান শূন্য হয়, সেটা একটা if দিয়ে চেক করে তুই গড়কে 0 হিসেবে রিটার্ন করে দিতে পারিস।

javascript
function oddAverage(numbers) {
  const odds = [];
  for (const number of numbers) {
    if (number % 2 !== 0) {
      odds.push(number);
    }
  }

  if (odds.length === 0) {
    return 0; // or another appropriate value
  }

  let sum = 0;
  for (const number of odds) {
    sum += number;
  }
  const avg = sum / odds.length;
  return avg;
}

const numbers1 = [2, 4, 6, 8, 10];
const avg1 = oddAverage(numbers1);
console.log("Average of the odd numbers is: ", avg1);

// Output: Average of the odd numbers is: 0

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

Practice:

  1. একটি অ্যারের জোড়সংখ্যাগুলোর গড় বা এভারেজ বের করার একটা ফাংশন লিখ এবং বিভিন্ন মান দিয়ে সেই ফাংশনকে চেক করবি, ঠিক রেজাল্ট দিচ্ছে কি না।
  2. একটা অ্যারের বিজোড় সংখ্যাগুলাকে 2 দিয়ে গুণ করে একটি নতুন অ্যারে বানিয়ে নতুন অ্যারে রিটার্ন কর।
  3. একটি অ্যারেতে যদি বিজোড়সংখ্যা না থাকে, তবে "No odd numbers found" দেখানোর ব্যবস্থা কর। আর যদি বিজোড়সংখ্যা থাকে, তাহলে "Odd numbers found" রিটার্ন কর।
  4. একটি অ্যারেতে বিজোড়সংখ্যাগুলোর গড় বের করে দশমিকের পরে দুই ঘর পর্যন্ত মান রিটার্ন কর।
  5. অ্যারেতে প্রতিটি বিজোড় সংখ্যা থেকে 1 বিয়োগ করে একটি নতুন অ্যারে বানিয়ে ফেল।

10-4: যমজ বিরিয়ানি

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

এই কাজটা যেন করতে না পারে, অর্থাৎ একটা লাইনে যেন একই মানুষ বারবার দাঁড়াতে না পারে বা একটা array-এর মধ্যে একই মান বা একই উপাদান যেন একাধিকবার না থাকে, সেই কাজ তোকে করতে হবে। আর যদি কোনো কারণে কোনো একটা মান একাধিকবার চলে আসে, তাহলে সেগুলাকে রিমুভ করে দিতে হবে বা অ্যারে থেকে ডুপ্লিকেট মানগুলোকে সরিয়ে ক্লিন একটা অ্যারে হবে, যেখানে একইমান একাধিকবার নাই।

ধর, আমাদের কাছে দুটি অ্যারে রয়েছে:

javascript
const students = ["abul", "babul", "cabul", "abul", "babul", "dabul"];
const numbers = [1, 5, 61, 5, 87, 7, 5, 81, 61];

একটু ভালো করে খেয়াল করলে দেখবি, দুইটা অ্যারের মধ্যেই কয়েকটা মান একাধিকবার আছে। অর্থাৎ কিছু ভ্যালু ডুপ্লিকেট আছে। এখন কাজ হচ্ছে ডুপ্লিকেট সরিয়ে ফেলা। অর্থাৎ যেসব মান একাধিকবার আছে, সেগুলা জাস্ট একবার থাকবে।

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

javascript
const students = ["abul", "babul", "cabul", "abul", "babul", "dabul"];
const numbers = [1, 5, 61, 5, 87, 7, 5, 81, 61];

function noDuplicate(array) {
  const unique = [];
  for (const item of array) {
    if (unique.includes(item) === false) {
      unique.push(item);
    }
  }
  return unique;
}

const uniqueArray = noDuplicate(students);
console.log(uniqueArray);

// Output:
// [ 'abul', 'babul', 'cabul', 'dabul' ]

যখন নতুন অ্যারেটাকে প্রিন্ট করবি, তখন দেখবি ডুপ্লিকেটগুলো অলরেডি রিমুভ হয়ে গেছে।

Practice:

  1. ডুপ্লিকেট রিমুভ করার পুরা কোড নিজে বুঝে বুঝে লিখে এই অ্যারে [1, 5, 61, 5, 87, 7, 5, 81, 61]; দিয়ে চেক করবি।

10-5: অদলবদল ভোম্বল

গ্রামের মানুষের কাছে মনে হয়, শহর ভালো। তারা গ্রাম ছেড়ে শহরে যেতে চায়। অন্যদিকে শহরের মানুষদের কাছে মনে হয়, গ্রাম ভালো। তারা শহর ছেড়ে গ্রামে যেতে চায়। একইভাবে ধনী মানুষ— গরিবের মতো স্বাধীন হতে চায়। গরিব মানুষেরা ধনীদের মতো বিত্তশালী হতে চায়। এমনকি সিঙ্গেল পোলাপান প্রেম করতে চায়। আর যারা প্রেম করে, তারা সিঙ্গেল হতে চায়।

সবাই যার যার জায়গা থেকে অদলবদল হতে চায়। সেই অদলবদলের চক্করে তোর কাছে দুইটা ভেরিয়েবল আছে। যেমন:

javascript
let a = 5;
let b = 7;

এইখানে a চায় b-এর মান পেতে। আবার b চায় a-এর মান পেতে। অর্থাৎ তাদের মান অদল-বদল হতে চায়। অর্থাৎ a-এর মান 5 না হয়ে 7 হবে, আবার অপরদিকে b-এর মান 7 না হয়ে 5 হবে।

এখন তুই যদি চিন্তা করিছ– আমি এর পরের লাইনে a = b করে দিলেই আমার কাজ হয়ে যাবে, তা কিন্তু না। কারণ a = b করার মাধ্যমে a = 7 হচ্ছে ঠিকই। তারপর b = a দিলে, a-এর মান যেহেতু 7 আছে, তাই b-এর মানও 7 থাকবে।

javascript
let a = 5;
let b = 7;
console.log(a, b);

a = b;
b = a;
console.log(a, b);

// Output:
// 5 7
// 7 7

তাহলে এক্ষেত্রে কী করা দরকার?

এই জিনিসটা সমাধান করার জন্য অনেক টেকনিক আছে, তার মধ্যে একটা টেকনিক হচ্ছে temp টেকনিক বা টেম্পোরারি ভেরিয়েবল টেকনিক। অর্থাৎ আমরা আরও একটি ভেরিয়েবল ডিক্লার করব, যেটার নাম দিব temp এবং এই temp ভেরিয়েবলে প্রথমেই আমরা আমাদের a ভেরিয়েবলের মান অ্যাসাইন করে দিব, অর্থাৎ temp = a লিখে।

তাহলে আমাদের a-এর মান এখন temp-এর মধ্যে রয়েছে। এর পরবর্তীতে আমরা আমাদের সেই আগের কাজটা করতে পারি a = b, এটা করার মাধ্যমে এখন a-এর মান আপডেট হয়ে 7 হয়ে যাবে। আর a-এর আগের মান যেহেতু temp-এ সেট করা আছে, তাই সর্বশেষ b = temp করে দিব। এর মাধ্যমে b-এর মধ্যে আমাদের পূর্ববর্তী a-এর মান চলে আসবে।

javascript
let a = 5;
let b = 7;
console.log(a, b);

const temp = a;
a = b;
b = temp;
console.log(a, b);

// Output:
// 5 7
// 7 5

জিনিসটা তুই নিজে নিজে visualize করার চেষ্টা কর, তাহলে অনেক বেশি ক্লিয়ার হবে বলে আমি মনে করি।

আরও অনেকভাবে তুই দুইটা ভেরিয়েবলের মান এক্সচেইঞ্জ করতে পারবি। আমি তো জাস্ট একটা সিস্টেম দেখালাম।

Released under the MIT License.