Массив Javascript shuffle с дополнением

Каким будет лучший способ перетасовать массив чисел с условием, что каждое число должно быть +3 или -3 следующего/предыдущего числа? Так, например, [0,1] не будет работать, но [0,3] будет.

Спасибо!

Ответ 1

Глядя на скриншот, кажется, что вы хотите выбрать случайный ассортимент из списка, без двух вариантов, находящихся в пределах 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));

Ответ 2

Способ (likley not the fastes) был бы:

  • сортировать массив
  • выберите случайный элемент для запуска нового перетасованного массива с помощью (отметьте элемент в отсортированном массиве, который используется или удаляется).
  • с бинарным поиском найдите следующий элемент, который равен +3 или -3 для последнего (произвольно выбирайте между -3 и +3). Убедитесь, что элемент не помечен как использованный ранее (в противном случае найти другой)
  • повторите 3, пока не найдете элементы.
  • вы либо выбрали все элементы из отсортированного массива, либо такое перетасовка невозможна.

Я думаю, что вы получаете O (N * logN) с этим (сортировка N * logN и выбор N элементов с logN для каждого изображения).

Ответ 3

Предполагая, что значения в массиве не могут быть дублированы.

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
}

Ответ 4

Я думаю, вы должны использовать фразу "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]

Похоже, что это, вероятно, проблема в теории графов - это какой-то сетевой обход с функцией максимальной/минимальной стоимости.