Skip to content

Instantly share code, notes, and snippets.

@Vopaaz
Last active October 12, 2020 10:20
Show Gist options
  • Save Vopaaz/bc90973801b80a45aff8480f54e4b424 to your computer and use it in GitHub Desktop.
Save Vopaaz/bc90973801b80a45aff8480f54e4b424 to your computer and use it in GitHub Desktop.
Calculate Tsinghua University GPA at the "All Scores", i.e. "本科生已修课程成绩查询" page
var reverse = (arr)=>{ // Array.prototype.reverse is overridden in a bloody way in the webpage
const res = []
for (let index = arr.length-1; index >= 0; index--) {
const element = arr[index];
res.push(element)
}
return res
}
(() => {
var nameIx = 2
var creditIx = 3
var gpIx = 6
var attrIx = 8
var sideIx = 9
var termIx = 10
var courses = Array.from(
document.querySelector("body > table:nth-child(44) > tbody").children
)
.slice(1, -1)
.map((course) => {
var c = course.children
var gpRaw = c[gpIx].innerText
return {
name: c[nameIx].innerText,
credit: Number(c[creditIx].innerText),
gp: (gpRaw && gpRaw !== "N/A") ? Number(gpRaw) : undefined,
attr: c[attrIx].innerText,
side: c[sideIx].innerText === "辅修专业课程",
term: c[termIx].innerText
}
})
.filter(course => course.gp)
var rr = courses.filter(course => course.attr === "必修" || course.attr === "限选")
var major = courses.filter(course => !course.side)
var side = courses.filter(course => course.side)
var terms = {}
courses.forEach((course) => {
if (course.term.endsWith("-3")) {
return
}
if (terms[course.term] === undefined) {
terms[course.term] = [course]
} else {
terms[course.term].push(course)
}
})
var years = {}
reverse(courses).forEach((course)=>{
const course_year = course.term.slice(0,4)
if(years[course_year] === undefined){
years[course_year] = []
}
for (const year of Object.values(years)) {
year.push(course)
}
})
var calc =
(courses) =>
courses
.map(course => course.gp * course.credit)
.reduce((x, y) => x + y) /
courses
.map(course => course.credit)
.reduce((x, y) => x + y)
console.log(
`
------------ 整体情况 -----------
必限:${calc(rr)}
主修:${calc(major)}
辅修:${calc(side)}
所有:${calc(courses)}
---- 各春/秋学期, Single Term ----
${
Object.keys(terms)
.map((key) => {
return {
term: key,
gp: calc(terms[key])
}
})
.map(obj => obj.term + ": " + String(obj.gp))
.join("\n")
}
----- 各学年, Accumulated ------
${
Object.keys(years)
.map((key) =>({
year: key,
gp: calc(years[key])
}))
.map(obj => obj.year + ": " + String(obj.gp))
.join("\n")
}
`
)
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment