массив из периметра матрицы
Всем привет, есть массив массивов произвольного размера.
Нужно пройтись по периметру по часовой стрелке и из этих значений в том же порядке сделать массив. Сделал на reduce, может есть решение попроще? const getTemplateArr = (size, arr = [], counter = 0) => { for (var i = 0; i < size; i++) { arr[i] = []; for (var j = 0; j < size; j++, counter++) { arr[i][j] = counter; } } return arr; }; console.table(getTemplateArr(10)); getPerimetrNumber = (size, leftSide = []) => { return getTemplateArr(size).reduce((pre, cur, i, arr) => { if (i === 0) { return pre.concat(cur); } if (i === arr.length - 1) { return pre.concat( cur[cur.length - 1], cur.slice(0, cur.length - 1).reverse(), leftSide ); } pre.push(cur[cur.length - 1]); leftSide.unshift(cur[0]); return pre; }, []); }; console.log(getPerimetrNumber(10)); |
JStudent,
может 4 цикла по сторонам периметра? |
рони,
да одного цикла хватит. Если я правильно понял, то: var a = [ [1, 2, 3, 4], [12, 0, 0, 5], [11, 0, 0, 6], [10, 9, 8, 7] ], o = a[0], v = []; for(var i=0, m = a.slice(1, -1); i<m.length; i++) { o.push(m[i].pop()); v.push(m[i][0]) } o = o.concat(a.pop().reverse(), v.reverse()); alert(o); |
Нравицо! :thanks:
|
Можно исключить одну операцию, если так:
var a = [ [1, 2, 3, 4], [12, 0, 0, 5], [11, 0, 0, 6], [10, 9, 8, 7] ], o = a[0], v = []; for(var i=0, m = a.slice(1, -1); i<m.length; i++) { o.push(m[i].pop()); v.push(m[m.length-1-i][0]) } o = o.concat(a.pop().reverse(), v); alert(o); |
:write:
если нужно сохранить исходный массив var a = [ [1, 2, 3, 4], [12, 0, 0, 5], [11, 0, 0, 6], [10, 9, 8, 7] ], o = a[0].slice(0), v = []; for(var i=0, m = a.slice(1, -1); i<m.length; i++) { o.push(m[i].slice(0).pop()); v.push(m[m.length-1-i][0]) } o = o.concat(a.slice(0).pop().slice(0).reverse(), v); alert(o); |
Цитата:
//удалил, не все получится ) |
сохранять не обязательно.
Как насчёт треугольника, обход по часовой стрелке, начинать с левого нижнего угла getPerimetrTriangleBottom = (size, diagonal = []) => { return getTemplateArr(size).reduceRight((pre, cur, i, arr) => { if (i === 0) { pre.push(cur[0]); return pre.concat( diagonal, arr .pop() .slice(1, -1) .reverse() ); } pre.push(cur[0]); diagonal.unshift(cur[i]); return pre; }, []); }; console.log('TriangleBottom', getPerimetrTriangleBottom(5)); getTemplateArr в стартпосте |
Что значит треугольника, его стороны вписанные в квадрат?
|
[ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] не обходить по квадрату, а спуститься с верхнего левого угла по диагонали в низ. 13->1 -> 16 ->13. начинать с нижнего левого |
Часовой пояс GMT +3, время: 05:10. |