each_cons() - Ruby
each_cons() एन्यूमरेबल का मेथड रूबी में एक इनबिल्ट मेथड है जो हर बार प्रत्येक तत्व से शुरू होने वाले लगातार N तत्वों के लिए पुनरावृति करता है। यदि कोई ब्लॉक नहीं दिया गया है, तो यह एन्यूमरेटर लौटाता है।
each_cons() का JS समकक्ष
मान लीजिए हमारे पास नंबर लिटरल्स का एक एरे है (इस मामले में रूबी के एन्यूमरेबल का JS समकक्ष), each_cons फ़ंक्शन एक एरे फ़ंक्शन माना जाता है जो एरे के प्रत्येक तत्व के लिए निष्पादित होता है और एकमात्र आर्गुमेंट के रूप में एक नंबर N (N <= एरे की लंबाई) स्वीकार करता है। और N आकार के सबएरे के साथ एक एरे लौटाता है जिसमें प्रत्येक सबएरे मूल एरे के सभी तत्वों से एक-एक करके शुरू होता है।
इसका एक उदाहरण चीजों को थोड़ा स्पष्ट कर देगा।
मान लीजिए हमारे पास ऐसा एरे है -
const arr = [1, 2, 3, 4, 5]; console.log(arr.eachCons(2));
eachCons की इस कॉल का मतलब है कि, यह 2 तत्वों वाले एरे का एक एरे बनाता है जैसे -
[[1, 2], [2, 3], [3, 4], [4, 5]]
ध्यान दें कि सबएरे मूल एरे के प्रत्येक तत्व के लिए तब तक बनाए जाते हैं जब तक हम ऐसा कर सकते हैं।
यदि N का मान 2 के बजाय 3 होता, तो परिणाम ऐसा दिखता -
[[1, 2, 3], [2, 3, 4], [3, 4, 5]]
फिर से, सबएरे एरे के प्रत्येक तत्व के लिए तब तक बनाए जाते हैं जब तक हमारे पास एरे में पर्याप्त तत्व हैं।
दृष्टिकोण
हम इस समस्या को हल करने के लिए स्लाइडिंग विंडो एल्गोरिदम का उपयोग करेंगे।
हालांकि हम आधुनिक ES6 फ़ंक्शन का उपयोग करके इसे दो लाइनों में हल कर सकते हैं, लेकिन पूर्व दृष्टिकोण बाद की तुलना में बहुत कुशल है।
सबसे पहले, हम एक व्हाइल लूप का उपयोग करेंगे जो 0 से N इंडेक्स तक हमारी प्रारंभिक विंडो बनाता है। फिर हम एक फॉर लूप का उपयोग करेंगे जो तब तक चलता है जब तक हमारी विंडो का अंत मूल एरे की लंबाई से कम है।
यह लूप हमारी विंडो की स्थिरता की जांच करता है (यानी, हमारी विंडो की लंबाई N के बराबर होना)। यदि विंडो स्थिर है, तो हम विंडो (वह सबएरे परिणाम एरे में डालते हैं), इसे यूनिट दूरी से दाईं ओर स्लाइड करते हैं और इसे संकुचित करते हैं (यानी, start = end)। यदि विंडो अस्थिर है, तो हम इसमें तत्व जोड़ते रहते हैं।
इस दृष्टिकोण के लिए कोड है -
उदाहरण
const arr = [1, 2, 3, 4, 5]; const eachCons = function(num){ let res = [], temp = []; let start = 0, end = 0; while(end < num){ temp.push(this[end++]); }; for(; end <= this.length ;){ if(temp.length === num){ res.push(temp); start++; end = start; temp = []; } temp[end-start] = this[end]; end++; } return res; }; Array.prototype.eachCons = eachCons; console.log([1, 2, 3, 4, 5].eachCons(1)); console.log([1, 2, 3, 4, 5].eachCons(2)); console.log([1, 2, 3, 4, 5].eachCons(3)); console.log([1, 2, 3, 4, 5].eachCons(4));आउटपुट
कंसोल में आउटपुट होगा -
[ [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ] ] [ [ 1, 2 ], [ 2, 3 ], [ 3, 4 ], [ 4, 5 ] ] [ [ 1, 2, 3 ], [ 2, 3, 4 ], [ 3, 4, 5 ] ] [ [ 1, 2, 3, 4 ], [ 2, 3, 4, 5 ] ]