console
var rows = 2;
var cols = 3;
function init() {
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];
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;
}
}
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;
}