13.02.2014, 23:37
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
Дзен-трансгуманист,
в чём разница?
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])]);
|
|
13.02.2014, 23:59
|
|
√₋̅₁̅
|
|
Регистрация: 18.06.2012
Сообщений: 385
|
|
рони,
Стоп, это уже полный бардак...
Сначала я подумал, что твоя функция должна возвращать размер. Но, видимо, на самом деле она возвращает индекс.
Тогда вопрос, откуда твоему универсальному преобразователю заранее известно, какие диапазоны x, y, z и т.д. я от нее требую?
А что если размерность такая: [2][122][2][9999]? То есть, в чем тут универсальность?
Ты наверно решил, что последовательность 5,6,7 арифметическая, или что? Я же эти цифры от фонаря придумал))) Цель была проста: показать, что многомерный массив известной величины можно легко свести к одномерному. Что собственно и происходит на практике в языках, где они поддерживаются.
__________________
Гейзенберг, возможно, читал этот тред.
Последний раз редактировалось Дзен-трансгуманист, 14.02.2014 в 00:03.
|
|
14.02.2014, 00:06
|
|
√₋̅₁̅
|
|
Регистрация: 18.06.2012
Сообщений: 385
|
|
рони,
Смотри, я меняю только размерность, строка 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'));
Обрати внимание на исходник скомпилированной функции.
Аргументы идут с первого, коэффициенты - со второго. Вот и весь компот.
__________________
Гейзенберг, возможно, читал этот тред.
Последний раз редактировалось Дзен-трансгуманист, 14.02.2014 в 00:10.
|
|
14.02.2014, 00:28
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
Дзен-трансгуманист,
ок!
|
|
14.02.2014, 00:52
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
Дзен-трансгуманист,
специальный выпуск с предварительной инициализацией
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])]);
|
|
14.02.2014, 01:30
|
|
√₋̅₁̅
|
|
Регистрация: 18.06.2012
Сообщений: 385
|
|
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])]);
рони,
Ну а в целом, да, кратко и понятно. Для примера сойдет.
__________________
Гейзенберг, возможно, читал этот тред.
|
|
14.02.2014, 01:53
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
Сообщение от Дзен-трансгуманист
|
Ну а в целом, да, кратко и понятно. Для примера сойдет
|
непонял что вы хотели этим сказать что в коде нет защиты от дурака?
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])]);
Последний раз редактировалось рони, 14.02.2014 в 02:34.
|
|
14.02.2014, 14:43
|
|
√₋̅₁̅
|
|
Регистрация: 18.06.2012
Сообщений: 385
|
|
Сообщение от рони
|
непонял что вы хотели этим сказать что в коде нет защиты от дурака?
|
Про защиту от дурака сказано в "// ой!".
Но отдельно я намекаю на то, что хоть для демонстрации этого достаточно, но в реальных задачах, где требуются тысячи и миллионы преобразований в секунду, пробежка по массиву будет тормозом. Почему я сразу сделал такое решение - линейное выражение быстрее цикла.
Конечно, еще я должен был бы раскрыть скобки, так как это способствует распараллеливанию. Но поленился.
__________________
Гейзенберг, возможно, читал этот тред.
|
|
14.02.2014, 14:47
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
Дзен-трансгуманист,
ок!
|
|
|
|