Дзен-трансгуманист,
в чём разница? :-? function test(c) { for (var d = 5, a = 0, b = 0; b < c.length; b++) a *= d, a += c[b], d++; return a }; alert([test([0,0,0,1]),test([0,0,1,0]), test([0,1,0,0]),test([1,0,0,0])]); |
рони,
Стоп, это уже полный бардак... Сначала я подумал, что твоя функция должна возвращать размер. Но, видимо, на самом деле она возвращает индекс. Тогда вопрос, откуда твоему универсальному преобразователю заранее известно, какие диапазоны x, y, z и т.д. я от нее требую? А что если размерность такая: [2][122][2][9999]? То есть, в чем тут универсальность? Ты наверно решил, что последовательность 5,6,7 арифметическая, или что? Я же эти цифры от фонаря придумал))) Цель была проста: показать, что многомерный массив известной величины можно легко свести к одномерному. Что собственно и происходит на практике в языках, где они поддерживаются. :) |
рони,
Смотри, я меняю только размерность, строка 25, всё остальное то же самое. // Multidimensional to single dimension representation var m2sdim = ( function () { var argNames = 'abcdefghijklmnopqrstuvwxyz'.split(''); return function ( /* arguments */ ) { var dimension = arguments.length; var fnSource = argNames[0]; var size = +arguments[0]; for ( var i = 1; i < dimension; i++ ) { fnSource = '(' + fnSource + '*' + +arguments[i] + '+ +' + argNames[i] + ')'; size *= +arguments[i]; } var fn = Function.apply( null, argNames.slice( 0, dimension ).concat( 'return ' + fnSource )); fn.size = size; return fn; }; })(); var test = m2sdim(2,122,2,9999); console.log([ test.toString(), test(0,0,0,1), test(0,0,1,0), test(0,1,0,0), test(1,0,0,0), test.size // размер массива ].join('\n')); Обрати внимание на исходник скомпилированной функции. Аргументы идут с первого, коэффициенты - со второго. Вот и весь компот. :) |
Дзен-трансгуманист,
ок! |
Дзен-трансгуманист,
специальный выпуск с предварительной инициализацией :dance: :thanks: function m(c) { return function (d) { for (var b = 0, a = 0, e = c[b]; b < d.length;) a *= e, a += d[b], e = c[++b]; return a } }; var test = m([2,122,2,9999]) alert([test([0,0,0,1]),test([0,0,1,0]), test([0,1,0,0]),test([1,0,0,0])]); |
function m(c) { return function (d) { for (var b = 0, a = 0, e = c[b]; b < d.length;) a *= e, a += d[b], e = c[++b]; return a } }; var dim = [2,122,2,9999]; var test = m(dim) dim.pop(); // ой! alert([test([0,0,0,1]),test([0,0,1,0]), test([0,1,0,0]),test([1,0,0,0])]); рони, Ну а в целом, да, кратко и понятно. Для примера сойдет. :) |
Цитата:
function m(k) { var c = k.join('.').split('.'); return function (d) { if (c.length != d.length) return -1; for (var a = 0, b = 0, e = c[a]; a < d.length;) { if (d[a] >= c[a]) return -1; b *= e; b += d[a]; e = c[++a] } return b } }; var dim = [2,122,2,9999]; var test = m(dim) dim.pop(); // ой! alert([test([0,0,0,1]),test([0,0,1,0]), test([0,1,0,0]),test([1,0,0,0])]); |
Цитата:
Но отдельно я намекаю на то, что хоть для демонстрации этого достаточно, но в реальных задачах, где требуются тысячи и миллионы преобразований в секунду, пробежка по массиву будет тормозом. Почему я сразу сделал такое решение - линейное выражение быстрее цикла. :) Конечно, еще я должен был бы раскрыть скобки, так как это способствует распараллеливанию. Но поленился. |
Дзен-трансгуманист,
ок! |
Часовой пояс GMT +3, время: 22:51. |