私が持っています
range = [a,3,b,2,c,1,d,2,e,3,f,3]
そして、それらの値に応じて、a、b、c、d、e、fを3つの同じサイズのグループにグループ化する必要があります。
正しい結果は次のようになります。
group1 = [a]
group2 = [b,c]
group3 = [d,e,f]
更新:パターン-> group3のみがグループ全体の1/3より大きくなる可能性があります。私はこれまでにこれを持っています:
var range = [3,2,1,2,3,3]
var total = 14;
var group_size = total / 3;
var values = [0];
var groupnr = 0;
range = range.reverse();
while( range.length ) {
var curvalue = range.pop();
if( values[groupnr] + curvalue > group_size && groupnr < 2 ) {
groupnr++;
values[groupnr] = 0;
}
values[groupnr] += curvalue;
}
log(values);
少なくとも1つの可能性があります:
var equalSplit = (function() {
var sum = function(list) {return list.reduce(function(a, b) {
return a + b;
}, 0);};
var evens = function(list) {
return list.filter(function(item, index) {return !(index % 2);})
};
var odds = function(list) {
return list.filter(function(item, index) {return !!(index % 2);})
};
var split = function(values, count) {
var mean = sum(values) / values.length;
var groups = [], index = 0, total, groupStart;
for (var i = 0; i < count - 1; i++) {
total = 0; groupStart = index;
while (index < values.length && total < mean) {
total += values[index++];
}
groups.push(values.slice(groupStart, index));
}
groups.push(values.slice(index));
return groups;
};
var reconstituteRanges = function(ranges, splits) {
var groups = {}, ctr = 0, diff;
for (var i = 0; i < splits.length; i++) {
diff = splits[i].length
groups["group" + (i + 1)] =
(evens(ranges.slice(ctr, ctr+=(2 * diff))));
}
return groups;
};
return function(ranges, count) {
var values = odds(ranges);
var splits = split(values, count);
return reconstituteRanges(ranges, splits);
}
}());
var ranges = ['a',3,'b',2,'c',1,'d',2,'e',3,'f',3];
console.log(equalSplit(ranges, 3));
//=> {"group1":["a"],"group2":["b","c"],"group3":["d","e","f"]}
JSFiddleで実際の動作を確認できます。
この問題は以前のバージョンよりもはるかに単純ですが、コードはそれほど短くはありません。
しかし、あなたは本当に最後のグループにこのようなすべての重みを持たせたいですか?あなたはもともと、それらを同等に近づけたいと投稿しました。この場合、16.67のかなり高い分散に対して、加重合計は[3、3、8]です。ここで、[['a']、['b'、 'c'、 'd']、['e'、 'f']]は、わずか4.67の分散で、[3、5、6]でよりバランスが取れます。これは本当にあなたの要件ですか、それともこれはより単純なコードを書くための単なる方法でしたか?(このコードは前のコードに対する私の答えよりもそれほど短くはありませんが、かなり単純です。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加