28.10.2015, 00:03
|
|
junior
|
|
Регистрация: 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));
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
28.10.2015, 00:32
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
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]]]
|
|
28.10.2015, 09:33
|
Профессор
|
|
Регистрация: 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().
|
|
28.10.2015, 10:14
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
матрица разбить на квадраты
оставлю тут вариант на данный момент
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))
|
|
28.10.2015, 13:53
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от рони
|
а что нужно поставить в аргументы split чтоб получить из
|
придется добавить немного магии
как видишь, я руками в строке 03 добавляю фиксированный размер массива (2х2)
на самом деле постановка задачи никакая)
не понятно зачем вообще такие извращения
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
28.10.2015, 14:09
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
... мда ... видимо сделать универсальный вариант, более никому не интересно
laimas, шаблон в цикле
nerv_, шаблон но цикл заменён на рекурсию
|
|
28.10.2015, 14:50
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от рони
|
laimas, шаблон в цикле
|
?
А в чем собственно проблема? Я понимаю так - задана размерность среза, которую нужно получить из массива. Получать данные нужно по смещению этой размерности среза, при чем элементы среза нужно получать не по строкам, а по колонкам массива.
Итого - итерация внешнего цикла это постоянное смещение на размерность среза по строкам массива, а итерация внутреннего цикла, это постоянное смещение на размерность среза по колонкам массива. Во внутреннем цикле получаем срез, смещение которого определяется размерностью среза для колонок и строк массива.
Лично меня жаба бы задавила гонять четыре цикла с долгими переборами и проверками.
Я занимаюсь разработкой шрифта, вот закончу, тогда... А все таки беден JS на готовые функции для работы с массивами.
Последний раз редактировалось laimas, 28.10.2015 в 15:35.
|
|
28.10.2015, 16:57
|
Профессор
|
|
Регистрация: 13.04.2012
Сообщений: 210
|
|
спасибо
Последний раз редактировалось Brook, 28.10.2015 в 17:06.
|
|
28.10.2015, 19:17
|
Профессор
|
|
Регистрация: 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);
|
|
28.10.2015, 20:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Сообщение от Brook
|
что я тупанул и сразу не сделал рекурсию
|
А она тут нужна?
|
|
|
|