Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Тут собираем годные задачи (javascript) (https://javascript.ru/forum/offtopic/32201-tut-sobiraem-godnye-zadachi-javascript.html)

Maxmaxmахimus 07.10.2012 14:04

Тут собираем годные задачи (javascript)
 
Этот пост будет пополняться лучшими задачами которые мы будем писать в каментах)
а пока тут пусть полежит ссылочка на это видео http://www.youtube.com/watch?v=KaqC5FnvAEc

__________________________________________________

Задача № 0

Создать переменную видимую только в блоке (аналог let в ECMA6).

for ( var i = 0; i < 10; i++ ){
    var ololo = i; // сделать так чтобы ololo  был виден только в блоке с циклом

}

// но не тут
window.ololo // undefined




__________________________________________________

Задача № 1

Составить функцию, которая продолжала бы числовую последовательность (арифметическую).

Например :

var mySequence = continueSequence([  1, 4, 7, 10  ]);
 
mySequence(); // 13
 
mySequence(); // 16




__________________________________________________

Задача № 2

Реализовать функцию для сложения чисел, которые превышают Number.MAX_VALUE
plus(    "1e500", "1e500" ); // "2e500"



(экпоненциальный вид для краткости. думаю, все знают про них)

DjDiablo 07.10.2012 17:53

Интересная задача которая возникла пока с 2d игрался.
Определение коллизий 2х спрайтов.

Принадлежность точки прямоугольнику, это элементарно.

а вот столкновение двух прямоугольников как определить ?
придумал вот такое алгоритм.
Идея в том что, разница между двумя крайними точками системы из двух столкнувшихся прямоугольников,будет всегда меньше суммы ширин, двух прямоуоугольников. Если условие выполняется для высоты и ширины, значит есть пересечение.

r=function(x,y,w,h,x1,y1,w1,h1){
			    var sx=x<x1?x:x1,
			        sy=y<y1?y:y1,
			        ex=x+w>x1+w1?x+w:x1+w1,
			        ey=y+h>y1+h1?y+h:y1+h1;
                return ex-sx<w+w1 && ey-sy<h+h1;
 
			    //if (ex-sx<w+w1 && ey-sy<h+h1)return true;
			    //else return false
			}

                        // true
			alert(r(
				0,0,100,100, 
				50,50,100,100
			));
                        // false
			alert(r(
				0,0,100,100, 
				150,50,100,100
			));

                        // true
			alert(r(
				51,51,100,100, 
				50,50,100,100
			));


                        // (один квадрат внутри другого) true
			alert(r(
				0,0,100,100, 
				50,50,10,10
			));

Maxmaxmахimus 07.10.2012 17:57

Просто проверяешь принадлежит ли каждая вершина многоугольника к другому, если ни одна не принадлежит, то проверяешь пересекаются ли их отрезки друг с другом.

melky 07.10.2012 18:23

Задача № 0

Составить функцию, которая продолжала бы числовую последовательность (арифм.).

Например :
var mySequence = continueSequence([  1, 4, 7, 10  ]);

mySequence(); // 13

mySequence(); // 16


Maxmaxmахimus 07.10.2012 19:07

Цитата:

Сообщение от DjDiablo
Идея в том что, разница между двумя крайними точками системы из двух столкнувшихся прямоугольников,будет всегда меньше суммы ширин, двух прямоуоугольников. Если условие выполняется для высоты и ширины, значит есть пересечение.

только для выпуклых?

Цитата:

Сообщение от melky
Задача № 0

разве для этого не придется писать ИИ?

Gozar 07.10.2012 19:28

Ссылка битая, новая ссылка:

http://www.youtube.com/watch?v=kKJRPPA6NBQ

Maxmaxmахimus 07.10.2012 19:36

Эту не выбрал потому что там концовку ждать долго

DjDiablo 07.10.2012 20:07

Цитата:

только для выпуклых?
что такое выпуклый прямоугольник в 2D пространстве?

Был бы многоугольник веротно пришлось бы бить на треугольники.
Алгоритм вроде тесты проходит, но в движок встроить неудаётся.

DimaJS 07.10.2012 20:17

Цитата:

Сообщение от DjDiablo
что такое выпуклый прямоугольник ?

да, это прикольно - сделать невыпуклый прямоугольник :D , впрочем кажется на какой то другой плоскости это вроде можно сделать (хотя не знаю );)

Maxmaxmахimus 07.10.2012 20:35

Стоп так ты про прямоугольники паришься? так это вообще не задача даже О_О это же слишком сложно для простых умов..

Я то думал ты про многоугольники.

Цитата:

Сообщение от DjDiablo
Был бы многоугольник веротно пришлось бы бить на треугольники.

я уже рассказал что надо было бы делать если бы это был многоугольник.

melky 07.10.2012 21:01

Цитата:

Сообщение от Maxmaxmахimus
разве для этого не придется писать ИИ?

O_o сюда , ИИ?

на ЖПУ ещё, скажи.:D

Maxmaxmахimus 07.10.2012 22:29

Ну серьезно, разве возможно написать АЛГОРИТМ определяющий закономерности последовательностей чисел)?
не используя ИИ, нейросети и системы образов.

melky 07.10.2012 22:37

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 208698)
Ну серьезно, разве возможно написать АЛГОРИТМ определяющий закономерности последовательностей чисел)?
не используя ИИ, нейросети и системы образов.

там же простейшая арифметическая последовательность.

Maxmaxmахimus 07.10.2012 23:57

функция должна определить ОБРАЗ закономерности последовательности данных. простой ты пример сделал или сложный сути не меняет.

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

1 2 3 4 5 выдавать 6

так и между

1 -2 4 -8 16 выдавать -32

так и между

0 0 1 0 0 выдавать 1


так и между

3 5 8 13 21 выдавать 34

тут нужна нейросеть умеющая строить абстракции , абстракции на абстракциях (как наш мозг) и абстрактные модели чисел и их связи дуг с другом. ну короче это жесть. сделать можно так то но это немного не для javascript ))

Shaci 08.10.2012 00:06

Цитата:

Сообщение от Maxmaxmахimus
используя ИИ, нейросети и системы образов

пхахах))) серьезно человек к проблеме решил подойти))

Maxmaxmахimus 08.10.2012 00:51

Ну реши задачку давай простыми способами)

Shaci 08.10.2012 01:10

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 208713)
Ну реши задачку давай простыми способами)

впадлу:)

nerv_ 08.10.2012 01:33

Цитата:

Сообщение от melky
Составить функцию, которая продолжала бы числовую последовательность (арифм.).

Цитата:

Сообщение от Maxmaxmахimus
разве для этого не придется писать ИИ?

когда сегодня днем прочитал пост от melky, то первой мыслью было - начинка функции ИИ :)
Цитата:

Сообщение от Maxmaxmахimus
Ну серьезно, разве возможно написать АЛГОРИТМ определяющий закономерности последовательностей чисел)?
не используя ИИ, нейросети и системы образов.

я тоже так подумал )
Цитата:

Сообщение от melky
там же простейшая арифметическая последовательность.

там, да. Но задача звучит как:
Цитата:

Сообщение от melky
Составить функцию, которая продолжала бы числовую последовательность (арифм.).

Например :

Цитата:

Сообщение от Shaci
пхахах))) серьезно человек к проблеме решил подойти))

не. Просто он исходит из условия задачи "продолжить любую последовательность чисел". И тут дело не в том, что я кого-то защищаю. Это и мое мнение тоже. В рамках данной задачи надо писать ИИ. А темы про ИИ сами знаете чем заканчиваются ))) melky и не спрашивай потом, кто был зачинщик :D

Дзен-трансгуманист 08.10.2012 01:46

Цитата:

Сообщение от melky (Сообщение 208675)
Составить функцию, которая продолжала бы числовую последовательность (арифм.).

Например :
var mySequence = continueSequence([  0, 1, 4, 7, 10  ]);

mySequence(); // 13

mySequence(); // 16


Окей, и почему там должно быть 13 и 16???
Если бы первое число было -2, тогда да, но тут я даже интуитивно не могу предположить, КАКИЕ там должны быть числа дальше...

Единственное решение "в лоб": 11, 14, 17, 20, 21, 24... - если предположить, что элементы 0 и 10 образуют линейный арифметический период.

melky,
Думаю, тут не помешает поработать над формулировкой задачи.

Дзен-трансгуманист 08.10.2012 02:05

И еще, насчет этой задачи, ее вполне можно решить, например, разложив элементы в ряд Тейлора или в ряд Фурье. Но заниматься этим мозгоебством - не-не-не, я пас. :D

Shaci 08.10.2012 02:11

http://ru.wikipedia.org/wiki/%D0%90%...81%D0%B8%D1%8F

это арифметическая прогрессия, единственное число 1 как то выпадает из определения,

Дзен-трансгуманист 08.10.2012 02:22

Shaci,
Для арифметической прогрессии первого порядка нужно строго ДВА элемента (определяют две степени свободы: смещение относительно нуля и шаг). Тут этого ограничения явно нет. *чешет подбородок*

Shaci 08.10.2012 02:26

Цитата:

Сообщение от Дзен-трансгуманист (Сообщение 208728)
Shaci,
Для арифметической прогрессии первого порядка нужно строго ДВА элемента (определяют две степени свободы: смещение относительно нуля и шаг). Тут этого ограничения явно нет.

ну так я и сказал это (если б хотя бы такая была - 0, 1, 4, 9)
p.s.
мне одному слово ИИ режет слух?, почему то я под ним воспринимаю что-то фантастическое, а не алгоритм полного перебора компьютерного игрока в шашки)

Дзен-трансгуманист 08.10.2012 02:46

Цитата:

Сообщение от Shaci
мне одному слово ИИ режет слух?

Добро пожаловать в клуб ИИ-фейспалмеров.)

Задача класса P налицо, какой тут нафиг ИИ...

melky 08.10.2012 06:10

Цитата:

Сообщение от Дзен-трансгуманист
melky,
Думаю, тут не помешает поработать над формулировкой задачи.

угу.

там нолик затесался, с прошлой прогрессии. не знаю, почему он там остался.

вот почему задача такой ажиотаж вызвала :)

Цитата:

Сообщение от melky (Сообщение 208675)
Задача № 0

Составить функцию, которая продолжала бы числовую последовательность (арифм.).

Например :
var mySequence = continueSequence([  1, 4, 7, 10  ]);

mySequence(); // 13

mySequence(); // 16



monolithed 08.10.2012 11:40

Цитата:

Сообщение от melky
там нолик затесался

тогда это не задача)

DjDiablo 08.10.2012 13:41

Цитата:

Сообщение от melky
вот почему задача такой ажиотаж вызвала

думаю ожиотаж вызвала мысль о гибкой функции continueSequence, способной определить множество последовательностей.
Пожалуй даже для такой суперфункции до какой-то степени можно обойтись без ИИ :)

к примеру
Если есть два образаца последовательности в одном массиве, и образцы операций. То можно отсеять только те операции которые дадут один результат в обоих последовательностях. Затем свести все обнаруженные операции в один паттерн, и по этому паттерну возвращать значения.

Вот набросал пример (с двумя образцами операций).

demo ( [0,1,2,3,4] );

demo ( [10,8,6,4,2] );

demo ( [1,2,3,2, 3,4,3] );

demo ( [1,10,100,1000,10000,100000,1000000] );

demo ( [1,2,3,30,31,32,320] );

demo ( [8192,4096,2048,1024,512] );

function demo(data){
   var z =continueSequence( data );
   for  (var i=1;i<10;i++) var ret=z();
   alert(ret);

}

function continueSequence(data){	
	matrix=[];
	var matrix=zakon1();
	mergeMatrix(matrix,zakon2());
	console.log(matrix);

	var step=0;
	cnt=data.length;	

	return function(){
                var ret=matrix[step].calc()
		
		step++;
		if (step>=matrix.length) step=0;
		return ret;			
	}

	function mergeMatrix(matrix,matrix2){
		for(var i=0;i<matrix.length;i++){
			if (matrix[i]==false ) matrix[i]=matrix2[i];
		}
	}


	//арифметическая последовательность с шагом
	function  zakon1(){
		var res=[];
		var pattern=[];

		//вычислим все разницы
		for (var i=1;i<data.length;i++){
			res[i-1]= data[i]-data[i-1] ;        
		}

		pattern=helper(res,act);

		function act(step){
			return {
				name:"zakon1",
				step:step,
				calc:function(){
					var r=data[data.length-1];
					r=r+this.step;
					data.push(r);
					return data;					
				}
			};
			
		}

		console.log(data);
		console.log(res);
		console.log(pattern);
		return pattern;	
	}


	//арифметическая последовательность с шагом
	function  zakon2(){
		var res=[];
		var pattern=[];

		//вычислим все разницы
		for (var i=1;i<data.length;i++){
			res[i-1]= data[i]/data[i-1] ;
		        
		}

		pattern=helper(res,act);

		function act(step){
			return {
				name:"zakon2",
				step:step,
				calc:function(){
					var r=data[data.length-1];
					r=r*this.step;
					data.push(r);
					return data;					
				}
			};
			
		}

		console.log(data);
		console.log(res);
		console.log(pattern);
		return pattern;	
	}



	function helper(res,act){
		var pattern=[];

		for (var i=0;i<res.length/2;i++){
			if (res[i] == res[i+res.length/2] ){
				pattern[i]=act(res[i]);
			} else {
				pattern[i]=false;
			}
				
		}  	
		return pattern;
	}
}


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

Maxmaxmахimus 08.10.2012 14:10

Цитата:

Сообщение от Дзен-трансгуманист
Задача класса P налицо, какой тут нафиг ИИ...

ну реши её в чем проблема

DjDiablo,
основная проблема с тем что последовательность может иметь бесконечно паттернов обьясняющих её.

А так же проблема в том что алгоритм должен понимать отношения чисел друг к другу. ключивое слово ПОНИМАТЬ..

ну если я ошибаюсь сделайте это без ии.

DjDiablo 08.10.2012 14:50

Ой не спроста у тебя 666 кармы. :D :D :D

Речь о том что какой-то алгоритм превзойдёт человека или хотябы нейронную сеть не идёт. Я постарался приблизится к решению настолько насколько получилось, и предложил более совершенный алгоритм как развитие идеи.

Если кол-во паттернов бесконечно это уже хаос, и закономерности там не найти, ни человеку ни компьютеру.
да и вообще непонятно откуда там возьмётся бесконечное кол-во паттернов, если данная последовательность небесконечна, а кол-во операций в математике ограничено. Даже мой пример обнаруживающий + - * /, будет работать с любой комбинацией этих операций.

другое дело если вместо паттерна набор правил.
к примеру:
1-2-4-8-10-15-30-35-70-75-150-300-600
тоесть.
числа умножаюся на два
Но если они меньше 100 и делятся на 10 без остатка то к ним прибавляется 5

в прочем думаю обнаружение правил формирующих эту закономерность это тоже разрешимая задача.

melky 08.10.2012 17:37

\
Цитата:

Сообщение от DjDiablo
Пожалуй даже для такой суперфункции до какой-то степени можно обойтись без ИИ

хм. сначала я имел в виду тупое прибавление одного числа к другому :
0 /* + 1 */ 1 /* + 2 */ 3 /* + 3 */ 6 /* + 4*/ 7 ...

continueSequence ()

// после этого :
... /* + 5*/ 12
/* + 6 */ 18
/* + 7 */ 25


элементарные ряды, можно сказать.

не думаю, что для решения рядов нужен ИИ - для нахождения первообразной даже есть код (на хабре была программа для решения матановой капчи)

тут нужна комбинаторика и алгоритмы :) вперёд, за Кнутом*!


* всё ещё собираюсь его книжку прочитать.

monolithed 08.10.2012 18:17

Цитата:

Сообщение от melky
тут нужна комбинаторика и алгоритмы вперёд, за Кнутом*!

Интерполяционный полином Лагранжа и предел последовательности.

В любом случае, как уже заметил Maxmaxmахimus6, определение последовательности, основываясь на дискретных данных - задача нейронных сетей, да и бессмысленная совсем.

Цитата:

Сообщение от melky
* всё ещё собираюсь его книжку прочитать.

Советую Роберта Седжвика (лучший ученик Кнута) - он все тоже самое описал только понятным языком

tenshi 08.10.2012 18:45

а как вам такая задача: есть пачка текстов, нужно реализовать по ним нескольких произвольных слов в произвольном порядке. отранжировать по количеству найденных слов.

melky 08.10.2012 19:52

Цитата:

Сообщение от tenshi (Сообщение 208865)
а как вам такая задача: есть пачка текстов, нужно реализовать по ним нескольких произвольных слов в произвольном порядке. отранжировать по количеству найденных слов.

это уже было (сортировка слов по количеству повторений в строке) ... ту тему снесли.

nerv_ 08.10.2012 21:07

Цитата:

Сообщение от melky
... ту тему снесли.

:cray:

Maxmaxmахimus 08.10.2012 23:00

добавил 1 задачу) решайте


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

melky 08.10.2012 23:03

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 208642)
Задача 1

Создать переменную видимую только в блоке (аналог let в ECMA6).

for ( var i = 0; i < 10; i++ ){
    var ololo = i; // сделать так чтобы ololo  был виден только в блоке с циклом

}

// но не тут
window.ololo // undefined

прикрепляй мою задачу в шапку!

with ({ ololo: null }) {

    for ( var i = 0; i < 10; i++ ){
        var ololo = i; // сделать так чтобы ololo  был виден только в блоке с циклом
    }

}

// но не тут
alert( window.ololo)  // undefined

DimaJS 08.10.2012 23:06

Цитата:

Сообщение от Maxmaxmахimus
научите меня под спойлер ответы кидать, сразу ответ напишу туда и под спойлер кину.

[js hide]Я тут спойлер[ /js]

Maxmaxmахimus 08.10.2012 23:19

Задача номер 1 решение работающее в strict mode XD
for ( var i = 0; i < 20; i++ ) try {throw 0} catch ( ololo ) {

	ololo = i;

}

melky 08.10.2012 23:24

Задача № 2

Реализовать функцию для сложения чисел, которые превышают Number.MAX_VALUE
plus(    "1e500", "1e500" ); // "2e500"


(экпоненциальный вид для краткости. думаю, все знают про них)

Дзен-трансгуманист 10.10.2012 09:45

Цитата:

Сообщение от monolithed
Интерполяционный полином Лагранжа

melky,

Еще раз вернусь к твоей последовательности в ее изначальном виде:
var mySequence = continueSequence([  0, 1, 4, 7, 10  ]);

Если значение элемента считать как значение функции от позиции самого элемента, то интерполяция Лагранжа дает вот такой интересный полином:



А образованная последовательность продолжается в целых числах:
15, 26, 49, 92, 165, 280, 451, 694, 1027, 1470, 2045, 2776, 3689, 4812, 6175...

:)


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