JavaScript (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
ไม่ต้องการแรงเดรัจฉานหรือการแจกแจงของ tuples ทั้งหมด
ดูลำดับความยาวnเป็นn -1 ขั้นตอนแต่ละขั้นตอนเป็นการเพิ่มหรือลด
หมายเหตุคุณสามารถสลับการเพิ่มขึ้นเพื่อการลดลงเท่านั้นจำนวนรวมจะแปรผันตาม 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
}
ทดสอบในคอนโซล Firefox / FireBug
F(8,4)
เอาท์พุต
[0, -1, 0, -1, 0, 1, 2, 3]
(l-1)*l/2และที่มีความเท่าเทียมกันเช่นเดียวกับ-(l-1)*l/2(l-1)*l/2