Варианты решения
Коллеги , какие варианты решения можете предложить не задействовав toString в решении?:)
console.log(sum(2, 5, 10));//17 console.log(sum(2, 5)(10));//17 console.log(sum(2)(5)(10));//17 console.log(sum(2)(5, 10));//17 |
Mess4me, что есть sum?
Цитата:
var a=1; consol.log(''+a); consol.log(a+''); |
ksa,
sum это та функция что выдаст результат ) Вот её как раз я и хочу чтобы кто то написал ) |
ksa,
function sum(a) { var currentSum = a; function f(b) { currentSum += b; return f; } f.toString = function() { return currentSum; }; return f; } alert( sum(1)(2) ); // 3 alert( sum(5)(-1)(2) ); // 6 alert( sum(6)(-1)(-2)(-3) ); // 0 alert( sum(0)(1)(2)(3)(4)(5) ); // 15 Этот пример работает для вызовов (0)(1)(2)(3)(4)(5) и т п . Как реализовать без toString и для console.log(sum(2, 5, 10));//17 console.log(sum(2, 5)(10));//17 console.log(sum(2)(5)(10));//17 console.log(sum(2)(5, 10));//17 |
ksa,
исправил |
Цитата:
function sum(a) { var currentSum = a; function f(b) { currentSum += b; return f; } f.get = function() { return currentSum; }; return f; } alert( sum(1)(2).get() ); // 3 alert( sum(5)(-1)(2).get() ); // 6 alert( sum(6)(-1)(-2)(-3).get() ); // 0 alert( sum(0)(1)(2)(3)(4)(5).get() ); // 15 console.log(sum(2, 5, 10).get());//17 console.log(sum(2, 5)(10)).get();//17 console.log(sum(2)(5)(10)).get();//17 console.log(sum(2)(5, 10)).get();//17 |
Или так...
function sum(a) { var currentSum = a; function f(b) { if (b) { currentSum += b; return f; } else { return currentSum; }; }; return f; }; alert( sum(1)(2)() ); // 3 alert( sum(5)(-1)(2)() ); // 6 alert( sum(6)(-1)(-2)(-3)() ); // 0 alert( sum(0)(1)(2)(3)(4)(5)() ); // 15 |
ksa,
хорошие решения ) как реализовать для console.log(sum(2, 5, 10));//17 console.log(sum(2, 5)(10));//17 console.log(sum(2)(5)(10));//17 console.log(sum(2)(5, 10));//17 |
ksa,
прочитал в комментариях - дали кому то на собеседовании. |
Цитата:
|
ksa,
да та) |
Mess4me,
valueOf |
tsigel,
а без valueOf? :) |
Цитата:
function sum() { var currentSum = getSum(arguments); function fn() { currentSum += getSum(arguments); return fn; } function getSum(args) { var argSum = 0; for (var i = 0; i <args.length; i++) { argSum += args[i] }; return argSum; } fn.toString = fn.valueOf = function() { return currentSum; }; return fn; } alert( 'sum(2, 5, 10) = ' + sum(2, 5, 10) + "\n" + 'sum(2, 5)(10) = ' + sum(2, 5)(10) + "\n" + 'sum(2)(5)(10) = ' + sum(2)(5)(10) + "\n" + 'sum(2)(5, 10) = ' + sum(2)(5, 10)); Если количество вызываемых аргументов равно 3 function sum() { var currentSum = getSum(arguments); function fn() { currentSum += getSum(arguments); return checked(arguments.length); } function getSum(args) { var argSum = 0; for (var i = 0; i < args.length; i++) { argSum += args[i] } return argSum; } function checked(col) { fn.arg = fn.arg || 0; fn.arg += col; return fn.arg == 3 ? currentSum : fn; } return checked(arguments.length); } alert( 'sum(2, 5, 10) = ' + sum(2, 5, 10) + "\n" + 'sum(2, 5)(10) = ' + sum(2, 5)(10) + "\n" + 'sum(2)(5)(10) = ' + sum(2)(5)(10) + "\n" + 'sum(2)(5, 10) = ' + sum(2)(5, 10)); |
Еще вариант
function sum() { var res; sum.res = sum.res || 0; sum.arg = sum.arg || 0; sum.arg += arguments.length; for (var i = 0; i < arguments.length; i++) sum.res += arguments[i]; if(sum.arg == 3){ res = sum.res; sum.arg = sum.res = 0; }else{ res = sum; } return res; } alert( 'sum(2, 5, 10) = ' + sum(2, 5, 10) + "\n" + 'sum(2, 5)(10) = ' + sum(2, 5)(10) + "\n" + 'sum(2)(5)(10) = ' + sum(2)(5)(10) + "\n" + 'sum(2)(5, 10) = ' + sum(2)(5, 10)); |
Poznakomlus,
шикарные решения , особенно последнее ;) Молодец :) Интересная задачка на собеседовании, неправда ли? Предпоследнее тоже понравилось , хотя чуть чуть запутанное для меня ) |
Цитата:
|
А рабоче-крестьянский вариант засчитывается?
var sum = function() { var args = arguments, lenArgs = args.length; if (lenArgs == 3) return args[0] + args[1] + args[2]; if (lenArgs == 2) { return function(c) { return args[0] + args[1] + c; } } if (lenArgs == 1) { return function() { if (arguments.length == 1){ var b = arguments[0]; return function(c) { return args[0] + b + c; } } else { return args[0] + arguments[0] + arguments[1]; } } } } alert( 'sum(2, 5, 10) = ' + sum(2, 5, 10) + "\n" + 'sum(2, 5)(10) = ' + sum(2, 5)(10) + "\n" + 'sum(2)(5)(10) = ' + sum(2)(5)(10) + "\n" + 'sum(2)(5, 10) = ' + sum(2)(5, 10)); |
ребята у вас в решениях проблема , если передать 0 он все ломает :)
function sum () { var len = 0, sum = 0; return function fn () { for(var i = 0, a = arguments; i < a.length && len < 3; i++) (sum+= a[i]*1, a[i] !== '') && (len+=1); return (len == 3) ? sum : fn; }.apply(this, [].join.call(arguments, ',').split(',')); } alert(sum(2, 5, 10)+ "\n"+ sum(2, 5)(10)+ "\n"+ sum(2)(5)(10)+ "\n"+ sum(2)(5, 10)+ "\n"+ sum()(2)(5)(10)+ "\n"+ sum(0)(10)(7));//17 |
У вас у всех сломается на не озвученном тут примере:
console.log(sum(2, 5)); во всяком случае решения caetus и Poznakomlus выводят в консоль объект функции) я понимаю - в задаче этого не было озвучено, но мы же понимаем что логика универсальной функции сложения тут ломается) |
ТС хотел сложения для 3 аргументов
|
caetus,
да это понятно, но меня заинтересовало как бы выглядел универсальный складыватель) |
вас интересует реализация без valueOf ?
|
мне понравилось эта реализация:
function sum() { var res; sum.res = sum.res || 0; sum.arg = sum.arg || 0; sum.arg += arguments.length; for (var i = 0; i < arguments.length; i++) sum.res += arguments[i]; if(sum.arg == 3){ res = sum.res; sum.arg = sum.res = 0; }else{ res = sum; } return res; } Когда функция в свой объекте хранит свое состояние и в зависимости от него реагирует - возвращать ли функцию или переменную. Вот только это реализуемо если мы знаем возможные комбинации вызова, а как бы такую штуку реализовать на всевозможные комбинации вызова? |
var add = function () { var orig = 0; var inner = function () { for(var i = 0; i < arguments.length; i++) orig += arguments[i]; return inner }; inner.valueOf = function () {return orig;}; return inner.apply(this, arguments); }; console.log(add(2,1,1)(2)(5)+2) console.log(add(5)); console.log(add(2,5)) |
консоль выдает
13 function 5 function 7 я правильно понимаю, что function появляется из-за valueOf? А без него реализация невозможна? |
|
caetus, блин, жалко, идея действительно впечатляет.
Как вариант, правда совсем дурацкий я бы предложил такое - делаем состояние с суммой по setTimeout и отслеживаем в этом состоянии вызовы функции в течении ну скажем 10-20 милисекунд, думаю эту любую строку с разумным вызовом функции успеет запустить, и по истечению уже выдавать результат. Пока печатал решил затестить и понял что проблема будет в консол.логе, он выдаст undefined не дожидаясь ответа) |
function summ() { var summator = function(args) { return [].slice.call(args).reduce((s, c) => s + c); }; var count = 0; var f = function() { count += summator(arguments); return f; }; f.valueOf = function() { return count; }; return f.apply(null, arguments); } console.log(+summ(1)(2)(3)(4)); console.log(+summ(1)(2, 3, 4)); console.log(+summ(1, 2)(3, 4)); console.log(+summ(1, 2, 3)(4)); console.log(+summ(1, 2, 3, 4)); не полностью без знаков, но тоже вроде ничего) |
что жалко ? функцию можно смело использовать !
|
Часовой пояс GMT +3, время: 21:26. |