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

subzey 23.08.2010 17:19

Задачка на смекалку
 
new new new new new new new new foo () () () () () () () () () () () () () () () () () () () () () () () == foo /* true */

Чему равно foo?

Riim 23.08.2010 18:12

[spoiler]
function() {return arguments.callee}
[/spoiler]

Gvozd 23.08.2010 22:38

Цитата:

Сообщение от Riim
upd: [spoiler] не работает

белыми буквами мжно писать

Octane 24.08.2010 01:31

<script>
function foo() {
   return this.constructor == foo ? this.constructor : arguments.callee;
}

alert(new new new new new new new new foo () () () () () () () () () () () () () () () () () () () () () () () == foo);
</script>

x-yuri 28.08.2010 12:30

Gvozd, как это не работает?
<script type="text/javascript">
function foo(){
    return arguments.callee;
}
alert(new new new new new new new new foo () () () () () () () () () () () () () () () () () () () () () () () == foo);
</script>


subzey, спасибо за задачу :)

Gvozd 28.08.2010 12:52

Цитата:

Сообщение от x-yuri
Gvozd, как это не работает?

я такого не говорил)))

B~Vladi 28.08.2010 15:03

Вы адские кодеры...

subzey 28.08.2010 15:24

Задачка #2:
[foo][foo][foo][foo][foo][foo][foo][foo][foo][foo]() == foo; /* true */

Чему равно foo?

Gvozd 28.08.2010 15:40

foo=function(){ return arguments.callee; }
foo['0']=foo;
foo.toString = function(){return '0';}

alert( [foo][foo][foo][foo][foo][foo][foo][foo][foo][foo]() == foo)

x-yuri 28.08.2010 17:59

Gvozd, да, похоже я слишком быстро прочитал тему. Ты ответил, а потом Octane привел свой вариант, вот я и решил... :lol:

B~Vladi 28.08.2010 20:29

Нет, вы мега-адские кодеры...

Gvozd 28.08.2010 23:42

B~Vladi,
держим марку)))

subzey 30.08.2010 14:14

Заскучали?

Задачка #3:
foo == bar; /* true */
foo + bar == foo + bar; /* false */
foo++-++bar == bar++-++foo; /* false */

Чему равны foo и bar?

UPD: Как-то слишком тривиально получилось. Меняю условия.

Octane 30.08.2010 14:22

var foo = {
    toString: function () {
        return NaN;
    }
};
var bar = foo;
alert([
    foo == bar,
    foo++-++bar==bar++-++foo
]);

Gvozd 30.08.2010 14:27

а можно что-нить посерьезнее?)
foo = bar = {
a: 0,
valueOf:function(){return this.a++;}
};

alert(foo==bar); /* true */
alert(foo++-++bar==bar++-++foo); /* false */

Octane,
интересный вариант)

subzey 30.08.2010 15:38

Эт-то… я отредактировал условия, добавив еще одно.

З.Ы. Есть очень изящное решение для этого, без valueOf и toString :)

B~Vladi 30.08.2010 15:40

Цитата:

Сообщение от subzey
foo + bar == foo + bar; /* false */

:blink: да ну вас... Я лучше нервно покурю в сторонке...

Octane 30.08.2010 15:46

var foo = undefined, bar = undefined;
alert([
    foo == bar,
    foo + bar == foo + bar,
    foo++-++bar == bar++-++foo
]);

Skipp 30.08.2010 15:50

Психи!!!=) А ещё задачки будут?=)

subzey 30.08.2010 15:55

Octane,
и это правильный ответ! :)

Kolyaj 30.08.2010 15:56

Цитата:

Сообщение от Skipp
А ещё задачки будут?

Ну например
alert(obj.foo);  // 5
delete obj.foo;
alert(obj.foo);  // 5
Определить obj.

Octane 30.08.2010 15:59

function Obj() {}
Obj.prototype.foo = 5;
var obj = new Obj;
alert(obj.foo);
delete obj.foo;
alert(obj.foo);

B~Vladi 30.08.2010 16:28

Хм... И правда...

Octane 30.08.2010 18:52

Кстати, случайно пришло в голову проверить, оказывается [].toString и [].join не проверяют hasOwnProperty:

Array.prototype[0] = "O_o";
alert([,1,2]);

Kolyaj 30.08.2010 18:56

Ни один метод массива не проверяет hasOwnProperty.

subzey 04.09.2010 16:37

Задача #4:
Надеюсь, хоть она продержится более пары часов :)
foo = foo + "";
!!~eval(foo + " / -.5"); /* true */

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


Чуть не забыл. eval не переопределять :)

Gvozd 05.09.2010 12:30

весь мозг вынес.
самые разные идеи опробовал
подозреваю, что мое решение не то, что ты ожидаешь увидеть, но все же
var foo=' foo=" + 0.5 " , 1 '
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

subzey 05.09.2010 13:02

Gvozd,
Ну, коль скоро оно выполняется, то верно :)

Если до завтра не поступит других вариантов, напишу мой вариант.

Gvozd 05.09.2010 13:16

Цитата:

Сообщение от subzey
Ну, коль скоро оно выполняется, то верно

да.
но все же мое решение, как если бы на задачу "вывести первых 10 натуральных чисел", я бы написал
alert(1);
alert(2);
alert(3);
alert(4);
alert(5);
alert(6);
alert(7);
alert(8);
alert(9);
alert(10);

subzey 06.09.2010 10:47

#4: Разгадка
 
[spoiler]
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 */
// и так далее

/* поясню */

!!~(-~/  / -.5);
/* тут слеш служит «закрывающей скобкой» регулярки, а минус при таком раскладе уже не унарный оператор */

-~/ +-~/;
/* тут опять регулярное выражение, причем, в него входит +. При приведении к числу оно вполне себе NaN.
-~NaN = 1 */

-~/ -~/ +-~/ -~/;
/* когда таких кусков слева и справа четное количество, плюс работает как просто плюс. В принципе, всю задачу можно было сделать и без плюса, но как не запутать мозг уважаемым js-девелоперам? :) */

[/spoiler]

Riim 06.09.2010 11:05

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

Chrome.

subzey 06.09.2010 11:24

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

Так должно заработать:
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, время: 23:59.