-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.ts
More file actions
100 lines (84 loc) · 2.64 KB
/
Copy pathmain.ts
File metadata and controls
100 lines (84 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import {
whichDayToRun,
renderSolutionTable,
getAllYears,
getAllDaysInAYear,
consoleClear,
} from '/src/functions/print.ts';
import { join as joinPath } from '@std/path';
import { parseArgs } from "@std/cli";
import { Result, SolutionFile } from "./types.ts";
const WORKER_PATH = new URL('./worker.ts', import.meta.url).href;
let iteration = 0;
const getInut = async (year: string, day: string) => {
const path = joinPath(Deno.cwd(), year, day, `input.txt`);
return await Deno.readTextFile(path);
}
const getSolutions = async <Input>(year: string, day: string, iteration?: number): Promise<SolutionFile<Input> & { path: string; }> => {
const path = `file:\\\\${joinPath(Deno.cwd(), year, day, `solution.ts#${iteration}`)}`;
return { ...await import(path), path };
}
const parsedArgs = parseArgs(Deno.args);
const watcher = parsedArgs.w ? Deno.watchFs(".") : [];
const config = await whichDayToRun({
year: String(parsedArgs.year).padStart(4, '0'),
day: String(parsedArgs.day).padStart(2, '0'),
});
const years = config.year ? [config.year] : await getAllYears();
const run = async (iteration = 0) => {
if (parsedArgs.clear) {
consoleClear(true);
}
for (const year of years) {
const days = config.day ? [config.day] : await getAllDaysInAYear(year);
for (const day of days) {
const { solutions, runExamples, path } = await getSolutions(year, day, iteration);
const rawInput = await getInut(year, day);
if (parsedArgs['include-examples']) {
if (runExamples) {
await runExamples();
} else {
console.warn(`WARN: argument 'include-examples' is true, but function 'runExamples' does not exists!`);
}
}
const results: Array<Result> = await Promise.all(solutions.map((_, solutionIndex) => new Promise<Result>((resolve, reject) => {
const worker = new Worker(WORKER_PATH, {
name: `solution-${year}-${day}-${solutionIndex}-${iteration}`,
type: 'module',
});
worker.addEventListener('message', ({ data }: MessageEvent<Result>) => {
worker.terminate();
resolve(data);
});
worker.addEventListener('error', (event: ErrorEvent) => {
worker.terminate();
reject(event.message);
});
worker.postMessage({
path,
input: rawInput,
solutionIndex,
});
})));
if (!parsedArgs['no-results']) {
renderSolutionTable(results.map(({
index,
result,
performance
}) => [
`${year}-${day}-${(index + 1).toString().padStart(2, '0')}`,
result,
`${performance} ms`
]),
{ year, day }
)
}
}
}
console.log('\n');
}
await run();
for await (const _ of watcher) {
await run(++iteration);
}
console.log('\n');