जावास्क्रिप्ट (E6) 79 82
F=(n,t,
d=n+n*~-n/4-t/2,
l=1,
q=[for(x of Array(n))d<n--?++l:(d+=~n,--l)]
)=>d?[]:q
सभी टुपल्स की क्रूरता बल या गणना की कोई आवश्यकता नहीं है।
N n -1 चरणों के रूप में लंबाई n का एक क्रम देखें , प्रत्येक चरण वेतन वृद्धि या वृद्धि है।
ध्यान दें, आप केवल वेतन वृद्धि के लिए एक वेतन वृद्धि स्वैप कर सकते हैं, राशि 2 से भिन्न होती है, इसलिए किसी भी लंबाई के लिए राशि हमेशा या हमेशा विषम होती है।
सभी वेतन वृद्धि के बाद, अनुक्रम 0, 1, 2, 3, ..., n-1 है और हम जानते हैं कि योग है (n-1) * n / 2
अंतिम चरण को बदलना, योग 2 से बदलता है, इसलिए अंतिम चरण का वजन 2. अंतिम चरण
में अगला परिवर्तन, योग 4 से बदलता है, इसलिए अंतिम चरण का वजन 4 होता है। ऐसा इसलिए है क्योंकि क्रमिक चरण आंशिक योग पर अब तक का निर्माण करता है।
पिछले चरण को बदलते हुए, योग 6 से बदल जाता है, इसलिए अंतिम चरण का वजन 6 होता है (8 नहीं, यह द्विआधारी संख्या नहीं है)।
...
पहले चरण का वजन बदलना (n-1) * 2
कलन विधि
Find the max sum (all increments)
Find the difference with the target sum (if it's not even, no solution)
Seq[0] is 0
For each step
Compare current difference with the step weight
if is less
we have an increment here, seq[i] = seq[i-1]+1
else
we have a decrement here, seq[i] = seq[i-1]-1.
Subtract we current weight from the current diff.
If remaining diff == 0, solution is Seq[]. Else no solution
अघोषित कोड
F=(len,target)=>{
max=(len-1)*len/2
delta = max-target
seq = [last=0]
sum = 0
weight=(len-1)*2
while (--len > 0)
{
if (delta >= weight)
{
--last
delta -= weight;
}
else
{
++last
}
sum += last
seq.push(last);
weight -= 2;
}
if (delta) return [];
console.log(sum) // to verify
return seq
}
फ़ायरफ़ॉक्स / फायरबग कंसोल में टेस्ट करें
F(8,4)
उत्पादन
[0, -1, 0, -1, 0, 1, 2, 3]
(l-1)*l/2
और-(l-1)*l/2
जिनकी संख्या समान है(l-1)*l/2
।