Skip to content

Instantly share code, notes, and snippets.

@jathak
Last active May 6, 2018 21:21
Show Gist options
  • Save jathak/a2a92ba4a6305e3758c0a2dd5abe96b9 to your computer and use it in GitHub Desktop.
Save jathak/a2a92ba4a6305e3758c0a2dd5abe96b9 to your computer and use it in GitHub Desktop.
/* CS 61A Sp18 Grade Calculation Script */
/* Run in JS console at https://okpy.org/cal/cs61a/sp18 */
GRADES = ['F', 'D-', 'D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+'];
BUCKETS = [0, 165, 170, 175, 180, 190, 200, 210, 230, 250, 270, 285, 298];
function log() {
document.querySelector('#log').innerHTML += [].slice.call(arguments).join('') + '\n';
}
function s(assign, type) {
if (!scores[assign]) return 0;
type = type || 'total';
var result = scores[assign][type] || 0;
if (type === 'total') {
return Math.max(result, scores[assign].regrade || 0);
} else if (type === 'composition') {
return Math.max(result, scores[assign].revision || 0);
}
return result;
}
function hw(num) {
var assign = num < 10 ? 'hw0' + num : 'hw' + num;
return Math.max(s(assign), s(assign, 'effort'));
}
function lab(num) {
var assign = num < 10 ? 'lab0' + num : 'lab' + num;
return s(assign);
}
function disc(num) {
var assign = num < 10 ? 'disc0' + num : 'disc' + num;
return s(assign);
}
function recovery(examScore, maxExam, recoveryCredits) {
var maxRecovery = Math.max(0, (maxExam / 2 - examScore) / 2);
return maxRecovery * (recoveryCredits / 20);
}
function logExam(name, score, recovery, maxScore) {
var incl = '';
if (recovery > 0) {
incl = ' (including ' + recovery + ' recovery)';
}
log(name + ': ' + score + '/' + maxScore + incl);
}
function gradeFor(total) {
for (var i = BUCKETS.length - 1; i >= 0; i--) {
if (total >= BUCKETS[i]) return GRADES[i];
}
}
function logPointsNeeded(total, grade, before, recoveryCredits) {
var start = GRADES.indexOf(grade);
for (var i = start + 1; i < BUCKETS.length; i++) {
if (BUCKETS[i] - before > 75) return;
var needed = BUCKETS[i] - before;
var pts = needed;
var rec = (needed >= 75 / 2 || recoveryCredits == 0) ? '' : ' (+ recovery)';
if (rec !== '') {
for (var j = 0; j < 39; j++) {
if (recovery(j, 75, recoveryCredits) + j >= needed) {
pts = j;
break;
}
}
}
log('You need ' + pts + rec + ' on the final for a ' + GRADES[i] + '.');
}
}
function calculateGrades() {
var labs = 0;
for (var i = 0; i <= 13; i++) {
labs += lab(i);
}
var discs = 0;
for (var i = 1; i <= 11; i++) {
discs += disc(i);
}
var hws = 0;
for (var i = 1; i <= 13; i++) {
hws += hw(i);
}
var checkoffs = s('lab1checkoff') + s('midterm1checkoff') + s('lab4checkoff') +
s('lab5checkoff') + s('lab6checkoff') + s('midterm2checkoff') +
s('lab9checkoff') + s('lab10checkoff') + s('lab11checkoff') + s('lab12checkoff');
var hog = s('proj01') + s('proj01', 'composition') + s('hogcheckpoint', 'checkpoint 1');
var maps = s('proj02') + s('proj02', 'composition');
var ants = s('proj03') + s('proj03', 'composition') + s('proj03', 'checkpoint 1');
var scheme = s('proj04') + s('proj04', 'checkpoint 1') + s('proj04', 'checkpoint 2');
var projects = hog + maps + ants + scheme;
var partCredits = labs + discs + checkoffs;
var partPoints = Math.min(10, partCredits);
var recoveryCredits = Math.min(partCredits, 30) - partPoints;
var mt1recovery = recovery(s('midterm1'), 40, recoveryCredits);
var mt2recovery = recovery(s('midterm2'), 50, recoveryCredits);
var finalrecovery = recovery(s('final'), 75, recoveryCredits);
var midterm1 = s('midterm1') + mt1recovery;
var midterm2 = s('midterm2') + mt2recovery;
var final = s('final') + finalrecovery;
var contests = s('proj01contest') + s('scheme_contest');
var total = projects + hws + partPoints + midterm1 + midterm2 + final + contests;
var grade = gradeFor(total);
var el = document.querySelector('#log');
if (!el) {
var el = document.createElement('pre');
el.id = 'log';
el.style.position = 'fixed';
el.style.top = '0';
el.style.left = '0';
el.style.width = '100%';
el.style.height = '100%';
el.style.background = 'black';
el.style.color = '#0f0';
el.style.zIndex = '100000';
document.body.append(el);
el.addEventListener("click", function () {
el.id = 'dead';
el.style.display = 'none';
});
}
var nameEl = document.querySelector('.user-name') || document.querySelector('.widget-user-username');
var student = nameEl.innerHTML.trim();
log('<strong>CS 61A Sp18 Score Report for ', student, '</strong>');
log('=========================================================================');
log();
log('<strong>Participation</strong>');
log('-------------------------------------------------------------------------');
log('You earned ', partCredits, ' participation credits.');
log('This counts for ', partPoints, '/10 points with ', recoveryCredits,
'/20 for exam recovery.');
log();log();
log('<strong>Points Earned</strong>');
log('-------------------------------------------------------------------------');
log('Projects: ', projects, '/100 (max score 109 w/ EC)');
var inclHw13 = hw(13) > 0 ? ' (including HW 13 EC)' : '';
log('Homeworks: ', hws, '/25', inclHw13);
log('Participation: ', partPoints, '/10');
logExam('Midterm 1', midterm1, mt1recovery, 40);
logExam('Midterm 2', midterm2, mt2recovery, 50);
logExam('Final Exam', final, finalrecovery, 75);
if (contests > 0) log('Contests: ', contests, ' (EC)');
log();
log('<strong>Total Score in the Class: ', total, '</strong>');
log();log();
log('<strong>Predicted Grade</strong>');
log('-------------------------------------------------------------------------');
if (s('final') === 0) {
log('If you skip the final, your points will result in a <strong>', grade, '</strong>');
logPointsNeeded(total, grade, total - final, recoveryCredits);
} else {
log('Your expected grade based on ', total, ' points is a <strong>', grade, '</strong>');
}
log();log();
log('<strong>Disclaimer</strong>')
log('-------------------------------------------------------------------------');
log('This calculator is only for your reference.');
log('The output here may have bugs, and does not guarantee a particular grade.');
log();
log();
log();
log('<strong>Click anywhere to close.</strong>');
}
calculateGrades();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment