-
Notifications
You must be signed in to change notification settings - Fork 0
/
updateresults.js
114 lines (99 loc) · 4.53 KB
/
updateresults.js
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
114
const fs = require("fs");
const path = require("path");
// eslint-disable-next-line
const fetch = require("node-fetch");
const cookietext = fs.readFileSync(path.join(__dirname, "cookie.txt"));
function th(num) {
const str = "" + num;
if(str[str.length-1] === "1") {
return num + "ˢᵗ";
}else if(str[str.length-1] === "2") {
return num + "ⁿᵈ";
}else if(str[str.length-1] === "3") {
return num + "ʳᵈ";
}else return num + "ᵗʰ";
}
async function runfor(year) {
/** @type {string} */
const input_text_raw = (await (await fetch("https://adventofcode.com/"+year+"/leaderboard/self", {
headers: {"Cookie": cookietext},
})).text());
const input_text = input_text_raw.match(/oard-daydesc-both">.+?<\/span>([^<]+?)<\/pre>/)[1].trim();
const inv = input_text.split("\n").map(l => l.trim().split(/ +/g))
.map(([day, time, pos, pts, time2, pos2, pts2]) => ({day: +day, time, pos: +pos, pts: +pts, time2, pos2: +pos2, pts2: +pts2}))
;
const attemptedlb = a => (
year === "2020" && a.day === 1 ? false
: year === "2021" && a.day === 1 ? false
: year === "2019" && a.day === 5 ? false
: year === "2018" && a.day === 1 ? false
: year === "2021" && a.day === 5 ? false
: year === "2022" && a.day === 1 ? false
: year === "2023" && a.day === 1 ? false
: a.time.split(":").length === 3 && a.time2.split(":").length === 3
);
const attemptsonly = inv.filter(attemptedlb);
const txtv = inv
.map(v => {
if(!attemptedlb(v)) {
return "| " + ("" + v.day).padStart(3, " ") +
" | n/a | --- | | n/a | --- | |";
}
return "| " + ("" + v.day).padStart(3, " ") +
" | " + v.time.padStart(8, " ") +
" | " + ("" + v.pos).padStart(4, " ") +
" | " + (v.pts ? "" + v.pts : "").padStart(5, " ") +
" | " + v.time2.padStart(8, " ") +
" | " + ("" + v.pos2).padStart(4, " ") +
" | " + (v.pts2 ? "" + v.pts2 : "").padStart(5, " ") +
" |"})
.join("\n")
;
const timesonlb = attemptsonly.reduce((t, a) => t + +!! a.pts + +!! a.pts2, 0);
const timestop1k = attemptsonly.reduce((t, a) => t + +(a.pos <= 1000) + +(a.pos2 <= 1000), 0);
const lb_attempts = attemptsonly.length * 2;
const bestday = attemptsonly.reduce((t, a) => a.pts + a.pts2 > t.pts + t.pts2 ? a : t, {day: -1, pts: 0, pts2: 0});
const avg = attemptsonly.reduce((t, a) => t + a.pos + a.pos2, 0) / (attemptsonly.length * 2);
const median = attemptsonly.flatMap(a => [a.pos, a.pos2]).sort((a, b) => a - b)[attemptsonly.length];
const res = ""
+ "### "+year+"\n"
+ "\n"
+ "- Total Score: " + (inv.reduce((t, a) => t + a.pts + (a.pts2 || 0), 0)) + "\n"
+ "- Times On Leaderboard: " + (timesonlb) + " / "+(lb_attempts)+" (~"
+ (timesonlb / lb_attempts).toLocaleString(undefined, {style: "percent"}) + ")"+"\n"
+ "- Times Top 1000: " + (timestop1k) + " / "+(lb_attempts)+" (~"
+ (timestop1k / lb_attempts).toLocaleString(undefined, {style: "percent"}) + ")"+"\n"
+ "- Best Leaderboard Position: " + th(inv.reduce((t, a) => Math.min(t, a.pos, a.pos2 || Infinity), Infinity))
+ " place\n"
+ "- Worst Leaderboard Position: " + th(attemptsonly.reduce((t, a) => Math.max(t, a.pos, a.pos2 || Infinity), 0))
+ " place\n"
+ "- Average Leaderboard Position: " + th(avg |0) + " place\n"
+ "- Median Leaderboard Position: " + th(median) + " place\n"
+ "- Best Day was "+`Day ${bestday.day}: ${bestday.pts + bestday.pts2} points, #${bestday.pos}/#${bestday.pos2}`+"\n"
+ "\n"
+ "| Day | Time | Rank | Score | Time | Rank | Score |\n"
+ "| --: | -------: | ---: | ----: | -------: | ---: | ----: |\n"
+ txtv + "\n"
return res;
}
/*
+ "<!-- start-results -->\n"
+ "\n"
+ "<!-- end-results -->\n"
*/
async function main() {
const year = "2023";
const v = await runfor(year);
const rt = ""
+ "<!-- dynamic-results:"+year+" start -->\n"
+ "\n"
+ v
+ "\n"
+ "<!-- dynamic-results:"+year+" end -->"
;
console.log(rt);
const mc = fs.readFileSync("./README.md", "utf-8");
const wc = mc.replace(new RegExp("<!-- dynamic-results:"+year+" start -->[^\\x1b]+?<!-- dynamic-results:"+year+" end -->"), rt);
fs.writeFileSync("./README.md", wc);
}
main().catch(e => {throw e;});