संपादित करें ::
अरे तो पता चलता है कि बहुत अधिक पुनरावृत्ति हो रही है। न लूप, न ब्रांचिंग।
फिर भी किसी भी आकार के एन के लिए दाएं रोटेशन के लिए नकारात्मक एन और बाएं एन के लिए पॉजिटिव एन के साथ काम करता है, म्यूटेशन फ्री
function rotate(A,n,l=A.length) {
const offset = (((n % l) + l) %l)
return A.slice(offset).concat(A.slice(0,offset))
}
यहाँ गिगल्स के लिए कोड गोल्फ संस्करण है
const r = (A,n,l=A.length,i=((n%l)+l)%l)=>A.slice(i).concat(A.slice(0,i))
EDIT1 :: *
शाखा रहित, उत्परिवर्तन रहित कार्यान्वयन।
तो हे, पता चला कि मेरे पास एक शाखा थी जहां मुझे इसकी आवश्यकता नहीं थी। यहाँ एक काम कर समाधान है। ऋणात्मक संख्या = सही घुमाएँ | संख्या | पॉजिटिव संख्या = बाएं घुमाकर संख्या
function r(A,n,l=A.length) {
return A.map((x,i,a) => A[(((n+i)%l) + l) % l])
}
समीकरण ((n%l) + l) % l
n के किसी भी मनमाने ढंग से बड़े मूल्यों के बिल्कुल सकारात्मक और नकारात्मक संख्याओं को दर्शाता है
मूल
दाएं और बाएं घुमाएं। सकारात्मक के साथ बाईं ओर घुमाएं n
, नकारात्मक के साथ दाएं घुमाएं n
।
के बड़े अश्लील इनपुट के लिए काम करता है n
।
कोई म्यूटेशन मोड नहीं। इन उत्तरों में बहुत अधिक उत्परिवर्तन।
इसके अलावा, अधिकांश उत्तरों की तुलना में कम संचालन। कोई पॉप नहीं, कोई धक्का नहीं, कोई ब्याह नहीं, कोई बदलाव नहीं।
const rotate = (A, num ) => {
return A.map((x,i,a) => {
const n = num + i
return n < 0
? A[(((n % A.length) + A.length) % A.length)]
: n < A.length
? A[n]
: A[n % A.length]
})
}
या
const rotate = (A, num) => A.map((x,i,a, n = num + i) =>
n < 0
? A[(((n % A.length) + A.length) % A.length)]
: n < A.length
? A[n]
: A[n % A.length])
rotate([...Array(5000).keys()],4101)
rotate([...Array(5000).keys()],-4101000)
[...Array(5000).keys()].forEach((x,i,a) => {
console.log(rotate(a,-i)[0])
})
[...Array(5000).keys()].forEach((x,i,a) => {
console.log(rotate(a,i*2)[0])
})
स्पष्टीकरण:
अनुक्रमणिका ऑफसेट पर A के प्रत्येक अनुक्रमणिका के मान को मैप करें। इस मामले में
offset = num
अगर offset < 0
तब offset + index + positive length of A
उलटा ऑफसेट को इंगित करेगा।
यदि offset > 0 and offset < length of A
तब बस वर्तमान सूचकांक को A के ऑफसेट इंडेक्स में मैप करें।
अन्यथा, सरणी की सीमा में ऑफसेट मैप करने के लिए ऑफसेट और लंबाई modulo।
उदाहरण के लिए ले लो offset = 4
और offset = -4
।
जब offset = -4
, और A = [1,2,3,4,5]
, प्रत्येक सूचकांक के लिए, offset + index
परिमाण (या Math.abs(offset)
) छोटा कर देगा।
आइए पहले नकारात्मक n के सूचकांक के लिए गणना की व्याख्या करें। A[(((n % A.length) + A.length) % A.length)+0]
और धमकाया गया। मत बनो। इसे काम करने में मुझे 3 मिनट लगे।
- हम जानते हैं
n
कि नकारात्मक है क्योंकि मामला है n < 0
। यदि संख्या ऐरे की सीमा से बड़ी है, तो इसे रेंज में n % A.length
मैप करेगा।
n + A.length
A.length
सही मात्रा में ऑफसेट करने के लिए उस संख्या को जोड़ें ।
- हम जानते हैं
n
कि नकारात्मक है क्योंकि मामला है n < 0
। सही मात्रा में ऑफसेट n + A.length
करने के A.length
लिए उस संख्या को जोड़ें ।
अगला इसे मोडुलो का उपयोग करके ए की लंबाई की सीमा तक मैप करें। गणना के परिणाम को एक अनुक्रमिक सीमा में मैप करने के लिए दूसरा मोडुलस आवश्यक है
पहला सूचकांक: -4 + 0 = -4। A.length = 5. A.length - 4 = 1. A 2 है 2. मैप इंडेक्स 0 से 2।[2,... ]
- अगला सूचकांक, -4 + 1 = -3। 5 + -3 = 2. ए 2 है 3. मैप इंडेक्स 1 से 3।
[2,3... ]
- आदि।
उसी प्रक्रिया पर लागू होता है offset = 4
। जब offset = -4
, और A = [1,2,3,4,5]
, प्रत्येक सूचकांक के लिए, offset + index
परिमाण को बड़ा बना देगा।
4 + 0 = 0
। A [4] के मूल्य पर मैप A [0]।[5...]
4 + 1 = 5
, 5 अनुक्रमण के दौरान सीमा से बाहर है, इसलिए शेष के मूल्य पर A 2 को मैप करें 5 / 5
, जो कि A [0] पर 0. A 2 = मान है।[5,1...]
- दोहराएँ।
months[new Date().getMonth()]
वर्तमान महीने का नाम पाने के लिए सिर्फ इसका उपयोग क्यों नहीं करते ?