জাভাস্ক্রিপ্ট (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 -1 পদক্ষেপ হিসাবে দৈর্ঘ্যের n এর ক্রম দেখুন , প্রতিটি পদক্ষেপ বৃদ্ধি বা হ্রাস।
দ্রষ্টব্য, আপনি কেবল হ্রাসের জন্য একটি ইনক্রিমেন্টকে অদলবদল করতে পারেন, যোগফল 2 দ্বারা পরিবর্তিত হয়, সুতরাং যে কোনও নির্দিষ্ট দৈর্ঘ্যের জন্য যোগফল সর্বদা সমান বা সর্বদা বিজোড়।
সমস্ত ইনক্রিমেন্ট থাকার পরে, ক্রম 0, 1, 2, 3, ..., এন -1 হয় এবং আমরা জানি যে যোগফলটি (এন -1) * এন / 2
সর্বশেষ পদক্ষেপ পরিবর্তন করে, যোগফল 2 দ্বারা পরিবর্তিত হয়, সুতরাং শেষ পদক্ষেপের ওজন ২. শেষ পদক্ষেপের
পরবর্তী পরিবর্তন করাতে, যোগফলটি 4 দ্বারা পরিবর্তিত হয়, সুতরাং শেষ ধাপটির ওজন ৪ হয় That's কারণ ক্রমাগত পদক্ষেপটি আংশিক যোগফলকে এখনও পর্যন্ত গড়ে তোলে।
পূর্ববর্তী পদক্ষেপটি পরিবর্তন করে, যোগফলটি 6 দ্বারা পরিবর্তিত হয়, তাই শেষ ধাপটির ওজন 6 হয় (8 নয়, এটি বাইনারি সংখ্যা নয়)।
...
প্রথম ধাপটি পরিবর্তন করে ওজন (এন -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
।