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
Tidak perlu kekerasan atau enumerasi semua tuple.
Lihat urutan panjang n sebagai n -1 langkah, setiap langkah menjadi kenaikan atau penurunan.
Catatan, Anda hanya bisa menukar kenaikan dengan penurunan, jumlah bervariasi 2, sehingga untuk panjang tertentu jumlahnya selalu genap atau selalu ganjil.
Setelah semua kenaikan, urutannya adalah 0, 1, 2, 3, ..., n-1 dan kita tahu jumlahnya adalah (n-1) * n / 2
Mengubah langkah terakhir, jumlah berubah 2, sehingga langkah terakhir berbobot 2.
Mengubah langkah berikutnya ke langkah terakhir, jumlah berubah dengan 4, jadi langkah terakhir berbobot 4. Itu karena langkah berturut-turut dibangun berdasarkan jumlah parsial sejauh ini.
Mengubah langkah sebelumnya, jumlah berubah dengan 6, jadi langkah terakhir beratnya 6 (bukan 8, itu bukan angka biner).
...
Mengubah langkah pertama berbobot (n-1) * 2
Algoritma
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
Kode tidak dikunci
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
}
Uji di Firefox / konsol FireBug
F(8,4)
Keluaran
[0, -1, 0, -1, 0, 1, 2, 3]
(l-1)*l/2dan-(l-1)*l/2yang memiliki paritas yang sama dengan(l-1)*l/2.