Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по двумерному массиву (https://javascript.ru/forum/misc/78468-vopros-po-dvumernomu-massivu.html)

jsNubster 18.09.2019 16:27

Вопрос по двумерному массиву
 
Добрый день.

Проблема следующая.

Есть, условно, такой двумерный массив:

0: (2) [2, 4]
1: (3) [1, 3, 5]
2: (2) [2, 6]
3: (3) [1, 5, 7]

Каким образом можно обойти его так, чтобы перебрать все возможные комбинации цифр в заданном порядке?
Т.е. 2121, 2321, 2521, 2161, 2361 ну и так далее.
Ломаю голову.
Пожалуйста, помогите!

jsNubster 18.09.2019 17:09

Разобрался сам. Декартово произведение.

рони 18.09.2019 17:14

jsNubster,
https://javascript.ru/forum/misc/674...tml#post444860

jsNubster 18.09.2019 17:33

Цитата:

Сообщение от рони (Сообщение 512924)

Вот теперь следующий вопрос.
В моем случае эти массивы генерируются динамически, их может быть 1, а может быть 8, вопрос, как сделать вызов этой функции так, чтобы туда руками вбивать не пришлось?

Мои идеи:
Сгенерировать динамически нужное нам количество переменных, в зависимости от количества массивов, присвоить им значения этих массивов, т.е. каждую сделать отдельным массивов, но вот дальше тупик, как их в вызов этот запихнуть?

Не получится же сделать строковую переменную, динамически ее заполнить, где через запятую (вот так: [1,3,4], [6, 2], [7, 8, 9])все это будет перечислено, работать не будет?

рони 18.09.2019 17:47

jsNubster,
не понимаю проблемы.

jsNubster 18.09.2019 18:03

Цитата:

Сообщение от рони (Сообщение 512927)
jsNubster,
не понимаю проблемы.

Вот мой код:
let number = [
  [8],
  [2, 4],
  [1, 3, 5],
  [2, 6],
  [1, 5, 7],
  [2, 4, 6, 8],
  [3, 5, 9],
  [4, 8],
  [0, 5, 7, 9],
  [6, 8]
];

let finalNumber = [];

let result = prompt('Введите пин код', 1234);
let devResult = [];
for (let i = 0; i < result.length; i++) {
    devResult[i] = result[i];
}


for (let i = 0; i < devResult.length; i++) {
    let a = devResult[i];
    finalNumber[i] = [];

        for(g = 0; g < number[a].length; g++){
            finalNumber[i][g] = number[a][g];



        }


}


На выходе получается вроде такого:
0: (2) [6, 8]
1: (4) [0, 5, 7, 9]
2: (2) [4, 8]
3: (3) [3, 5, 9]

Как все 4(или сколько их там сгенерируется) вставить в вызов функции, чтобы оно работало?
Мне же нужны именно значения массивов в заданном порядке, а не сами массивы.

рони 18.09.2019 18:19

jsNubster,
:-?
<script>
let number = [
  [8],
  [2, 4],
  [1, 3, 5],
  [2, 6],
  [1, 5, 7],
  [2, 4, 6, 8],
  [3, 5, 9],
  [4, 8],
  [0, 5, 7, 9],
  [6, 8]
];

let finalNumber = [];

let result = prompt('Введите пин код', 1234);
let devResult = [];
for (let i = 0; i < result.length; i++) {
    devResult[i] = result[i];
}


for (let i = 0; i < devResult.length; i++) {
    let a = devResult[i];
    finalNumber[i] = [];

        for(g = 0; g < number[a].length; g++){
            finalNumber[i][g] = number[a][g];



        }


}


function combinator(matrix){
  return matrix.reduceRight(function(combination, x){
    var result = [];
    x.forEach(function(a){
      combination.forEach(function(b){
        result.push( [ a ].concat( b ) );
      });
    });
    return result;
  });
};


document.write(
  combinator( finalNumber ).join("<br>")
);



  </script>

jsNubster 18.09.2019 18:35

Цитата:

Сообщение от рони (Сообщение 512930)
jsNubster,
:-?
<script>
let number = [
  [8],
  [2, 4],
  [1, 3, 5],
  [2, 6],
  [1, 5, 7],
  [2, 4, 6, 8],
  [3, 5, 9],
  [4, 8],
  [0, 5, 7, 9],
  [6, 8]
];

let finalNumber = [];

let result = prompt('Введите пин код', 1234);
let devResult = [];
for (let i = 0; i < result.length; i++) {
    devResult[i] = result[i];
}


for (let i = 0; i < devResult.length; i++) {
    let a = devResult[i];
    finalNumber[i] = [];

        for(g = 0; g < number[a].length; g++){
            finalNumber[i][g] = number[a][g];



        }


}


function combinator(matrix){
  return matrix.reduceRight(function(combination, x){
    var result = [];
    x.forEach(function(a){
      combination.forEach(function(b){
        result.push( [ a ].concat( b ) );
      });
    });
    return result;
  });
};


document.write(
  combinator( finalNumber ).join("<br>")
);



  </script>

Это было слишком просто, я думал, так нельзя.

jsNubster 18.09.2019 18:57

Цитата:

Сообщение от рони (Сообщение 512930)
jsNubster,
:-?
<script>
let number = [
  [8],
  [2, 4],
  [1, 3, 5],
  [2, 6],
  [1, 5, 7],
  [2, 4, 6, 8],
  [3, 5, 9],
  [4, 8],
  [0, 5, 7, 9],
  [6, 8]
];

let finalNumber = [];

let result = prompt('Введите пин код', 1234);
let devResult = [];
for (let i = 0; i < result.length; i++) {
    devResult[i] = result[i];
}


for (let i = 0; i < devResult.length; i++) {
    let a = devResult[i];
    finalNumber[i] = [];

        for(g = 0; g < number[a].length; g++){
            finalNumber[i][g] = number[a][g];



        }


}


function combinator(matrix){
  return matrix.reduceRight(function(combination, x){
    var result = [];
    x.forEach(function(a){
      combination.forEach(function(b){
        result.push( [ a ].concat( b ) );
      });
    });
    return result;
  });
};


document.write(
  combinator( finalNumber ).join("<br>")
);



  </script>

Спасибо огромное!

рони 18.09.2019 18:58

jsNubster,
на всякий случай ...
<script>
let number = [
  [8],
  [2, 4],
  [1, 3, 5],
  [2, 6],
  [1, 5, 7],
  [2, 4, 6, 8],
  [3, 5, 9],
  [4, 8],
  [0, 5, 7, 9],
  [6, 8]
];


let result = prompt('Введите пин код', 1234);
let finalNumber = Array.from(result, i => [...number[i]]);


function combinator(matrix){
  return matrix.reduceRight(function(combination, x){
    var result = [];
    x.forEach(function(a){
      combination.forEach(function(b){
        result.push( [ a ].concat( b ) );
      });
    });
    return result;
  });
};


document.write(
  combinator( finalNumber ).join("<br>")
);
  </script>

рони 18.09.2019 18:59

jsNubster,
не копируйте сообщения целиком, без необходимости, есть цитирование и ник.

jsNubster 18.09.2019 20:47

Цитата:

Сообщение от рони (Сообщение 512936)
jsNubster,
не копируйте сообщения целиком, без необходимости, есть цитирование и ник.

Учту, извините.

Последний, касательно этой задачи, вопрос.

От меня хотят, чтобы я сделал ввод-вывод через:
var readline = require("readline");
            var rl = readline.createInterface(process.stdin, process.stdout);
            rl.on("line", function(line) {
              console.log("0,5,7,8,9")
              rl.close();
            }).on("close",function(){
              process.exit(0);
            });


Могли бы пояснить, как, либо где почитать внятно(потому что я уже читал, не понял), как это делается, я так понял, что это node.js, нативный js эту конструкцию не понимает.

Вот финальный вариант моей программы:

let number = [
  [0, 8],
  [1, 2, 4],
  [1, 2, 3, 5],
  [2, 3, 6],
  [1, 4, 5, 7],
  [2, 4, 5, 6, 8],
  [3, 5, 6, 9],
  [4, 7, 8],
  [0, 5, 7, 8, 9],
  [6, 8, 9]
];

let finalNumber = [];

let result = prompt('Введите пин код', 1234);
let devResult = [];
for (let i = 0; i < result.length; i++) {
    devResult[i] = result[i];

}


for (let i = 0; i < devResult.length; i++) {
    let a = devResult[i];
    finalNumber[i] = [];
        for(g = 0; g < number[a].length; g++){
            finalNumber[i][g] = number[a][g];
        }
}





function cartesianProduct(arr) {
    return arr.reduce(function(a,b){
        return a.map(function(x){
            return b.map(function(y){
                return x.concat(y);
            })
        }).reduce(function(a,b){ return a.concat(b) },[])
    }, [[]])
}

let a = cartesianProduct(finalNumber);

let b = [];
let finalString = '';
for (let i = 0; i < a.length; i++) {
    b[i] = a[i].join('');
}

for (i = 0; i < b.length; i++) {
    finalString += (b[i] + ',' + ' ');
}

finalString = finalString.slice(0, -2);

console.log(finalString);

рони 18.09.2019 21:26

Цитата:

Сообщение от jsNubster
Могли бы пояснить

не могу помочь, может кто-то другой подскажет по node.js.

Malleys 18.09.2019 23:48

Вот ваш код, который теперь работает через консоль https://github.com/Malleys/readline-...aster/index.js

Цитата:

Сообщение от jsNubster
Могли бы пояснить, как, либо где почитать внятно(потому что я уже читал, не понял), как это делается, я так понял, что это node.js, нативный js эту конструкцию не понимает.

Это называется консольная программа. Исходный код вашей программы доступен на GitHub. Для её запуска вам нужно выполнить следующие шаги... (Если у вас не установлен node.js, то установите его)
  • Откройте терминал
  • Скопируйте проект с GitHub к себе и перейдите в него
    Код:

    git clone https://github.com/Malleys/readline-app.git
    cd readline-app

    Если у вас не установлен git, то вы можете скачать архив с проектом и распаковать его
  • Установите один раз зависимости выполнив команду
    Код:

    npm install
  • Для запуска используйте команду
    Код:

    npm start


Часовой пояс GMT +3, время: 21:03.