Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.12.2018, 18:21
Интересующийся
Отправить личное сообщение для JStudent Посмотреть профиль Найти все сообщения от JStudent
 
Регистрация: 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));
Ответить с цитированием
  #2 (permalink)  
Старый 15.12.2018, 19:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

JStudent,
может 4 цикла по сторонам периметра?
Ответить с цитированием
  #3 (permalink)  
Старый 15.12.2018, 20:03
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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);
Ответить с цитированием
  #4 (permalink)  
Старый 15.12.2018, 20:15
Интересующийся
Отправить личное сообщение для JStudent Посмотреть профиль Найти все сообщения от JStudent
 
Регистрация: 10.04.2018
Сообщений: 14

Нравицо!
Ответить с цитированием
  #5 (permalink)  
Старый 15.12.2018, 20:24
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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);
Ответить с цитированием
  #6 (permalink)  
Старый 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);
Ответить с цитированием
  #7 (permalink)  
Старый 15.12.2018, 21:37
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от рони
если нужно сохранить исходный массив
Об этом автор не поставил нас в известность.

//удалил, не все получится )

Последний раз редактировалось laimas, 15.12.2018 в 22:00.
Ответить с цитированием
  #8 (permalink)  
Старый 16.12.2018, 11:56
Интересующийся
Отправить личное сообщение для JStudent Посмотреть профиль Найти все сообщения от JStudent
 
Регистрация: 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 в стартпосте
Ответить с цитированием
  #9 (permalink)  
Старый 16.12.2018, 12:11
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Что значит треугольника, его стороны вписанные в квадрат?
Ответить с цитированием
  #10 (permalink)  
Старый 16.12.2018, 12:23
Интересующийся
Отправить личное сообщение для JStudent Посмотреть профиль Найти все сообщения от JStudent
 
Регистрация: 10.04.2018
Сообщений: 14

[
[1,  2,   3,  4],
[5,  6,   7,  8],
[9,  10, 11, 12],
[13, 14, 15, 16]
]
не обходить по квадрату, а спуститься с верхнего левого угла по диагонали в низ. 13->1 -> 16 ->13. начинать с нижнего левого
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как преобразовать массив объектов в массив массивов sovsem-nub Events/DOM/Window 4 12.05.2018 21:56
Добавление объекта в массив в цикле Dark19 Элементы интерфейса 3 11.12.2016 23:11
Пустой массив при сохранении в localStorage kichkun Общие вопросы Javascript 1 19.11.2016 13:58
Чтение данных из файла в массив TheSingleElk Общие вопросы Javascript 2 16.06.2016 01:09
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14