167 lines
3.6 KiB
JavaScript
167 lines
3.6 KiB
JavaScript
const { execSync } = require('child_process');
|
|
|
|
const results = {
|
|
2020: {
|
|
1: [1007104, 18847752],
|
|
2: [465, 294],
|
|
3: [237, 2106818610],
|
|
4: [200, 116],
|
|
5: [801, 597],
|
|
6: [6297, 3158],
|
|
7: [177, 34988],
|
|
8: [1553, 1877],
|
|
9: [1721308972, 209694133],
|
|
10: [2277, 37024595836928],
|
|
},
|
|
2019: {
|
|
1: [3386686, 5077155],
|
|
2: [3166704, 8018],
|
|
3: [1225, 107036],
|
|
4: [2150, 1462],
|
|
5: [16434972, 16694270],
|
|
6: [154386, 346],
|
|
},
|
|
2018: {
|
|
1: [578, 82516],
|
|
2: [4980, 'qysdtrkloagnfozuwujmhrbvx'],
|
|
3: [124850, 1097],
|
|
4: [76357, 41668],
|
|
// slow
|
|
5: [11894, 5310],
|
|
},
|
|
2017: {
|
|
1: [1097, 1188],
|
|
2: [41887, 226],
|
|
3: [438, 266330],
|
|
4: [383, 265],
|
|
// slow (pt2)
|
|
5: [391540, 30513679],
|
|
// todo:
|
|
// 6: [12841, 8038],
|
|
},
|
|
2016: {
|
|
1: [262, 131],
|
|
2: [24862, '46C91'],
|
|
3: [1032, 1838],
|
|
4: [278221, 267],
|
|
// very slow
|
|
5: ['2414bc77', '437e60fc'],
|
|
6: ['mshjnduc', 'apfeeebz'],
|
|
},
|
|
2015: {
|
|
1: [74, 1795],
|
|
2: [1598415, 3812909],
|
|
3: [2565, 2639],
|
|
// slow
|
|
4: [117946, 3938038],
|
|
5: [238, 69],
|
|
6: [377891, 14110788],
|
|
7: [3176, 14710],
|
|
8: [1342, 2074],
|
|
},
|
|
};
|
|
|
|
const LOG_MODE = ((LOG_MODE) => {
|
|
switch (LOG_MODE) {
|
|
case 'compact':
|
|
return 'compact';
|
|
default:
|
|
return 'verbose';
|
|
}
|
|
})(process.env.LOG_MODE || 'compact');
|
|
const RUN_SLOW = (process.env.RUN_SLOW || 'false') === 'true';
|
|
|
|
let errors = [];
|
|
|
|
const run = (year, day, problem, expected) => {
|
|
try {
|
|
switch (LOG_MODE) {
|
|
case 'compact':
|
|
break;
|
|
case 'verbose':
|
|
process.stdout.write(`${year}-${day} ${problem}: `);
|
|
break;
|
|
}
|
|
|
|
// todo: implement slow solution detection of some sort
|
|
const start = process.hrtime.bigint();
|
|
const output = execSync(
|
|
`"${process.argv[0]}" index.js ${year} ${day} ${problem}`,
|
|
);
|
|
const end = process.hrtime.bigint();
|
|
const actual = output.toString().trim();
|
|
if (actual !== `${expected}`) {
|
|
switch (LOG_MODE) {
|
|
case 'compact':
|
|
process.stdout.write('x');
|
|
errors.push(
|
|
`${year}-${day} ${problem} got ${actual}, expected ${expected}\n`,
|
|
);
|
|
break;
|
|
case 'verbose':
|
|
process.stdout.write('fail\n');
|
|
process.stdout.write(`\tgot ${actual}, expected ${expected}\n`);
|
|
break;
|
|
}
|
|
} else {
|
|
switch (LOG_MODE) {
|
|
case 'compact':
|
|
process.stdout.write('.');
|
|
break;
|
|
case 'verbose':
|
|
process.stdout.write('pass\n');
|
|
break;
|
|
}
|
|
}
|
|
} catch (e) {
|
|
process.stdout.write('x\n');
|
|
switch (LOG_MODE) {
|
|
case 'compact':
|
|
process.stdout.write('e');
|
|
errors.push(
|
|
`${year}-${day} ${problem} Error:\n${e.stderr
|
|
.toString()
|
|
.split('\n')
|
|
.map((s) => '\t' + s)
|
|
.join('\n')}`,
|
|
);
|
|
break;
|
|
case 'verbose':
|
|
process.stdout.write('error\n');
|
|
process.stdout.write(
|
|
e.stderr
|
|
.toString()
|
|
.split('\n')
|
|
.map((s) => '\t' + s)
|
|
.join('\n') + '\n',
|
|
);
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
|
|
for (const [year, days] of Object.entries(results)) {
|
|
switch (LOG_MODE) {
|
|
case 'compact':
|
|
process.stdout.write(`${year}: `);
|
|
break;
|
|
case 'verbose':
|
|
break;
|
|
}
|
|
for (const [day, [one, two]] of Object.entries(days)) {
|
|
run(year, day, 1, one);
|
|
run(year, day, 2, two);
|
|
}
|
|
switch (LOG_MODE) {
|
|
case 'compact':
|
|
process.stdout.write('\n');
|
|
break;
|
|
case 'verbose':
|
|
break;
|
|
}
|
|
}
|
|
|
|
for (const error of errors) {
|
|
process.stdout.write(error);
|
|
}
|