-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
executable file
·113 lines (90 loc) · 4.57 KB
/
index.js
File metadata and controls
executable file
·113 lines (90 loc) · 4.57 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
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/env node
const fs = require("fs");
const DAYS_PER_YEAR = 12;
function showUsage() {
console.log("Usage:");
console.log("\t./index.js create <year>\t\tCreate all the directories for a new year of AoC");
console.log("\t./index.js status\t\t\tUpdate README.md to show the current AoC progress");
console.log("\t./index.js run <year> <day>\t\tRun the puzzle for a specific day of AoC");
}
function createNewYear(year) {
if (!year)
return console.error("Please provide a year!");
if (year.length !== 4)
return console.error("Please provide a year with 4 digits!");
if (fs.existsSync(`${__dirname}/${year}`))
return console.error(`Year '${year}' already exists!`);
for (let i = 1; i <= DAYS_PER_YEAR; i++) {
const newDay = String(i).padStart(2, "0");
fs.mkdirSync(`${__dirname}/${year}/Day ${newDay}`, { recursive: true });
fs.writeFileSync(`${__dirname}/${year}/Day ${newDay}/input.txt`, "");
fs.writeFileSync(`${__dirname}/${year}/Day ${newDay}/index.js`, `const fs = require("fs");\nconst input = fs.readFileSync(\`\${__dirname\}/input.txt\`, "utf8");\n\n\nconsole.log("AoC ${year} Day ${i}:");\n\n// Part 1\nconsole.log(\`Part 1 answer: \${""}\`); // \n\n\n// Part 2\nconsole.log(\`Part 2 answer: \${""}\`); // `);
}
}
function updateStatus() {
const years = fs.readdirSync(__dirname, { withFileTypes: true })
.filter(d => d.isDirectory() && /^\d{4}$/.test(d.name))
.map(d => d.name)
.sort((a, b) => +b - +a);
const maxDays = Math.max(...years.map(year => fs.readdirSync(`${__dirname}/${year}`, { withFileTypes: true })
.filter(d => d.isDirectory() && /^Day \d{2}$/.test(d.name))
.length));
const maxDaysName = Array.from({ length: maxDays }, (_, i) => `Day ${String(i + 1).padStart(2, "0")}`);
let output = `# [AdventOfCode](https://adventofcode.com/)\n\n${"| **`⭐{EARNED_STARS}/{TOTAL_STARS}`** | " + maxDaysName.join(" | ") + " |"}\n${"| :---: ".repeat(maxDaysName.length + 1) + "|"}`;
let earnedStars = 0, totalStars = 0;
years.forEach(year => {
const yearDays = fs.readdirSync(`${__dirname}/${year}`, { withFileTypes: true })
.filter(d => d.isDirectory() && /^Day \d{2}$/.test(d.name))
.map(d => d.name);
let yearOutput = `| [${year}](https://adventofcode.com/${year} '⭐{YEAR_STARS}/${yearDays.length * 2}') |`;
let yearStars = 0;
yearDays.forEach((day, i) => {
const dayFile = fs.readFileSync(`${__dirname}/${year}/${day}/index.js`).toString();
const dayStars = dayFile.match(/console\.log\(`Part (?:1|2) answer:.+`\); \/\/ .+/g)?.length ?? 0;
yearStars += dayStars;
yearOutput += ` [${dayStars === 2 ? "🟢" : dayStars === 1 ? "🟡" : "🔴"}](https://adventofcode.com/${year}/day/${i + 1} '⭐${dayStars}/2') |`;
});
earnedStars += yearStars;
totalStars += yearDays.length * 2;
output += `\n${yearOutput.replace("{YEAR_STARS}", yearStars)}`;
});
output = output.replace("{EARNED_STARS}", earnedStars);
output = output.replace("{TOTAL_STARS}", totalStars);
output += "\n\n*Pssst, you can click on the emojis to view the puzzles from that day*";
fs.writeFileSync("README.md", output);
console.log("README.md updated!");
}
function runPuzzle(year, day) {
if (!year || !day)
return console.error("Please provide both a year and a day!");
if (isNaN(year) || isNaN(day))
return console.error("Both year and day must be numbers!");
day = String(day).padStart(2, "0");
if (!fs.existsSync(`${__dirname}/${year}`))
return console.error(`Year '${year}' does not exist!`);
if (!fs.existsSync(`${__dirname}/${year}/Day ${day}`))
return console.error(`Day '${day}' does not exist in year '${year}'!`);
if (!fs.existsSync(`${__dirname}/${year}/Day ${day}/input.txt`))
return console.error(`Please provide an input in '${year}/Day ${day}/input.txt'!`);
console.time(`Execution time for AoC ${year} Day ${day}`);
require(`${__dirname}/${year}/Day ${day}/index.js`);
console.timeEnd(`Execution time for AoC ${year} Day ${day}`);
}
function main() {
if (process.argv.length < 3)
return showUsage();
switch (process.argv[2]) {
case "create":
createNewYear(process.argv[3]);
break;
case "status":
updateStatus();
break;
case "run":
runPuzzle(process.argv[3], process.argv[4]);
break;
default:
return showUsage();
}
}
main();