Last active
October 12, 2020 10:20
-
-
Save Vopaaz/bc90973801b80a45aff8480f54e4b424 to your computer and use it in GitHub Desktop.
Calculate Tsinghua University GPA at the "All Scores", i.e. "本科生已修课程成绩查询" page
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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