Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   нужна задача, чтобы попрактиковаться)) (https://javascript.ru/forum/misc/20819-nuzhna-zadacha-chtoby-popraktikovatsya.html)

miguly 18.08.2011 18:35

нужна задача, чтобы попрактиковаться))
 
изучил js от начала до конца по двум книжкам (Фленаган. Подробное руководство, Дунаев. Самоучитель по JavaScript) и по вашему сайту.
задайте какуюнибудь задачу чтобы проверить че понял - че нет. (только 1. не надо плиз сверх заумных, т.к. еще без практики => получайник + 2. не надо говорить: напиши такую-то игру, эт будет левел апом (ну это тоже к первому) + 3. не надо писать типа заходи и на форум читай темы и пытайся решать реальные задачи - не тупой, пробовал уже, фигово получается). Заранее благодарен!:)

Magneto 18.08.2011 18:45

Вот в этой теме парень тоже просил задачек для практики.
Смотри, выбирай.

miguly 18.08.2011 18:47

это я и был, просто там про создание Игры - а мне это еще не посилам

Magneto 18.08.2011 18:50

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

B@rmaley.e><e 18.08.2011 18:51

Реализация jQuery.live на чистом JS.

tenshi 18.08.2011 19:16

сделать универсальную коллекцию, которая делегирует исполнение методов всем членам коллекции по очереди.

пример использования:

var square= new Square( 1, 2, 3 )
var circle= new Circle( 1, 2, 3 )

var shapeList= new Collection( square, circle )

shapeList.setColor( 'red' )
sahpeList.draw()
// то же что:
// square.setColor( 'red' )
// circle.setColor( 'red' )
// square.draw()
// circle.draw()

SkyLight 19.08.2011 12:18

Решить это:
var func = usrFunc(1)(2)(3)(4)(5);
var sum = function (p1, p2) { return p1 + p2; };
var multiply = function (p1, 2) { return p1 * p2; };

func(sum); должно вернуть 15
func(multiply); должно вернуть 120

Собственно, нужно реализовать функцию usrFunc

ksa 19.08.2011 15:52

Цитата:

Сообщение от miguly
задайте какуюнибудь задачу чтобы проверить че понял - че нет.

Сделай всё тотже "Морской бой"... Если нужна игра попроще - "Охота на лис".

melky 19.08.2011 23:27

простая и быстрая задачка

вместо условия пишу код с комментами. и да, функция одна

var a = myFunc(); // вернет "hello"
var b = myFunc(); // вернет "wtf"

Magneto 20.08.2011 01:19

Цитата:

Сообщение от melky
вместо условия пишу код с комментами. и да, функция одна

Такие нюансы новичек может и не знать.

Это легко делается при помощи самоопределяемой функции.

systemiv 20.08.2011 04:08

Цитата:

Сообщение от melky (Сообщение 121413)
простая и быстрая задачка

вместо условия пишу код с комментами. и да, функция одна

var a = myFunc(); // вернет "hello"
var b = myFunc(); // вернет "wtf"

Можете кинуть решение в ЛС? Если не сильно затруднит.

monolithed 20.08.2011 15:06

Цитата:

Сообщение от systemiv
Можете кинуть решение

function foo() {
    var i = 0;
    foo = function() {
        return ['Hello', 'World'][i++];
    }
    return foo();
}
     
alert([foo(), foo()].join(' '));

systemiv 20.08.2011 15:08

Цитата:

Сообщение от monolithed (Сообщение 121487)
function foo() {
    var i = 0;
    foo = function() {
        return ['Hello', 'World'][i++];
    }
    return foo()
}
     
alert([foo(), foo()].join(' '));

Всё гораздо проще

monolithed 20.08.2011 15:12

Цитата:

Сообщение от systemiv
Всё гораздо проще

Но не так динамично ;)

systemiv 20.08.2011 15:25

Вот решение который мне отправил melky:
myFunc = function(){
    myFunc = function(){
        return "wtf";
    } 
    return "hello";
}
 
alert(myFunc()); 
alert(myFunc());

По моему очень просто, не каждый новичёк, глядя на этот код поймёт, почему он вообще так работает)

Magneto 20.08.2011 15:35

Цитата:

Сообщение от monolithed
Но не так динамично

А какая динамика появляется в Вашем примере?

Я к примеру тоже решил этот пример как советует Стоян Стефанов в своей книге «JavaScript шаблоны»
var myFunc = function () {
  myFunc = function () {
    return "wtf";
  };
  return "hello";
};

Octane 20.08.2011 15:44

Можно и не переопределять функцию:
function myFunc() {
    return ["wtf", "hello"][myFunc.i ^= 1];
}

alert([myFunc(), myFunc()])

monolithed 20.08.2011 15:45

Цитата:

Сообщение от Magneto
А какая динамика появляется в Вашем примере?

function foo() {
    var i = 0;
    foo = function() {
        return ['a', 'b', 'c', 'd'][i++];
    }
    return foo();
}
     
alert([
     foo(),
     foo(),
     foo(),
     foo()
]);

Цитата:

Сообщение от Magneto
Я к примеру тоже решил этот пример как советует Стоян Стефанов в своей книге «JavaScript шаблоны»

Стоян Стефанов много хороих идей саккумулировал в своей книгие, но нужно еще немого своей головой думать.

systemiv 20.08.2011 15:57

Тогда можно даже так:
var data = [22,33,44,88,99];
		function test(){
			alert(data[0]);
			data.shift();
		}
		test();
		test();
		test();
		test();

Вообще без зацикливания

Sweet 20.08.2011 15:57

Лично я бы сделал примерно так:
function foo(){
  if( !foo.values ) foo.values = [];
  if( arguments.length === 0 )
    return foo.values.shift();
  foo.values.push.apply( foo.values, arguments );
  return foo;
};

foo( "Hello", "wtf" );

alert( [ foo(), foo() ].join( " " ) );
Динамики хоть отбавляй:D

systemiv 20.08.2011 16:02

Тогда я так:
function test(){
	var data = [22,33,44];
	var temp = data[0];
	data.shift();
	return temp;
}
alert(test());
alert(test());
alert(test());

Magneto 20.08.2011 16:07

Цитата:

Сообщение от monolithed
Стоян Стефанов много хороих идей саккумулировал в своей книгие, но нужно еще немого своей головой думать.

Хорошо, Ваша функция более динамична и она может вывести хоть 100 разных значений. И спасибо за неё.

Но в контексте данной поставленной задачи Вам бы так же следовало подумать головой, Ваша функция создает лишнюю переменную и массив.

monolithed 20.08.2011 16:17

Цитата:

Сообщение от Magneto
Но в контексте данной поставленной задачи Вам бы так же следовало подумать головой, Ваша функция создает лишнюю переменную и массив.

Тут нужно спросить, у melky, что он имел ввиду, потому как мне показалось, что количество вызовов не ограничено двумя.

И Magneto, не нужно воспринимать мое высказывание так близко к сердцу, я не пытался вас задеть, просто сказать, что способов решения задач может быть несколько и не нужно себя в этом ограничивать ;)

Sweet 20.08.2011 16:24

По-моему, проблема в условии задачи:) Непонятно, что нужно. Если функция должна при первом вызове возвращать одно, а при остальных - другое, тогда подойдет такое решение. Если решение аля стек, то это. Если переключатель, то это. Так что все зависит от назначения функции (+ "сколько людей, столько и мнений":) ).

tenshi 20.08.2011 17:48

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

melky 20.08.2011 23:23

Цитата:

Сообщение от monolithed (Сообщение 121506)
Тут нужно спросить, у melky, что он имел ввиду, потому как мне показалось, что количество вызовов не ограничено двумя.

ограничено, кратко говоря :)


Цитата:

Сообщение от tenshi (Сообщение 121515)
обсуждения на 3 страницы как реализовать бесполезную функцию

это был вопрос по теории. На практике, во время писанины кода, до такого допереть, мне кажется. просто невозможно.

P.S. понравился пример от Octane, красиво уложено

tenshi 23.08.2011 00:44

вот и хорошо. нефиг говнокодить на практике.

kadabrik 23.08.2011 00:58

В тему о бесполезных задачах))
Заставить этот код выдавать "Hello world!":
for(key in []) {alert (key + [][key])}

systemiv 23.08.2011 01:03

Вот здсь интересная коллекция задач
http://www.aboutkit.ru/laby/zadachi-po-javascript.html
http://programming.su/DHTML/homework/30
http://www.javaportal.ru/forum/conte...ID=1033&from=6
http://www.cyberforum.ru/javascript/thread211902.html

devote 23.08.2011 03:58

Цитата:

Сообщение от kadabrik (Сообщение 121819)
В тему о бесполезных задачах))
Заставить этот код выдавать "Hello world!":
for(key in []) {alert (key + [][key])}

Ну это старая скучная задачка =)
Array.prototype.Hello = " world!"

melky 23.08.2011 10:10

вспомнилась зачада с яндекса, которая поставила тогда меня в тупик

что вернёт функция?

(function f() {
    function f() { return 1 }

    return f();

    function f() { return 2 }
})();

B@rmaley.e><e 23.08.2011 12:04

По-моему, задача не представляет сложности, если знать различия Function Declaration и Function Expression.

ваый 23.08.2011 12:40

Вот вам реальная простенькая задачка, которая недавно возникла.

Реализовать функцию getWords(id), которая:

1. принимает в качестве аргумента строку css селектора (для простоты просто id dom элемента);
2. возвращает массив слов содержащихся внутри этого элемента, в том числе и в дочерних.

Достаточно просто, но прикольно для начинающих. Тут и немного работы с dom, и в целом полезно.

SlavaPav 23.08.2011 21:40

Мой вариант реализации самоопределяемой функции:
var displayName = (function() {
    function func() {
        alert('First name');
        func = function() {
            alert('Second name');
        };
    }
    
    return function() {
        func();
    };
})();

displayName();
displayName();

// Более удобный вариант
function memoize(init, main) {
    function current() {
        init.apply(null, arguments);
        current = main;
    }
    
    return function() {
        current.apply(null, arguments);
    };
}

var displayName = memoize(function() {alert('First name');}, function() { alert('Second name');});

displayName();
displayName();

melky 25.08.2011 02:15

сейчас пришла в голову ещё одна задачка. мне кажется, она будет зубодробительной :)

я сам то её решил.

и да... работать эта задачка будет только в FF (версия - хз, свежая).

итак, вот код с комментами, вместо условия.

как сделать так, чтобы ....

<div id=a>0</div>

<script>
a=document.getElementById('a');

/* тут пропущенный кусок моего кода */


// всё хорошо. при клике к содержимому
// будет добавляться буква 'abc'
// всё статично
a.onclick = function(){ a.innerHTML += 'abc' };
</script>

... чтобы при клике по div к его innerHTML прибавлялись не 'abc', а 'ABC' ?

melky 25.08.2011 02:21

в самом конце :)

а код нельзя менять.

только дописать свой кусок. местонахождение определено комментами /**/

B@rmaley.e><e 25.08.2011 08:03

Цитата:

работать эта задачка будет только в FF (версия - хз, свежая).
Опера, хромиум, FF5+:
<div id=a>0</div>

<script>
a=document.getElementById('a');

/* тут пропущенный кусок моего кода */
(function(){
  var cached = a.innerHTML;
  a.__defineGetter__('innerHTML', function(){
    return cached;
  });
  a.__defineSetter__('innerHTML', function(b){
    cached = b.toUpperCase();
    var div = document.createElement('div');
    div.innerHTML = cached;
    for(var i = 0, length = a.childNodes.length; i < length; ++i){
      a.removeChild(a.childNodes[i]);
    }
    for(var i = 0, length = div.childNodes.length; i < length; ++i){
      a.appendChild(div.childNodes[i]);
    }
  });
})();

// всё хорошо. при клике к содержимому
// будет добавляться буква 'abc'
// всё статично
a.onclick = function(){ a.innerHTML += 'abc' };
</script>

devote 25.08.2011 08:28

Цитата:

Сообщение от B@rmaley.e><e
Опера, хромиум, FF5+:

Ты зачем решил? Задачки то для новичков специально, а ты им подсказки даешь.

Но то что melky, заявил тока про FF я тоже улыбнулся, геттеры и сеттеры давно поддерживаются и другими... Кроме любимого ИЕ =)

B@rmaley.e><e 25.08.2011 08:34

devote, специально скрыл, желающие потом смогут посмотреть решение. Ну и оно для всех нормальных браузеров, а не только FF.
Цитата:

Сообщение от devote
давно поддерживаются и другими

Ну, может он решил её как-нибудь иначе. Мало ли чего Mozilla могли напихать в свой движок.

devote 25.08.2011 08:42

Цитата:

Сообщение от B@rmaley.e><e
Ну, может он решил её как-нибудь иначе.

хотелось бы посмотреть на его решение =)


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