Каким будет лучший способ перетасовать массив чисел с условием, что каждое число должно быть +3 или -3 следующего/предыдущего числа? Так, например, [0,1] не будет работать, но [0,3] будет.
Спасибо!
Каким будет лучший способ перетасовать массив чисел с условием, что каждое число должно быть +3 или -3 следующего/предыдущего числа? Так, например, [0,1] не будет работать, но [0,3] будет.
Спасибо!
Глядя на скриншот, кажется, что вы хотите выбрать случайный ассортимент из списка, без двух вариантов, находящихся в пределах 3 друг от друга. Этот код принимает массив и дает вам подмножество массива, удовлетворяющее этому условию. Вы также можете указать максимальное количество выборов, хотя вы не всегда можете получить столько.
var src = [0,1,2,3,4,5,6,7,8,9,10,11,12];
var getRnd = function(max){
var output = [];
var newSrc = src.slice();
var test, index, i, safe;
while (newSrc.length > 0 && output.length < max){
index = Math.floor(Math.random()*newSrc.length);
test = newSrc.splice(index,1);
//Make sure it not within 3
safe = true;
for (i=0; i<output.length;i++){
if(Math.abs(test-output[i]) < 3){
//abort!
safe=false;
}
}
if(safe){
output.push(test);
}
}
return output;
};
alert(getRnd(4));
Способ (likley not the fastes) был бы:
Я думаю, что вы получаете O (N * logN) с этим (сортировка N * logN и выбор N элементов с logN для каждого изображения).
Предполагая, что значения в массиве не могут быть дублированы.
function one(array, mod){
var modArray = [];
for(var index in array){
var item = array[index];
var itemMod = item%3;
if(itemMod === mod){
modArray.push(item);
}
}
return modArray();
}
function two(modArray){
var sortedArray = // sort highest to lowest
for(var index in sortedArray ){
var item = array[index];
if(index > 0 && item[index-1] === item[index]-3){
}else{return false;}
}
return sortedArray.length;
}
function main(array){
var a1 = one(array, 0);
var a2 = one(array, 1);
var a3 = one(array, 2);
var a1c = two(a1);
var a2c = two(a2);
var a3c = two(a3);
return // if a1c is greatest then a1, if a2c greatest then a2 ... etc
}
Я думаю, вы должны использовать фразу "shuffle" нестандартным образом. Если все числа уже находятся в пределах + -3 друг от друга, сортировка массива поместит их в правильном порядке, если не будет дубликатов, я думаю.
Другие примеры, вероятно, будут полезны. Например, действительно ли эти примеры действительны и что вы ищете?
[0, 3, 3] -> [3, 0, 3]
[9, 3, 6, 0, 6] -> [0, 3, 6, 9, 6]
[3, 3, 6, 0, 6] -> [0, 3, 6, 3, 6]
Похоже, что это, вероятно, проблема в теории графов - это какой-то сетевой обход с функцией максимальной/минимальной стоимости.