Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Варианты решения (https://javascript.ru/forum/misc/59600-varianty-resheniya.html)

Mess4me 18.11.2015 13:53

Варианты решения
 
Коллеги , какие варианты решения можете предложить не задействовав 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 18.11.2015 15:43

Mess4me, что есть sum?

Цитата:

Сообщение от Mess4me
не задействовав toString

var a=1;
consol.log(''+a);
consol.log(a+'');

Mess4me 18.11.2015 15:56

ksa,
sum это та функция что выдаст результат )
Вот её как раз я и хочу чтобы кто то написал )

Mess4me 18.11.2015 16:01

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

Mess4me 18.11.2015 16:12

ksa,
исправил

ksa 18.11.2015 16:17

Цитата:

Сообщение от Mess4me
Как реализовать без toString

Как вариант...

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

ksa 18.11.2015 16:20

Или так...

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

Mess4me 18.11.2015 16:27

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

Mess4me 18.11.2015 16:29

ksa,
прочитал в комментариях - дали кому то на собеседовании.

ksa 18.11.2015 16:50

Цитата:

Сообщение от Mess4me
дали кому то на собеседовании

Бедный соискатель... :D

Mess4me 18.11.2015 16:53

ksa,
да та)

tsigel 18.11.2015 21:28

Mess4me,
valueOf

Mess4me 18.11.2015 21:51

tsigel,
а без valueOf? :)

Vlasenko Fedor 19.11.2015 00:02

Цитата:

Сообщение от Mess4me (Сообщение 396685)
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));

Vlasenko Fedor 19.11.2015 04:27

Еще вариант
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));

Mess4me 19.11.2015 12:47

Poznakomlus,
шикарные решения , особенно последнее ;) Молодец :)
Интересная задачка на собеседовании, неправда ли?
Предпоследнее тоже понравилось , хотя чуть чуть запутанное для меня )

ksa 20.11.2015 10:07

Цитата:

Сообщение от Mess4me
Интересная задачка на собеседовании, неправда ли?

По-мне так фигня полная...

Keramet 13.01.2016 23:40

А рабоче-крестьянский вариант засчитывается?
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));

caetus 14.01.2016 14:23

ребята у вас в решениях проблема , если передать 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

Siend 14.01.2016 15:57

У вас у всех сломается на не озвученном тут примере:
console.log(sum(2, 5));

во всяком случае решения caetus и Poznakomlus выводят в консоль объект функции) я понимаю - в задаче этого не было озвучено, но мы же понимаем что логика универсальной функции сложения тут ломается)

caetus 14.01.2016 16:02

ТС хотел сложения для 3 аргументов

Siend 14.01.2016 16:20

caetus,
да это понятно, но меня заинтересовало как бы выглядел универсальный складыватель)

caetus 14.01.2016 16:25

вас интересует реализация без valueOf ?

Siend 14.01.2016 16:34

мне понравилось эта реализация:
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;
}

Когда функция в свой объекте хранит свое состояние и в зависимости от него реагирует - возвращать ли функцию или переменную. Вот только это реализуемо если мы знаем возможные комбинации вызова, а как бы такую штуку реализовать на всевозможные комбинации вызова?

caetus 14.01.2016 16:44

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))

Siend 14.01.2016 17:00

консоль выдает
13
function 5
function 7

я правильно понимаю, что function появляется из-за valueOf? А без него реализация невозможна?

caetus 14.01.2016 17:02

правильно
https://learn.javascript.ru/object-conversion

Siend 14.01.2016 17:15

caetus, блин, жалко, идея действительно впечатляет.
Как вариант, правда совсем дурацкий я бы предложил такое -
делаем состояние с суммой по setTimeout и отслеживаем в этом состоянии вызовы функции в течении ну скажем 10-20 милисекунд, думаю эту любую строку с разумным вызовом функции успеет запустить, и по истечению уже выдавать результат.

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

yazonnile 14.01.2016 17:42

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));


не полностью без знаков, но тоже вроде ничего)

caetus 14.01.2016 17:44

что жалко ? функцию можно смело использовать !


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