Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Задачка на смекалку (https://javascript.ru/forum/misc/11431-zadachka-na-smekalku.html)

Riim 06.09.2010 11:05

Запустить! => ошибка: Unexpected token &

Chrome.

subzey 06.09.2010 11:24

Riim,
Движок форума преобразовал юникодовые неразрывные пробелы в  
Плохая идея была их использовать

Так должно заработать:
var foo = "-~/ ";

foo = foo + "";
alert( !!~eval(foo + " / -.5") ); /* true */

alert( eval(                  foo + "+" + foo                  ) ) /* 1 */
alert( eval(            foo + foo + "+" + foo + foo            ) ) /* 2 */
alert( eval(      foo + foo + foo + "+" + foo + foo + foo      ) ) /* 3 */
alert( eval(foo + foo + foo + foo + "+" + foo + foo + foo + foo) ) /* 4 */
// и так далее

Яростный Меч 09.09.2010 14:17

Совсем простенькая

alert(sum()); // ==> 0
alert(sum(2)); // ==> 2
alert(sum(1)(2)(3)); // ==> 6
alert(sum(4)(8)); // ==> 12
// и т.д.


Определить sum

Shaci 09.09.2010 14:20

http://javascript.ru/basic/closure#zabavnyy-primer
Вот чему :))))))))))

Яростный Меч 09.09.2010 14:24

Shaci,

на 3-х и более элементах тот пример не сработал. Длина ряда произвольна.

Shaci 09.09.2010 14:34

function sum(a) {
  return function(b) {
    return function(c) {
return a + b +c;
}
  }
}
alert(sum(3)(4)(5));

Вот тебе для трех, я на js давно не писал. но думаю можно переписать с легкостью этот код и на произвольное число аргументов.

можно подсчитать количество аргументов ф-ции

B@rmaley.e><e 09.09.2010 14:50

var sum = function(a){
  var fnc = function(a){
    fnc.value += a || 0;
    return fnc;
  };
  fnc.value = a || 0;
  fnc.toString = toString;
  return fnc;
}, 
toString = function(){
  return this.value
};

alert(sum()); // ==> 0
alert(sum(2)); // ==> 2
alert(sum(1)(2)(3)); // ==> 6
alert(sum(4)(8)); // ==> 12
// и т.д.

monolithed 10.11.2010 11:54

В поисках логического обоснования:

((0)['constructor']['constructor'](//числа могут быть любыми и не обязательно соответствовать друг-другу
      (  
        (0)['constructor']['constructor']
        ('return unescape')
      )()
      ('al%65rt%28%22Hello%20World%21%22%29')
  )
)();


Как может вы уже догадались работает по принципу:
eval(unescape('al%65rt%28%22Hello%20World%21%22%29'))

Kolyaj 10.11.2010 12:06

((0)['constructor']['constructor'](
      ( 
        (0)['constructor']['constructor']
        ('return unescape')
      )()
   
    ('al%65rt%28%22Hello%20World%21%22%29')
  )
)();


(0)['constructor'] == Number
Number['constructor'] == Function


(Function(
      ( 
        Function
        ('return unescape')
      )()
   
    ('al%65rt%28%22Hello%20World%21%22%29')
  )
)();


Если растянуть

(Function((Function('return unescape'))()('al%65rt%28%22Hello%20World%21%22%29')))();


Function('return unescape') == function() { return unescape; }
(Function('return unescape'))() == (function() { return unescape })() == unescape


(Function(unescape('al%65rt%28%22Hello%20World%21%22%29')))();


(Function('alert("Hello World!")'))();


(function() { alert("Hello World!") })();

subzey 10.11.2010 12:07

0 — число. При взятии у него свойства оно преобразовавыется в объект. У объекта есть функция-конструктор. У конструктора есть свой конструктор — Function.

Получаем
(
	Function(
		(Function ('return unescape'))()('al%65rt%28%22Hello%20World%21%22%29')
	)
)();


Уже ближе.
(Function ('return unescape'))() создает функцию и сразу же её выполняет. Результатом будет функция unescape, определенная в глобальном скопе.

(
	Function(
		unescape('al%65rt%28%22Hello%20World%21%22%29')
	)
)();


ну, и

(Function('alert("Hello World!")'))();


Т.е., опять-таки, функция объявляется и сразу запускается.

alert("Hello World!")


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