跳过正文

试着找出问号所代表的数

·446 字·
<input placeholder="数字间逗号分隔" value="1,3,5,7,?" id="numbers" />
<h1>试着找出问号所代表的数</h1>
<p> 正确答案是</p>
<mark>114514</mark>
<p>因为当</p>
<div id="function"></div>
<ul id="function-values"></ul>
<p>真有逻辑!真是有趣!哇!数学!哇!</p>
html, body {
  height: 100%;
  background: hsl(216, 69%, 95%);
}
input {
  border: 3px solid rgba(0, 0, 0, .09);
  border-radius: 8px;
  font-size: 45px;
  text-align: center;
  background: transparent;
  color: hsl(216, 90%, 43%);
  font-family: 'Monaco', monospace;
  font-weight: 700;
  transition: border .2s ease, background .2s ease;
  outline: none;
  background: rgba(0, 0, 0, .01);
  max-width: 95vw;
}
input:hover {
  border: 3px solid rgba(0, 0, 0, .23);
}
input:focus {
  border: 3px solid hsl(216, 90%, 43%);
  background: hsla(204, 100%, 88%, .4);
}
body {
  margin: 0;
  padding: 10vh 0 5vh;
  display: flex;
  flex-direction: column;
  align-items: center;
}

mark { background: hsl(138, 56%, 85%); color: hsl(138, 90%, 43%); font-family: ‘Monaco’, monospace; font-weight: 700; margin: 12px; padding: 0 16px; height: 64px; line-height: 64px; font-size: 40px; border-radius: 32px; }

ul > li { list-style: none; }

.homo-value { color: hsl(15, 99%, 57%); }

//线性方程组(n元一次方程组)求解库
import * as linear from "https://cdn.skypack.dev/linear-solve@1.2.1";

const functionContainer = document.getElementById('function');
const functionValuesContainer = document.getElementById('function-values');

document.getElementById('numbers').addEventListener('input', ({target}) => {
  //清除旧函数
  functionValuesContainer.innerHTML = '';
  functionContainer.innerHTML = '';
  
  const numbers = target.value.split(',').map(number => {
    const parsed = parseFloat(number);
    return isFinite(parsed) ? parsed : 114514; //NaN、Infinity当问号处理
  });
  const exponents = Array(numbers.length).fill(numbers.length - 1).map((number, exponent) => number - exponent);
  const products = linear.solve(Array(numbers.length).fill(0).map(
    (v, index) => exponents.map(exponent => (index + 1) ** exponent)
  ), [...numbers])
  .map((solution, index, solutions) => {
    let product = '';
    if(solution) {
      if(index) product += solution > 0 ? '+' : '-';
      product += Math.abs(solution).toFixed(3);
      if(solutions.length - index - 1) {
        product += 'x';
        if(solutions.length - index - 2) product += `^${exponents[index]}`;
      }
    }
    return product;
  });
  katex.render(`f(x) = ${products.join('')}`, functionContainer, {
    throwOnError: false
  });
  for(let [index, number] of numbers.entries()) {
    const functionValue = document.createElement('li');
    if(number === 114514) functionValue.classList.add('homo-value');
    katex.render(`f(${index + 1}) = ${number}`, functionValue, {
      throwOnError: false
    });
    functionValuesContainer.append(functionValue);
  }
});

document.getElementById('numbers').dispatchEvent(new InputEvent('input'));
Sakari
作者
Sakari

相关文章

提高Linux的文件描述符限制
·667 字
技术分享 Linux
Switch 大气层双系统手柄蓝牙配对同步
·595 字
技术分享 Games