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], 11: [2359, 2131], 12: [508, 30761], 13: [2095, 598411311431841], 14: [13556564111697, 4173715962894], }, 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], 6: [5626, 46554], }, 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); }