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
Bütün kapların kaba kuvvetine veya numaralandırmasına gerek yok.
Uzunlukta bir dizi bakınız n olarak N -1 adımları, her bir aşama olarak, artma veya azalma.
Unutmayın, bir artışı yalnızca bir azalma için değiştirebilirsiniz, toplam 2'ye göre değişir, bu nedenle belirli bir uzunluk için toplam her zaman eşit veya her zaman tek olur.
Tüm artışlara sahip olan dizi 0, 1, 2, 3, ..., n-1'dir ve toplamın (n-1) * n / 2 olduğunu biliyoruz
. Son adımı değiştirmek, toplam 2 ile değişir, böylece son adım 2 ağırlığındadır. Son adımın bir
sonraki adımının değiştirilmesi, toplamın 4 olarak değişmesi nedeniyle son adım 4'ün ağırlığındadır. Bunun nedeni, birbirini takip eden adımın kısmi toplamı temel almasıdır.
Önceki adımı değiştirdiğinizde, toplam 6 değişir, bu nedenle son adım 6 ağırlığındadır (8 değil, ikili sayılar değildir).
...
İlk adımın değiştirilmesi (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
Kod çözülmemiş kod
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 konsolunda test et
F(8,4)
Çıktı
[0, -1, 0, -1, 0, 1, 2, 3]
(l-1)*l/2ve-(l-1)*l/2aynı pariteye sahip olan tüm sayılar olduğuna dair bir kanıtım var(l-1)*l/2.