76 lines
1.8 KiB
TypeScript
76 lines
1.8 KiB
TypeScript
// @ts-ignore
|
|
import * as ParkMiller from "park-miller";
|
|
import { generateRandomGrid } from "../generateGrid";
|
|
import { Snake } from "../snake";
|
|
import { Grid } from "../grid";
|
|
import { computeBestRun } from "..";
|
|
import { performance } from "perf_hooks";
|
|
|
|
const snake0 = [
|
|
{ x: 4, y: -1 },
|
|
{ x: 3, y: -1 },
|
|
{ x: 2, y: -1 },
|
|
{ x: 1, y: -1 },
|
|
{ x: 0, y: -1 },
|
|
];
|
|
|
|
const gameOptions = {
|
|
maxSnakeLength: 5,
|
|
colors: [1, 2, 3, 4],
|
|
};
|
|
|
|
const run = (grid: Grid, snake0: Snake, k: number) => {
|
|
const stats: number[] = [];
|
|
const s0 = performance.now();
|
|
|
|
const M = 60 * 1000;
|
|
let n = 40;
|
|
|
|
while (performance.now() - s0 < M && n-- > 0) {
|
|
const s = performance.now();
|
|
computeBestRun(grid, snake0, gameOptions, k);
|
|
|
|
stats.push(performance.now() - s);
|
|
}
|
|
|
|
return stats;
|
|
};
|
|
|
|
const report = (arr: number[]) => {
|
|
const average = (arr: number[]) =>
|
|
arr.reduce((s, x) => s + x, 0) / arr.length;
|
|
|
|
const spread = (arr: number[]) => {
|
|
const m = average(arr);
|
|
const v = average(arr.map((x) => Math.pow(x - m, 2)));
|
|
return Math.sqrt(v) / m;
|
|
};
|
|
|
|
const format = (x: number): string => {
|
|
const u = Math.floor(x / 1000);
|
|
const d = Math.floor(x % 1000).toString();
|
|
return u === 0 ? d : format(u) + " " + d.padEnd(3, "0");
|
|
};
|
|
|
|
return `${format(average(arr)).padStart(12)} ms ±${(spread(arr) * 100)
|
|
.toFixed(2)
|
|
.padStart(5)}% (x${arr.length.toString().padStart(3)})`;
|
|
};
|
|
|
|
[
|
|
//
|
|
[10, 10, 1000],
|
|
[21, 7, 1000],
|
|
[42, 7, 1000],
|
|
[42, 7, 5000],
|
|
[42, 7, 14000],
|
|
[42, 7, 30000],
|
|
].forEach(([w, h, k]) => {
|
|
const random = new ParkMiller(1);
|
|
const grid = generateRandomGrid(w, h, { ...gameOptions, emptyP: 3 }, (a, b) =>
|
|
random.integerInRange(a, b)
|
|
);
|
|
const stats = run(grid, snake0, k);
|
|
console.log(`${w}x${h} : ${k}\n ${report(stats)}\n`);
|
|
});
|