SOURCE

console 命令行工具 X clear

                    
>
console
//params dimension
var rows = 2;
var cols = 3;

function init() {
  //dimension initialize
  document.getElementById('rows').value = rows;
  document.getElementById('cols').value = cols;

  rebuildInputParams();
}

//数字分组重设
function dimChange() {
  rows = document.getElementById('rows').value;
  cols = document.getElementById('cols').value;

  rebuildInputParams();
}

//按照分组参数重设参数输入框
function rebuildInputParams() {
  var paramsDiv = document.getElementById('params');
  paramsDiv.innerHTML = "";
  var br = document.createElement('br');
  for (r = 0; r < rows; r++) {
    for (c = 0; c < cols; c++) {
      var input = document.createElement('input');
      input.id = (r + 1) * 10 + c + 1;
      input.setAttribute('type', 'number');
      paramsDiv.appendChild(input);
    }
    paramsDiv.innerHTML += '<br>';
    paramsDiv.innerHTML += '<br>';
  }
}

function add(a, b) {
  return a + b;
}

function minus(a, b) {
  return a - b;
}

function multiply(a, b) {
  return a * b;
}

function divide(a, b) {
  if (b !== 0) {
    return a / b;
  } else {
    return null;
  }
}

var operations = [{
  func: add,
  symbo: '+',
  priority: 1
},
{
  func: minus,
  symbo: '-',
  priority: 1
},
{
  func: multiply,
  symbo: '×',
  priority: 2
},
{
  func: divide,
  symbo: '÷',
  priority: 2
}];

//行和列的运算排列
var colOperations, rowOperations;
function createOperationIndexList() {
  colOperations = permutation(operations.length, cols - 1, true);
  rowOperations = permutation(operations.length, rows - 1, true);
}

//行和列的参数排列
var colParams, rowParams;
function createParamIndexList() {
  colParams = permutation(cols);
  rowParams = permutation(rows);
}

//用户输入的参数
var params = [];
function getParamsData() {
  params = [];
  for (r = 0; r < rows; r++) {
    row = [];
    for (c = 0; c < cols; c++) {
      var input = document.getElementById((r + 1) * 10 + c + 1);
      if (input.value.trim() === "") {
        row.push(null);
      } else {
        row.push(Number(input.value));
      }
    }
    params.push(row);
  }
}

function permutation(indexLength, selected) {
  selected = selected || indexLength;
  var permutations = [];
  var p = [];
  for (i = 0; i < Math.pow(indexLength, selected); i++) {
    p = convertBase(i, indexLength);
    while (p.length < selected) {
      p.push(0);
    }
    permutations.push(p);
  }
  return permutations;
}

function convertBase(num, base) {
  var ct = [];
  var quotient, remainder;
  while (true) {
    quotient = parseInt(num / base);
    remainder = num % base;

    ct.push(remainder);
    if (quotient > 0) {
      num = quotient;
    } else {
      break;
    }
  }
  return ct;
}

function isArrayRepeat(array) {
  var arr = array;
  for (i = 0; i < arr.length - 1; i++) {
    for (j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        return true;
      }
    }
  }
  return false;
}

//给定运算和参数,返回计算字符串和值
function evaluate(ops, params) {
  if (ops.length + 1 === params.length) {

} else {
    return [null, null]
  }
}

init();

function run() {
  //测试数据
  document.getElementById('rows').value = 5;
  document.getElementById('cols').value = 5;
  rows = 5;
  cols = 5;
  rebuildInputParams();
  document.getElementById('11').value = 5;
  document.getElementById('12').value = 2;
  document.getElementById('13').value = 7;
  document.getElementById('14').value = 1;
  document.getElementById('15').value = 5;

  document.getElementById('21').value = 2;
  document.getElementById('22').value = 7;
  document.getElementById('23').value = 2;
  document.getElementById('24').value = 3;
  document.getElementById('25').value = 5;

  document.getElementById('31').value = 1;
  document.getElementById('32').value = 2;
  document.getElementById('33').value = 3;
  document.getElementById('34').value = 3;
  document.getElementById('35').value = 8;

  document.getElementById('41').value = 3;
  document.getElementById('42').value = 2;
  document.getElementById('43').value = 3;
  document.getElementById('44').value = 5;
  document.getElementById('45').value = 1;

  document.getElementById('51').value = 1;
  document.getElementById('52').value = 1;
  document.getElementById('53').value = 1;
  document.getElementById('54').value = "";
  document.getElementById('55').value = "";

  getParamsData();
  createOperationIndexList();
  createParamIndexList();
  
  //按列计算数据规则
  console.log('按列分析数据规则:');
  //选定一个行数据排列方式,选定一个运算符排列方式
  for (rp1 = 0; rp1 < rowParams.length; rp1++) {
    rp = rowParams[rp1];
    //参数不能重复代入计算,运算可以重复
    if (isArrayRepeat(rp)) {
      continue;
    }

    //运算排列列表
    for (ro1 = 0; ro1 < rowOperations.length; ro1++) {
      ro = rowOperations[ro1]; //rp 是当前的行数据排列方式,ro 是当前的行数据运算模式
      //逐行计算结果
      result = [];
      for (j = 0; j < cols; j++) {
        //跳过有行空值的列
        var hasNull = false;
        for (i = 0; i < rows; i++) {
          if (params[i][j] === null) {
            hasNull = true;
            break;
          }
        }
        if (hasNull) {
          continue;
        }
        r = params[rp[0]][j];
        s = r.toString();
        
        for (i = 0; i < rows - 1; i++) {
          r = operations[ro[i]].func(r, params[rp[i + 1]][j]);
          if (i > 0 && operations[ro[i - 1]].priority < operations[ro[i]].priority) {
            s = '(' + s + ')';
          }
          s += operations[ro[i]].symbo + params[rp[i + 1]][j].toString();
        }
        result.push([s, r]);
      }

      //检查结果是否为等差数列
      var as = true;
      var delta = 0;
      for (i = 0; i < result.length - 2; i++) {
        if (result[i][1] - result[i + 1][1] !== result[i + 1][1] - result[i + 2][1]) {
          as = false;
          break;
        }
      }
      //如果是等差数列,说明 rp 的参数排列方式结合 ro 的运算组合可以产生一个规律
      if (as) {
       	delta = result[0][1] - result[1][1];
        console.log(rp, ro, delta, result);
      }
    }
  }
}






<h1>
  小学生数字找规律
</h1>
<p><input id=rows type=number onchange=dimChange()>
  组,每组
  <input id=cols type=number onchange=dimChange()>
  个数字。
</p>
<div>
  ---------------------------------------------
  <p>
    已知数字,请按顺序填写
  </p>
  <div id=params>
  </div>
  ---------------------------------------------
  <br>
  <button onclick=run()>
    click
  </button>
</div>
input {
  width: 50px;
  height: 1.5rem;
  font-size: 1rem;
  font-weight: bold;
  text-align: center;
  margin: 0 10px;
}

input.error {
  background-color: lightpink;
  color: darkred;
}