Вопрос по двумерному массиву
Добрый день.
Проблема следующая. Есть, условно, такой двумерный массив: 0: (2) [2, 4] 1: (3) [1, 3, 5] 2: (2) [2, 6] 3: (3) [1, 5, 7] Каким образом можно обойти его так, чтобы перебрать все возможные комбинации цифр в заданном порядке? Т.е. 2121, 2321, 2521, 2161, 2361 ну и так далее. Ломаю голову. Пожалуйста, помогите! |
Разобрался сам. Декартово произведение.
|
|
Цитата:
В моем случае эти массивы генерируются динамически, их может быть 1, а может быть 8, вопрос, как сделать вызов этой функции так, чтобы туда руками вбивать не пришлось? Мои идеи: Сгенерировать динамически нужное нам количество переменных, в зависимости от количества массивов, присвоить им значения этих массивов, т.е. каждую сделать отдельным массивов, но вот дальше тупик, как их в вызов этот запихнуть? Не получится же сделать строковую переменную, динамически ее заполнить, где через запятую (вот так: [1,3,4], [6, 2], [7, 8, 9])все это будет перечислено, работать не будет? |
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(или сколько их там сгенерируется) вставить в вызов функции, чтобы оно работало? Мне же нужны именно значения массивов в заданном порядке, а не сами массивы. |
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,
на всякий случай ... <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> |
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); |
Цитата:
|
Вот ваш код, который теперь работает через консоль https://github.com/Malleys/readline-...aster/index.js
Цитата:
|
Часовой пояс GMT +3, время: 21:03. |