Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   перебор массива с отступом (https://javascript.ru/forum/misc/59093-perebor-massiva-s-otstupom.html)

Brook 29.10.2015 09:26

laimas, ну я бы не сказал что нужна НО рекурсия работает быстрее чем цикл - и в моем случае больше подходит именно она...
И должен уточнить что это если не ошибаюсь это единственный алгоритм который правильно работает с шагом (с разным шагом!!!) = у Рони было хорошее решение пока я не посчитал кооличество циклов)))) - 4 это уж слишком))
Так же мне нужна была адекватная работа с переменными (идем от простого = чем проще тем лучше) - в примерах рони было просто оочень много новых переменных особенно порадовало создание массива в перевом цикле (2го примера - см. выше)... за это отдельное СПАСИБО, РОНИ потому как я бы наверное так не ухитрился бы сделать так что это было хорошим "уроком"...
Вам тоже СПАСИБО, но больше за дискут нежели за код - так как я все равно не согласен с применением slice в данном вопросе ))))
Если я найду еще вариант решения задачи - обязательно отпишусь - если нет - закрою тему. ))))

laimas 29.10.2015 10:38

Цитата:

Сообщение от Brook
НО рекурсия работает быстрее чем цикл

Классно! :lol:

А если еще раз подумать нужна ли она там, где задачей предписано смещаться (нет в массивах отступов, есть смещения) на одинаковую размерность вниз и в ширину?

алгоритм который правильно работает с шагом (с разным шагом!!!)

slice() может получать срезы любой размерности и что замечательно, о чем не должна болеть голова, это то, что он вернет остаток, если размерность указана больше его.

Чтобы обойти массив по вашим условиям не нужно никакой рекурсии и более того, чем больше заданная размерность смещения, тем меньше проходов в цикле будет требоваться.

так как я все равно не согласен с применением slice в данном вопросе

Вольному воля, мне все равно, хоть с карандашом в руках решайте. ) Но стоит заметить, и также о применении рекурсии, где она де-факто как стандарт и очень вредный, это получение дерева из базы. В этой задаче все наоборот - из данных лежащих в навал нужно получить на выходе упорядоченный массив. А ведь рекурсия в данном случае тоже совсем не нужна.

nerv_ 29.10.2015 11:44

Цитата:

Сообщение от laimas
Классно!

да, почитав, что он тут пишет, я понимаю, почему у него отрицательная репутация :)

1. я сделал "через" рекурсию потому, что хотел реализовать с помощью нее (спортивный интерес)
2. нужна ли здесь рекурсия? Нет, не нужна
3. быстрее ли работает рекурсия? Нет, не быстрей
Цитата:

Сообщение от Brook
Так же мне нужна была адекватная работа с переменными (идем от простого = чем проще тем лучше) - в примерах рони было просто оочень много новых переменных

4. был у меня более-менее нормальный код, а ты из него абвгдейку сделал :)

Brook 29.10.2015 12:52

Цитата:

был у меня более-менее нормальный код, а ты из него абвгдейку сделал
... ну спорить не буду = это так,
однако, должен прояснить ситуацию - мне нужено было решение для с++(наверное зря не сказал раньше, но не думал что такая "шумиха" поднимится), поэтому и выбрал рекурсию, если отойти от этого факта тогда да slice вполне можно было бы использовать, однако должен заметить что код laimas не справляется с поставленной задачей если сменить размер смещения например с 2 на 3 , код падает:
var a = [
    ['01', '02', '03', '04'],
    ['05', '06', '07', '08'],
    ['09', '10', '11', '12'],
    ['13', '14', '15', '16']
], b = [], i, s = [B]2[/B];

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)

Brook 29.10.2015 12:54

Цитата:

да, почитав, что он тут пишет, я понимаю, почему у него отрицательная репутация
по мне так репутация вообще роли не играет - если вы мне "плюсанете" моя репутация станет овер 2 тасячи так что.... это не показатель(ну по мне так)
З.Ы. - а так же из-за того что я задавал много (на сегодня уже тупых) вопросов, когда только начанал изучать js, так что не считаю это трагедией
З.З.Ы - плюс ко всему у меня соотношение вопрос\ответ наверное 50\1 тагда как у вас наверное 1\1000 ))))

Brook 29.10.2015 13:59

сравнил скорости.... мда...:
http://jsperf.com/matrix-reader-with-index-offset

laimas 29.10.2015 14:15

Цитата:

Сообщение от Brook
однако должен заметить что код laimas не справляется с поставленной задачей если сменить размер смещения например с 2 на 3 , код падает:

Полная чушь, ибо нужно головой думать, а не копировать как есть то, что является просто концепцией.

Brook 29.10.2015 15:28

laimas,
так написали бы псевдокод - зачем людей вводить в замешательство, и подписали бы что это концепция - и все счасливы все думаю головой и доводят концепт до ума...
как я уже говрил я благодарен за дискут, но слушать о том что я не думую головой это уже крайность, что бы использовать ваш "концепт" его надо в корне переделать - могли просто остановить на первой версии коцепта который вы предложили
Цитата:

array.slice()
- не обязательно писать готовый код, но считаю что если вы предлагаете идею то она должна законченной а не оборванной на полуслове а законченная лишь на половину она теряет всякий смысл

laimas 29.10.2015 15:46

Информация к размышлению: не существует в природе готовой функции slice(), забыли, это в принципе как то радикально изменит концепцию получения необходимых элементов массива?

Brook 20.10.2016 10:49

Готовое решение с for:
var arr = [],
    step = 5, // offset between choosen positions
    size = 11; // grid size ~ 11x11

for(i = 0; i < size; i++) { // fill array
  arr.push([]);
  var str = '';
  for(j = 0; j < size; j++) {
    arr[i][j] = i * size + j;
    str+=addZero(''+arr[i][j], 3)+', ';
  }
  console.log(str); // draw array
}

for( i = 0 ; i + size * step < arr.length * size; i+=step) { // use ' i+=step' to start from last X pos (ex. 0-1, 1-2), else use ' i+=step+1' to reduce repetition (ex. 0-1, 2-3)
  var row = Math.floor(i / size), 
      column = Math.floor(i % size);
  
      if( row == Math.floor((i + step) / size)  && row % step == 0) { 
    
      console.log(
        '-----'+
        arr[row][column]+","+ 
        arr[row][column + step]+","+
        arr[row + step][column]+","+ 
        arr[row + step][column + step]
      );
      }
  }

function addZero(str,length) { // add 0 to fill str length
  while(str.length < length) {
    str = '0'+str;
  }
  return str;
}


Часовой пояс GMT +3, время: 06:22.