জাভাস্ক্রিপ্ট (ES6) 126 130 104 115 156 162 194
@ কার্পেট পাইথনের উত্তরে সমস্ত মন্তব্য এবং পরীক্ষার কেস পরে আমার প্রথম অ্যালগরিদমে ফিরে আসুন। হায়, স্মার্ট সমাধানটি কাজ করে না। বাস্তবায়নটি কিছুটা ছোট করা হয়েছে, এটি এখনও সমস্ত সম্ভাব্য সমাধানের চেষ্টা করে, বর্গক্ষেত্রের দূরত্বটি গণনা করে এবং সর্বনিম্ন রাখে।
ওজন ডাব্লু এর প্রতিটি আউটপুট উপাদানগুলির জন্য সম্পাদনা করুন , 'সমস্ত' সম্ভাব্য মানগুলি কেবল 2: ট্রাঙ্ক (ডাব্লু * গুলি) এবং ট্রাঙ্ক (ডাব্লু * গুলি) +1, সুতরাং চেষ্টা করার জন্য কেবল (2 ** এলেমেনস্ট) সম্ভাব্য সমাধান রয়েছে।
Q=(s,w)=>
(n=>{
for(i=0;
r=q=s,(y=i++)<1<<w.length;
q|r>n||(n=r,o=t))
t=w.map(w=>(f=w*s,q-=d=0|f+(y&1),y/=2,f-=d,r+=f*f,d));
})()||o
টেস্ট সালে ফায়ারফক্স / ফায়ারবাগ কনসোলটি
;[[ 1, [0.4, 0.3, 0.3] ]
, [ 3, [0, 1, 0] ]
, [ 4, [0.3, 0.4, 0.3] ]
, [ 5, [0.3, 0.4, 0.3] ]
, [ 21, [0.3, 0.2, 0.5] ]
, [ 5, [0.1, 0.2, 0.3, 0.4] ]
, [ 4, [0.11, 0.3, 0.59] ]
, [ 10, [0.47, 0.47, 0.06] ]
, [ 10, [0.43, 0.43, 0.14] ]
, [ 11, [0.43, 0.43, 0.14] ]]
.forEach(v=>console.log(v[0],v[1],Q(v[0],v[1])))
আউটপুট
1 [0.4, 0.3, 0.3] [1, 0, 0]
3 [0, 1, 0] [0, 3, 0]
4 [0.3, 0.4, 0.3] [1, 2, 1]
5 [0.3, 0.4, 0.3] [1, 2, 2]
21 [0.3, 0.2, 0.5] [6, 4, 11]
5 [0.1, 0.2, 0.3, 0.4] [0, 1, 2, 2]
4 [0.11, 0.3, 0.59] [1, 1, 2]
10 [0.47, 0.47, 0.06] [5, 5, 0]
10 [0.43, 0.43, 0.14] [4, 4, 2]
11 [0.43, 0.43, 0.14] [5, 5, 1]
এটি একটি স্মার্ট সমাধান। ওয়েলথ অ্যারেতে একক পাস।
প্রতিটি পাসের জন্য আমি ডাব্লুতে বর্তমান সর্বাধিক মান খুঁজে পাই। আমি এই মানটি ওজনিত পূর্ণসংখ্যার মান (গোলকৃত) সহ জায়গায় পরিবর্তন করেছি, সুতরাং যদি s == 21 এবং ডাব্লু = 0.4 হয় তবে আমরা 0.5 * 21 -> 10.5 -> ১১ পেয়েছি this পরের লুপে সর্বাধিক হিসাবে পাওয়া যাবে। তারপরে আমি সেই অনুযায়ী মোট যোগফল হ্রাস করব (s = s-11) এবং ভেরিয়েবল এফের ওজনের মোট সংখ্যাও হ্রাস করব।
লুপটি যখন সর্বাধিক 0 থেকে উপরে না পাওয়া যায় তখন শেষ হয় (সমস্ত মান! = 0 পরিচালিত হয়েছে)।
অবশেষে আমি মানগুলি আবার ইতিবাচক হিসাবে ফিরিয়ে দিয়েছি।
এই কোডটি সতর্ক করে দেওয়া জায়গায় ওজনের অ্যারেটিকে সংশোধন করে, সুতরাং এটি অবশ্যই মূল অ্যারের অনুলিপি সহ কল করা উচিত
F=(s,w)=>
(f=>{
for(;j=w.indexOf(z=Math.max(...w)),z>0;f-=z)
s+=w[j]=-Math.ceil(z*s/f);
})(1)||w.map(x=>0-x)
আমার প্রথম চেষ্টা
এত স্মার্ট সমাধান নয়। প্রতিটি সম্ভাব্য ফলাফলের জন্য, এটি পার্থক্যটি মূল্যায়ন করে এবং সর্বনিম্ন রাখে।
F=(s,w,t=w.map(_=>0),n=NaN)=>
(p=>{
for(;p<w.length;)
++t[p]>s?t[p++]=0
:t.map(b=>r+=b,r=p=0)&&r-s||
t.map((b,i)=>r+=(z=s*w[i]-b)*z)&&r>n||(n=r,o=[...t])
})(0)||o
Ungolfed এবং ব্যাখ্যা
F=(s, w) =>
{
var t=w.map(_ => 0), // 0 filled array, same size as w
n=NaN, // initial minumum NaN, as "NaN > value" is false for any value
p, r
// For loop enumerating from [1,0,0,...0] to [s,s,s...s]
for(p=0; p<w.length;)
{
++t[p]; // increment current cell
if (t[p] > s)
{
// overflow, restart at 0 and point to next cell
t[p] = 0;
++p;
}
else
{
// increment ok, current cell is the firts one
p = 0;
r = 0;
t.map(b => r += b) // evaluate the cells sum (must be s)
if (r==s)
{
// if sum of cells is s
// evaluate the total squared distance (always offset by s, that does not matter)
t.map((b,i) => r += (z=s*w[i]-b)*z)
if (!(r > n))
{
// if less than current mininum, keep this result
n=r
o=[...t] // copy of t goes in o
}
}
}
}
return o
}