Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 28.10.2015, 00:03
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

вариант...
function split(src, dist, step, row, column) {
    if (row + step < src.length) {
        dist.push([
            [src[row][column], src[row][column + step]],
            [src[row + step][column], src[row + step][column + step]],
        ]);
        if (column + step + 1 < src[0].length) {
            return split(src, dist, step, row, column + step + 1);
        } else {
            return split(src, dist, step, row + step + 1, 0);
        }
    }
    return dist;
}

var arr = [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16]
];

console.log(split(arr, [], 1, 0, 0));
console.log(split(arr, [], 3, 0, 0));
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #22 (permalink)  
Старый 28.10.2015, 00:32
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

nerv_,
а что нужно поставить в аргументы split чтоб получить из
var arr = [
[1,2,3,4,5,6,7,8,9],
[10,11,12,13,14,15,16,17,18],
[19,20,21,22,23,24,25,26,27],
[28,29,30,31,32,33,34,35,36],
[37,38,39,40,41,42,43,44,45],
[46,47,48,49,50,51,52,53,54],
[55,56,57,58,59,60,61,62,63],
[64,65,66,67,68,69,70,71,72 ],
[73,74,75,76,77,78,79,80,81]
];

результат
var arr=[[[1, 2, 3], [10, 11, 12], [19, 20, 21]], [[4, 5, 6], [13, 14, 15], [22, 23, 24]], [[7, 8, 9], [16, 17, 18], [25, 26, 27]], [[28, 29, 30], [37, 38, 39], [46, 47, 48]], [[31, 32, 33], [40, 41, 42], [49, 50, 51]], [[34, 35, 36], [43, 44, 45], [52, 53, 54]], [[55, 56, 57], [64, 65, 66], [73, 74, 75]], [[58, 59, 60], [67, 68, 69], [76, 77, 78]], [[61, 62, 63], [70, 71, 72], [79, 80, 81]]]
Ответить с цитированием
  #23 (permalink)  
Старый 28.10.2015, 09:33
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

var a = [
    ['01', '02', '03', '04'],
    ['05', '06', '07', '08'],
    ['09', '10', '11', '12'],
    ['13', '14', '15', '16']
], b = [], i, s = 2;

for(i = 0; i<a.length; i += s) {
    b.push([a[i].slice(0, s), a[i+1].slice(0, s)], [a[i].slice(s), a[i+1].slice(s)])
}

console.log(b)


Маленько подумать, и для любой n-размерности в итерации нужно пройтись циклом n-раз в котором уже и push().
Ответить с цитированием
  #24 (permalink)  
Старый 28.10.2015, 10:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

матрица разбить на квадраты

оставлю тут вариант на данный момент
function matrix(c, d) {
    for (var h = [], a = 0; a < d * d; a += d * (c - 1))
        for (var f = 0; f < d; f += c) {
            for (var g = [], e = [], b = 0; b < c; b++) e.push(a + b + 1);
            g.push(e);
            for (b = 0; b < c - 1; b++) e = e.map(function(a) {
                return a + d
            }), g.push(e);
            h.push(g);
            a += c
        }
    return h
};
alert(JSON.stringify(matrix(2,4)))
alert(JSON.stringify(matrix(3,9)))
console.log(matrix(3,9))
Ответить с цитированием
  #25 (permalink)  
Старый 28.10.2015, 13:53
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от рони
а что нужно поставить в аргументы split чтоб получить из
придется добавить немного магии
как видишь, я руками в строке 03 добавляю фиксированный размер массива (2х2)

на самом деле постановка задачи никакая)
не понятно зачем вообще такие извращения
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #26 (permalink)  
Старый 28.10.2015, 14:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,075

... мда ... видимо сделать универсальный вариант, более никому не интересно
laimas, шаблон в цикле
nerv_, шаблон но цикл заменён на рекурсию
Ответить с цитированием
  #27 (permalink)  
Старый 28.10.2015, 14:50
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от рони
laimas, шаблон в цикле
?

А в чем собственно проблема? Я понимаю так - задана размерность среза, которую нужно получить из массива. Получать данные нужно по смещению этой размерности среза, при чем элементы среза нужно получать не по строкам, а по колонкам массива.

Итого - итерация внешнего цикла это постоянное смещение на размерность среза по строкам массива, а итерация внутреннего цикла, это постоянное смещение на размерность среза по колонкам массива. Во внутреннем цикле получаем срез, смещение которого определяется размерностью среза для колонок и строк массива.

Лично меня жаба бы задавила гонять четыре цикла с долгими переборами и проверками.

Я занимаюсь разработкой шрифта, вот закончу, тогда... А все таки беден JS на готовые функции для работы с массивами.

Последний раз редактировалось laimas, 28.10.2015 в 15:35.
Ответить с цитированием
  #28 (permalink)  
Старый 28.10.2015, 16:57
Профессор
Отправить личное сообщение для Brook Посмотреть профиль Найти все сообщения от Brook
 
Регистрация: 13.04.2012
Сообщений: 210

спасибо

Последний раз редактировалось Brook, 28.10.2015 в 17:06.
Ответить с цитированием
  #29 (permalink)  
Старый 28.10.2015, 19:17
Профессор
Отправить личное сообщение для Brook Посмотреть профиль Найти все сообщения от Brook
 
Регистрация: 13.04.2012
Сообщений: 210

nerv_,
чутка сменил под свои нужды = спасибо, и что я тупанул и сразу не сделал рекурсию ?! - лох ))

function split(src, st, r, c) {
    if(!st) return false;
    if (r + st < src.length && c + st < src[0].length) { 
    console.log(st +"---------"+src[r][c]+","+ src[r][c + st]+","+src[r + st][c]+","+ src[r + st][c + st]);
	if (c + st +1 < src[0].length) {
            return split(src, st, r, ++c + st);
        } else {
            return split(src, st, ++r + st, 0);
        }
    } else split(src, st==1?0:Math.ceil(st/2), 0, 0);
}

var arr = [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16]
];
split(arr, 3, 0, 0);
Ответить с цитированием
  #30 (permalink)  
Старый 28.10.2015, 20:20
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Brook
что я тупанул и сразу не сделал рекурсию
А она тут нужна?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите к js коду, написать html код Modrih Элементы интерфейса 8 16.06.2015 18:08
Перебор массива кнопкой Giyas Элементы интерфейса 14 28.01.2015 23:00
Сортировка массива по возрастанию другого массива. vas88811 Events/DOM/Window 4 12.01.2014 10:31
Перебор массива - вложенный цикл SWin Общие вопросы Javascript 35 27.12.2013 05:06
Перебор массива объектов Триви jQuery 12 26.08.2011 09:22