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

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


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

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

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


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


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