mirror of
https://github.com/voltrevo/ValueScript.git
synced 2026-01-13 07:28:03 -05:00
47 lines
875 B
TypeScript
47 lines
875 B
TypeScript
// test_output! [1,6,17]
|
|
|
|
export default function () {
|
|
const poly = buildPoly([1, 2, 3]); // 1 + 2*x + 3*x^2
|
|
|
|
return [
|
|
poly(0),
|
|
poly(1),
|
|
poly(2),
|
|
];
|
|
}
|
|
|
|
type Poly = (x: number) => number;
|
|
|
|
function pow(n: number): Poly {
|
|
// Captures the number n
|
|
return (x: number) => x ** n;
|
|
}
|
|
|
|
function add(p: Poly, q: Poly): Poly {
|
|
// Captures the functions p and q
|
|
return (x) => p(x) + q(x);
|
|
}
|
|
|
|
function scale(c: number, p: Poly): Poly {
|
|
// Captures the number c and the function p
|
|
return (x) => c * p(x);
|
|
}
|
|
|
|
// Little endian:
|
|
// a0*x^0 + a1*x^1 + a2*x^2 + ...
|
|
function buildPoly(a: number[]): Poly {
|
|
let poly: Poly = () => 0;
|
|
|
|
for (let i = 0; i < a.length; i++) {
|
|
const term = scale(a[i], pow(i));
|
|
poly = add(poly, term);
|
|
}
|
|
|
|
return poly;
|
|
|
|
// Also works:
|
|
// return a
|
|
// .map((c, i) => scale(c, pow(i)))
|
|
// .reduce(add, () => 0);
|
|
}
|