Last active
May 6, 2018 21:21
-
-
Save jathak/a2a92ba4a6305e3758c0a2dd5abe96b9 to your computer and use it in GitHub Desktop.
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
/* 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