সমস্যা বিবরণ
সর্টেড (আরোহী) নাম্বার অ্যারে দেওয়া আছে। প্রতিটি এলিমেন্টের জন্য পরবর্তী সব এলিমেন্টের সাথে দূরত্ব (ডিফারেন্স) বের করে সাব-অ্যারে বানাতে হবে। লাস্ট এলিমেন্ট বাদ দেওয়া হবে।
ইনপুট: [2, 5, 7, 8, 9]
আউটপুট: [[3,5,6,7], [2,3,4], [1,2], [1]]
সমাধান
const arr = [2, 5, 7, 8, 9];
const distanceBetween = (arr, r = []) => {
if (r.length <= arr.length - 2) {
let temp = [];
let b = arr[r.length];
arr.forEach(e => temp.push(e - b));
r.push(temp.filter(e => e > 0));
return distanceBetween(arr, r);
} else {
return r;
}
};
console.log(distanceBetween(arr));
আউটপুট
[ [ 3, 5, 6, 7 ], [ 2, 3, 4 ], [ 1, 2 ], [ 1 ] ]
ব্যাখ্যা
- রিকার্সিভ ফাংশন:
r.lengthট্র্যাক করে কোন ইন্ডেক্সে আছি। b = arr[r.length]বেস এলিমেন্ট।arr.forEachদিয়ে সব এলিমেন্ট থেকেbবিয়োগ করা।filter(e => e > 0)দিয়ে শুধু পজেটিভ ডিফারেন্স (পরে এলিমেন্টগুলো) রাখা।
ইটেরেটিভ ভার্সন (বেশি রিডেবল)
const distanceBetweenIter = arr =>
arr.slice(0, -1).map((val, i) =>
arr.slice(i + 1).map(v => v - val)
);