Менять местами столбцы двумерного массива, используя javascript - PullRequest
0 голосов
/ 26 апреля 2020

Мне нужно произвольно поменять местами или перемешать столбцы 2D-массива, при условии, что первый и последний столбцы не изменены.

Например, My Array:

 pat[0][0] = "1";  pat[0][1] = "a";  pat[0][2] = "p";  pat[0][3] = "x";  pat[0][4] = "4";
 pat[1][0] = "2";  pat[1][1] = "b";  pat[1][2] = "q";  pat[1][3] = "y";  pat[1][4] = "5";
 pat[2][0] = "3";  pat[2][1] = "c";  pat[2][2] = "r";  pat[2][3] = "z";  pat[2][4] = "6";   

// (column-1)        (column-2)        (column-3)        (column-4)        (column-5)

Ожидаемый результат

pat[0][0] = "1";  pat[0][1] = "x";  pat[0][2] = "a";  pat[0][3] = "p";   pat[0][4] = "4";
pat[1][0] = "2";  pat[1][1] = "y";  pat[1][2] = "b";  pat[1][3] = "q";   pat[1][4] = "5";
pat[2][0] = "3";  pat[2][1] = "z";  pat[2][2] = "c";  pat[2][3] = "r";   pat[2][4] = "6";   

// (column-1)        (column-4)        (column-2)        (column-3)        (column-5)
// NotAltered                                                              NotAltered

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

function shuffle2dColumns(arr) {

 //somecode here to shuffle col's randomly except 1st and last col.

 return arr;
};
shuffle2dColumns(pat);

В качестве альтернативы, если невозможно произвольно переставить столбцы, предложите какой-нибудь код для замены по крайней мере 2 столбца в указанном порядке (например, столбец-2 с столбцом-4 или столбец-3 с столбцом-2 что-то вроде этого)

1 Ответ

0 голосов
/ 26 апреля 2020

Используйте стандартную функцию перемешивания, чтобы перетасовать соответствующие индексы . Затем l oop через строки, чтобы применить тот же порядок к фактическим значениям:

function shuffle(a) {
    var j, x, i;
    for (i = a.length - 1; i > 0; i--) {
        j = Math.floor(Math.random() * (i + 1));
        x = a[i];
        a[i] = a[j];
        a[j] = x;
    }
    return a;
}

function shuffle2dColumns(arr) {
    let length = arr[0].length-2;
    let indexes = shuffle([...Array.from({length}).keys()]);
    for (let j = 0; j < arr.length; j++) {
        let row = arr[j]
        arr[j] = [row[0], 
                  ...indexes.map(i => row[1+i]),
                  row[length+1]];
    }
    return arr;
};

let pat = [["1", "a", "p", "x", "4"], 
           ["2", "b", "q", "y", "5"],
           ["3", "c", "r", "z", "6"]];

shuffle2dColumns(pat);

for (let row of pat) console.log(row+"");

Так что length должно соответствовать количеству столбцов, которые вы хотите перемешать. В этом случае это на 2 меньше общего числа столбцов.

В выражении arr[j] = на столбцы, которые должны оставаться на месте, просто ссылаются по их индексу: так что в этом случае row[0] и row[length+1] представляют два крайних столбца. Остальное, посередине, заполнено синтаксисом ... и основано на случайном порядке, примененном к индексам. У 1+i есть 1+, потому что диапазон перемешанных столбцов начинается с индекса 1.

Вот более обобщенная функция c, где вы можете указать диапазон столбцов, которые должны быть подчинены перетасовки. Другие столбцы не будут перемещаться.

function shuffle(a) {
    var j, x, i;
    for (i = a.length - 1; i > 0; i--) {
        j = Math.floor(Math.random() * (i + 1));
        x = a[i];
        a[i] = a[j];
        a[j] = x;
    }
    return a;
}

function shuffle2dColumns(arr, first, last) {
    let length = last + 1 - first;
    let indexes = shuffle([...Array.from({length}).keys()]);
    for (let j = 0; j < arr.length; j++) {
        let row = arr[j]
        arr[j] = [...row.slice(0, first), 
                  ...indexes.map(i => row[first+i]),
                  ...row.slice(last+1)];
    }
    return arr;
};

let pat = [["1", "a", "p", "x", "4"], 
           ["2", "b", "q", "y", "5"],
           ["3", "c", "r", "z", "6"]];

shuffle2dColumns(pat, 0, 3); // Now also include column 0 in the shuffle

for (let row of pat) console.log(row+"");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...