mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-17 09:36:08 +08:00
47 lines
1.1 KiB
TypeScript
47 lines
1.1 KiB
TypeScript
const _CACHE_INFO = {
|
|
s: 0.0,
|
|
y: 0,
|
|
values: [0.0],
|
|
};
|
|
|
|
function _LOGP(x: number) {
|
|
const sqrtPi = 2.506628274631; // Sqrt[Pi]
|
|
return (2 * Math.exp(-2.0 * (Math.log(x) ** 2))) / x / sqrtPi;
|
|
}
|
|
|
|
function _intergrateEnsureCache(y: number) {
|
|
let lastY = _CACHE_INFO.y;
|
|
if (y <= lastY) return _CACHE_INFO;
|
|
let s = _CACHE_INFO.s;
|
|
const dx = 0.1;
|
|
const dT = 2;
|
|
let x0 = (lastY / dT) * dx;
|
|
while (y > lastY) {
|
|
x0 += dx;
|
|
s += _LOGP(x0) * dx;
|
|
for (let i = 1; i <= dT; i++) _CACHE_INFO.values.push(s);
|
|
lastY += dT;
|
|
}
|
|
_CACHE_INFO.y = lastY;
|
|
_CACHE_INFO.s = s;
|
|
return _CACHE_INFO;
|
|
}
|
|
|
|
_intergrateEnsureCache(10000);
|
|
|
|
function _integrate(y: number) {
|
|
_intergrateEnsureCache(y);
|
|
return _CACHE_INFO.values[y];
|
|
}
|
|
|
|
function difficultyAlgorithm(nSubmit: number, nAccept: number) {
|
|
if (!nSubmit) return null;
|
|
const s = _integrate(nSubmit);
|
|
const acRate = nAccept / nSubmit;
|
|
const ans = Math.round(10 - 13 * s * acRate);
|
|
return Math.max(ans, 1);
|
|
}
|
|
|
|
export = difficultyAlgorithm;
|
|
global.Hydro.lib.difficulty = difficultyAlgorithm;
|