ভূমিকা
এই সমস্যাটিতে একটি স্ট্রিং এবং একটি সংখ্যা অ্যারে দেওয়া থাকে। অ্যারেতে থাকা সংখ্যাগুলো নির্দেশ করে স্ট্রিংকে কতটুকু করে ভাগ করতে হবে। উদাহরণস্বরূপ, অ্যারে `[2, 4, 5]` মানে প্রথম ২ ক্যারেক্টার, তারপর ৪ ক্যারেক্টার, তারপর ৫ ক্যারেক্টার।
ইনপুট ও আউটপুট
// ইনপুট
const string = 'Javascript splitting string by given array element';
const arr = [2, 4, 5, 1, 3, 1, 2, 3, 7, 2];
// আউটপুট
['Ja', 'vasc', 'ript ', 's', 'pli', 't', 'ti', 'ng ', 'string ', 'by']
সম্পূর্ণ কোড
const string = 'Javascript splitting string by given array element';
const arr = [2, 4, 5, 1, 3, 1, 2, 3, 7, 2];
const splitAtPosition = (str, arr) => {
const newString = arr.reduce((acc, val) => {
return {
start: acc.start + val,
newArr: acc.newArr.concat(str.substr(acc.start, val))
};
}, {
start: 0,
newArr: []
});
return newString.newArr;
};
console.log(splitAtPosition(string, arr));
কোড ব্যাখ্যা
- reduce আর্গুমেন্ট: `{ start: 0, newArr: [] }` - আকুমুলেটর অবজেক্ট
- acc.start: বর্তমান স্ট্রিং পজিশন (শুরু কোথা থেকে)
- val: বর্তমান চাঙ্ক সাইজ (অ্যারে এলিমেন্ট)
- str.substr(acc.start, val): স্ট্রিং থেকে সাবস্ট্রিং বের করে
- রিটার্ন: আপডেটেড `start` এবং `newArr`
আউটপুট
[
'Ja', 'vasc', 'ript ', 's', 'pli',
't', 'ti', 'ng ', 'string ', 'by'
]
উন্নত ও আধুনিক পদ্ধতিগুলো
১. substring() ব্যবহার (substr ডিপ্রিকেটেড)
const splitAtPosition = (str, arr) => {
let start = 0;
return arr.map(len => {
const part = str.substring(start, start + len);
start += len;
return part;
});
};
২. for...of লুপ (স্পষ্ট ও দ্রুত)
const splitAtPosition = (str, lengths) => {
const result = [];
let index = 0;
for (const len of lengths) {
result.push(str.slice(index, index + len));
index += len;
}
return result;
};
৩. ভ্যালিডেশন যুক্ত (রোবাস্ট)
const splitAtPositionSafe = (str, lengths) => {
if (typeof str !== 'string' || !Array.isArray(lengths)) return [];
const totalLength = lengths.reduce((a, b) => a + b, 0);
if (totalLength > str.length) {
console.warn('অ্যারে সাইজ স্ট্রিং দৈর্ঘ্যের চেয়ে বড়');
}
let index = 0;
return lengths.map(len => {
const part = str.slice(index, index + len);
index += len;
return part;
});
};
সাবস্ট্রিং মেথড তুলনা
| মেথড | সিনট্যাক্স | নোট |
|---|---|---|
| slice | str.slice(start, end) | নেগেটিভ ইন্ডেক্স সাপোর্ট, প্রস্তাবিত |
| substring | str.substring(start, end) | নেগেটিভ হ্যান্ডল করে না, লিগ্যাসি |
| substr | str.substr(start, length) | **ডিপ্রিকেটেড**, এড়িয়ে চলুন |
ব্যবহারিক অ্যাপ্লিকেশন
- ফিক্সড-উইডথ পার্সিং: লিগ্যাসি ডেটা ফরম্যাট (COBOL, মেইনফ্রেম)
- প্রোটোকল পার্সিং: বাইনারি প্রোটোকল হেডার
- টেক্সট প্রসেসিং: কলাম-ভিত্তিক ডেটা এক্সট্রাকশন
সারাংশ
`reduce()` ব্যবহার করে স্টেটফুল অ্যাকুমুলেশন করা যায়, কিন্তু `for...of` বা `map` với বাহ্যিক ইনডেক্স ভেরিয়েবল বেশি পঠনযোগ্য এবং দ্রুত। `substr` এর বদলে `slice`/`substring` ব্যবহার করুন।