feat(euler): allow for many challenges to be run at once
-
This commit is contained in:
parent
5795d11620
commit
bd6470879a
7 changed files with 75 additions and 22 deletions
|
@ -14,6 +14,7 @@
|
||||||
"chalk": "^4.1.2",
|
"chalk": "^4.1.2",
|
||||||
"cheerio": "^1.0.0-rc.10",
|
"cheerio": "^1.0.0-rc.10",
|
||||||
"execution-time": "^1.4.1",
|
"execution-time": "^1.4.1",
|
||||||
|
"ms": "^2.1.3",
|
||||||
"regenerator-runtime": "^0.13.9",
|
"regenerator-runtime": "^0.13.9",
|
||||||
"ts-node": "^10.4.0",
|
"ts-node": "^10.4.0",
|
||||||
"typescript": "^4.4.4"
|
"typescript": "^4.4.4"
|
||||||
|
|
|
@ -8,6 +8,7 @@ specifiers:
|
||||||
chalk: ^4.1.2
|
chalk: ^4.1.2
|
||||||
cheerio: ^1.0.0-rc.10
|
cheerio: ^1.0.0-rc.10
|
||||||
execution-time: ^1.4.1
|
execution-time: ^1.4.1
|
||||||
|
ms: ^2.1.3
|
||||||
regenerator-runtime: ^0.13.9
|
regenerator-runtime: ^0.13.9
|
||||||
ts-node: ^10.4.0
|
ts-node: ^10.4.0
|
||||||
typescript: ^4.4.4
|
typescript: ^4.4.4
|
||||||
|
@ -20,6 +21,7 @@ devDependencies:
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
cheerio: 1.0.0-rc.10
|
cheerio: 1.0.0-rc.10
|
||||||
execution-time: 1.4.1
|
execution-time: 1.4.1
|
||||||
|
ms: 2.1.3
|
||||||
regenerator-runtime: 0.13.9
|
regenerator-runtime: 0.13.9
|
||||||
ts-node: 10.4.0_626351e049b80b142acb2ce48a7f5656
|
ts-node: 10.4.0_626351e049b80b142acb2ce48a7f5656
|
||||||
typescript: 4.4.4
|
typescript: 4.4.4
|
||||||
|
@ -518,6 +520,13 @@ packages:
|
||||||
}
|
}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/ms/2.1.3:
|
||||||
|
resolution:
|
||||||
|
{
|
||||||
|
integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
||||||
|
}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/nth-check/2.0.1:
|
/nth-check/2.0.1:
|
||||||
resolution:
|
resolution:
|
||||||
{
|
{
|
||||||
|
|
|
@ -32,7 +32,7 @@ The source code can be found in the [src](src) directory. My thoughts about some
|
||||||
- [x] [18 - Maximum path sum I](src/18%20-%20Maximum%20path%20sum%20I.ts)
|
- [x] [18 - Maximum path sum I](src/18%20-%20Maximum%20path%20sum%20I.ts)
|
||||||
- [x] [19 - Counting Sundays](src/19%20-%20Counting%20Sundays.ts)
|
- [x] [19 - Counting Sundays](src/19%20-%20Counting%20Sundays.ts)
|
||||||
- [x] [20 - Factorial digit sum](src/20%20-%20Factorial%20digit%20sum.ts)
|
- [x] [20 - Factorial digit sum](src/20%20-%20Factorial%20digit%20sum.ts)
|
||||||
- [ ] 21 - Amicable numbers
|
- [x] [21 - Amicable numbers](src/21%20-%20Amicable%20numbers.ts)
|
||||||
- [ ] 22 - Names scores
|
- [ ] 22 - Names scores
|
||||||
- [ ] 23 - Non-abundant sums
|
- [ ] 23 - Non-abundant sums
|
||||||
- [ ] 24 - Lexicographic permutations
|
- [ ] 24 - Lexicographic permutations
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const chalk = require('chalk');
|
const chalk = require('chalk');
|
||||||
const { spawnSync } = require('child_process');
|
const { spawnSync } = require('child_process');
|
||||||
const perf = require('execution-time')();
|
const executionTime = require('execution-time')();
|
||||||
|
const ms = require('ms');
|
||||||
|
|
||||||
const generateBanner = text => {
|
const generateBanner = text => {
|
||||||
// Calculate the length of the divider
|
// Calculate the length of the divider
|
||||||
|
@ -20,42 +21,84 @@ const run = file => {
|
||||||
console.log(generateBanner(file.split('.ts')[0]));
|
console.log(generateBanner(file.split('.ts')[0]));
|
||||||
|
|
||||||
// Execute the file
|
// Execute the file
|
||||||
perf.start();
|
executionTime.start();
|
||||||
|
|
||||||
spawnSync('npx', ['ts-node', `"src/${file}"`], {
|
spawnSync('npx', ['ts-node', `"src/${file}"`], {
|
||||||
shell: true,
|
shell: true,
|
||||||
stdio: 'inherit'
|
stdio: 'inherit'
|
||||||
});
|
});
|
||||||
const results = perf.stop();
|
|
||||||
|
const results = executionTime.stop();
|
||||||
|
|
||||||
// Print time results
|
// Print time results
|
||||||
console.log();
|
console.log();
|
||||||
console.log(chalk.bold(chalk.yellow(`Executed in ${results.words}`)));
|
console.log(chalk.bold(chalk.yellow(`Executed in ${results.words}`)));
|
||||||
|
|
||||||
|
return results.time;
|
||||||
|
};
|
||||||
|
|
||||||
|
const runMany = files => {
|
||||||
|
let totalTime = 0;
|
||||||
|
|
||||||
|
files.forEach(file => {
|
||||||
|
const time = run(file);
|
||||||
|
totalTime += time;
|
||||||
|
console.log();
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
chalk.magenta(
|
||||||
|
chalk.bold(
|
||||||
|
`This set of executions took roughly ${ms(totalTime, { long: true })} in total!`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Get files
|
// Get files
|
||||||
const tsFiles = fs
|
const allFiles = fs
|
||||||
.readdirSync('src')
|
.readdirSync('src')
|
||||||
.filter(f => f.endsWith('.ts'))
|
.filter(f => f.endsWith('.ts'))
|
||||||
.filter(f => f !== 'utils.ts');
|
.filter(f => f !== 'utils.ts');
|
||||||
|
|
||||||
// Extract the puzzle number
|
// Extract the puzzle number
|
||||||
const puzzleNumber = process.argv[2];
|
process.argv.shift();
|
||||||
|
process.argv.shift();
|
||||||
|
|
||||||
if (puzzleNumber === 'all' || !puzzleNumber) {
|
if (process.argv[0] === 'all' || process.argv.length === 0) {
|
||||||
tsFiles
|
const files = allFiles.sort((a, b) => {
|
||||||
.sort((a, b) => {
|
a = parseInt(a.split('-')[0]);
|
||||||
a = parseInt(a.split('-')[0]);
|
b = parseInt(b.split('-')[0]);
|
||||||
b = parseInt(b.split('-')[0]);
|
|
||||||
|
|
||||||
return a > b ? 1 : -1;
|
return a > b ? 1 : -1;
|
||||||
})
|
});
|
||||||
.forEach(file => {
|
|
||||||
run(file);
|
runMany(files);
|
||||||
console.log();
|
} else if (process.argv.length > 1 || process.argv[0].includes(',')) {
|
||||||
});
|
let puzzleNumbers = process.argv
|
||||||
} else if (!isNaN(puzzleNumber)) {
|
.map(v =>
|
||||||
|
v.includes(',')
|
||||||
|
? v.split(',').map(e => (!isNaN(e) ? parseInt(e) : null))
|
||||||
|
: !isNaN(v)
|
||||||
|
? parseInt(v)
|
||||||
|
: null
|
||||||
|
)
|
||||||
|
.flat()
|
||||||
|
.filter(e => e !== null);
|
||||||
|
puzzleNumbers = puzzleNumbers.filter((e, i) => puzzleNumbers.indexOf(e) === i);
|
||||||
|
|
||||||
|
const files = allFiles.filter(f =>
|
||||||
|
f.match(
|
||||||
|
`^(?:[${puzzleNumbers.map((number, i) =>
|
||||||
|
i === puzzleNumbers.length - 1 ? number : `${number}|`
|
||||||
|
)}]) -`
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
runMany(files);
|
||||||
|
} else if (!isNaN(process.argv[0])) {
|
||||||
// Find the associated puzzle
|
// Find the associated puzzle
|
||||||
const [file] = tsFiles.filter(f => f.startsWith(puzzleNumber));
|
const [file] = allFiles.filter(f => f.startsWith(process.argv[0]));
|
||||||
run(file);
|
run(file);
|
||||||
} else {
|
} else {
|
||||||
console.log(
|
console.log(
|
||||||
|
|
|
@ -4,7 +4,7 @@ export {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use the Sieve of Eratosthenes to find the sum of primes up until a limit.
|
* Use the Sieve of Eratosthenes to find the sum of primes up until a limit.
|
||||||
* @see https://github.com/newtykins/the-honk/tree/main/projects/euler/thoughts/10%20-Summation%20of%29primes.md
|
* @see https://github.com/newtykins/the-honk/tree/main/challenges/euler/thoughts/10%20-%20Summation%20of%29primes.md
|
||||||
*/
|
*/
|
||||||
const sumOfPrimes = (limit: number) => {
|
const sumOfPrimes = (limit: number) => {
|
||||||
let array: boolean[] = [];
|
let array: boolean[] = [];
|
||||||
|
|
|
@ -13,7 +13,7 @@ const factorial = (n: number) => {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Count the lattice paths using the formula shown in the thoughts document.
|
* Count the lattice paths using the formula shown in the thoughts document.
|
||||||
* @see https://github.com/newtykins/the-honk/tree/main/projects/euler/thoughts/15%20-Lattice%20paths.md
|
* @see https://github.com/newtykins/the-honk/tree/main/challenges/euler/thoughts/15%20-%20Lattice%20paths.md
|
||||||
*/
|
*/
|
||||||
const countLatticePaths = (width: number, height: number) => {
|
const countLatticePaths = (width: number, height: number) => {
|
||||||
return factorial(width + height) / (factorial(width) * factorial(height));
|
return factorial(width + height) / (factorial(width) * factorial(height));
|
||||||
|
|
|
@ -6,7 +6,7 @@ export {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find a Pythagorean triplet based on its sum
|
* Find a Pythagorean triplet based on its sum
|
||||||
* @see // See https://github.com/newtykins/the-honk/tree/main/projects/euler/thoughts/9%20-Special%20Pythagorean%29triplet.md
|
* @see https://github.com/newtykins/the-honk/tree/main/challenges/euler/thoughts/9%20-%20Special%20Pythagorean%29triplet.md
|
||||||
*/
|
*/
|
||||||
const pythagoreanTriplet = (sum: number) => {
|
const pythagoreanTriplet = (sum: number) => {
|
||||||
let a: number,
|
let a: number,
|
||||||
|
|
Loading…
Reference in a new issue