15.12.2018, 18:21
|
Интересующийся
|
|
Регистрация: 10.04.2018
Сообщений: 14
|
|
массив из периметра матрицы
Всем привет, есть массив массивов произвольного размера.
Нужно пройтись по периметру по часовой стрелке и из этих значений в том же порядке сделать массив.
Сделал на 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));
|
|
15.12.2018, 19:31
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
JStudent,
может 4 цикла по сторонам периметра?
|
|
15.12.2018, 20:03
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
рони,
да одного цикла хватит. Если я правильно понял, то:
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);
|
|
15.12.2018, 20:15
|
Интересующийся
|
|
Регистрация: 10.04.2018
Сообщений: 14
|
|
Нравицо!
|
|
15.12.2018, 20:24
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Можно исключить одну операцию, если так:
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);
|
|
15.12.2018, 21:12
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
если нужно сохранить исходный массив
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);
|
|
15.12.2018, 21:37
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от рони
|
если нужно сохранить исходный массив
|
Об этом автор не поставил нас в известность.
//удалил, не все получится )
Последний раз редактировалось laimas, 15.12.2018 в 22:00.
|
|
16.12.2018, 11:56
|
Интересующийся
|
|
Регистрация: 10.04.2018
Сообщений: 14
|
|
сохранять не обязательно.
Как насчёт треугольника, обход по часовой стрелке, начинать с левого нижнего угла
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 в стартпосте
|
|
16.12.2018, 12:11
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Что значит треугольника, его стороны вписанные в квадрат?
|
|
16.12.2018, 12:23
|
Интересующийся
|
|
Регистрация: 10.04.2018
Сообщений: 14
|
|
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]
не обходить по квадрату, а спуститься с верхнего левого угла по диагонали в низ. 13->1 -> 16 ->13. начинать с нижнего левого
|
|
|
|