Сообщение от 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;
}
}
В перспективе думаю можно и отойти от двух образцов, но в этом случае мы можем получить несколько обьяснений одного числа, придётся перебирать комбинации этих конкурирующих обьяснений, сводить в один паттерн, и искать повторяющийся кусок в этой комбинации. Самый короткий но наиболее часто повторяющийся из всех кусков это и будет тот набор правил что мы ищем.