কম্পিউটার টিউটোরিয়াল

JavaScript-এ অ্যারের ম্যাক্স ও মিন ভ্যালুর মধ্যবর্তী সংখ্যাগুলোর যোগফল

ভূমিকা

দুটি সংখ্যার মধ্যবর্তী সব পূর্ণসংখ্যার যোগফল বের করার একটি গাণিতিক সমস্যা। অ্যারে `[a, b]` দেওয়া থাকলে, `a` এবং `b`-র মধ্যবর্তী সব সংখ্যা (a এবং b সহ) যোগফল বের করতে হবে।

সম্পূর্ণ কোড

const arr = [10, 60];

const sumUpto = (n) => (n * (n + 1)) / 2;

const sumBetween = (array) => {
  if (array.length !== 2) return -1;
  const [a, b] = array;
  return sumUpto(Math.max(a, b)) - sumUpto(Math.min(a, b)) + Math.min(a, b);
};

console.log(sumBetween(arr));        // 1785
console.log(sumBetween([4, 9]));     // 39

গাণিতিক সূত্র

১ থেকে n পর্যন্ত যোগফল: n(n+1)/2 (গাউস সূত্র)

a থেকে b পর্যন্ত যোগফল (a ≤ b): sumUpto(b) - sumUpto(a-1)

সরলীকৃত: sumUpto(max) - sumUpto(min) + min

উদাহরণ যাচাই

[4, 7] = 4+5+6+7 = 22
sumUpto(7) - sumUpto(4) + 4 = 28 - 10 + 4 = 22 ✓

[10, 6] = 10+9+8+7+6 = 40
sumUpto(10) - sumUpto(6) + 6 = 55 - 21 + 6 = 40 ✓

আউটপুট

1785
39

বিকল্প পদ্ধতিগুলো

১. লুপ (সহজ কিন্তু ধীর - O(n))

const sumBetweenLoop = ([a, b]) => {
  const min = Math.min(a, b);
  const max = Math.max(a, b);
  let sum = 0;
  for (let i = min; i <= max; i++) sum += i;
  return sum;
};

২. Arithmetic Series Formula (O(1) - সেরা)

const sumBetweenFormula = ([a, b]) => {
  const min = Math.min(a, b);
  const max = Math.max(a, b);
  const count = max - min + 1;
  return (count * (min + max)) / 2;
};

এটি সবচেয়ে দ্রুত এবং মেমরি দক্ষ। কোনো লুপ বা রিকারশন নেই।

৩. ES6 রেঞ্জ 헬্পার (যদি উপলব্ধ থাকে)

// প্রস্তাবিত ES ফিচার (এখনও স্ট্যান্ডার্ড নয়)
const sumBetween = ([a, b]) => 
  [...Array(Math.max(a,b) - Math.min(a,b) + 1)]
    .map((_, i) => Math.min(a,b) + i)
    .reduce((a, b) => a + b, 0);

এজ কেস হ্যান্ডলিং

const sumBetweenRobust = (array) => {
  if (!Array.isArray(array) || array.length !== 2) return NaN;
  const [a, b] = array.map(Number);
  if (isNaN(a) || isNaN(b)) return NaN;
  
  const min = Math.min(a, b);
  const max = Math.max(a, b);
  const count = max - min + 1;
  return (count * (min + max)) / 2;
};

বড় সংখ্যার জন্য BigInt (ES2020)

const sumBetweenBigInt = ([a, b]) => {
  const min = BigInt(Math.min(a, b));
  const max = BigInt(Math.max(a, b));
  const count = max - min + 1n;
  return (count * (min + max)) / 2n;
};

সারাংশ

গাণিতিক সূত্র (count * (min + max)) / 2 সবচেয়ে দক্ষ (O(1))। লুপ-ভিত্তিক পদ্ধতি বড় রেঞ্জের জন্য ধীর। সবসময় ইনপুট ভ্যালিডেশন যোগ করুন।

  1. জাভাস্ক্রিপ্টে অ্যারে থেকে পজিটিভ সংখ্যার কাউন্ট ও নেগেটিভ সংখ্যার যোগফল বের করা

  2. জাভাস্ক্রিপ্টে অ্যারেতে সংখ্যাগুলোর বর্গ ও বর্গমূলের যোগফল বের করা

  3. জাভাস্ক্রিপ্টে অ্যারে সর্ট করে ক্রমাগত পার্থক্যের যোগফল বের করা

  4. অ্যারেতে প্রাইম ও নন-প্রাইম সংখ্যার যোগফলের এবসোলিউট পার্থক্য