const ASSIGNMENT = 'assignment'; const ANSWER = 'answer'; const ALGORITHM_CHECKBOX = 'algorithm'; const ERROR_MESSAGE_INVALID_RANGE = "Invalid range, "; const COMMA_CHARACTER = ','; const NEWLINE_CHARACTER = '\n'; const RANGE_CHARACTER = '-'; /** * Main function */ window.onload = function() { document.getElementById(ASSIGNMENT).addEventListener("input", calculateAnswer); document.getElementById(ALGORITHM_CHECKBOX).addEventListener("click", calculateAnswer); } /** * Listener function for input in assignment field. * @param event the onInput event */ function calculateAnswer(event) { console.info("Calculating answer for input..."); let assignment = document.getElementById(ASSIGNMENT).value; let fullOverlap = document.getElementById(ALGORITHM_CHECKBOX).checked; let answer = algorithm(assignment, fullOverlap); document.getElementById(ANSWER).innerText = answer; } /** * Calculate the answer to assignment. * @param assignment the input from the assignment. * @param fullOverlap if input needs to fully overlap. * @return string the answer */ function algorithm(assignment, fullOverlap) { let lines = assignment.trim().split(NEWLINE_CHARACTER); console.info("Linecount:" + lines.length); let containedPairs = 0; for(let i=0; i range1Higher) { console.error(ERROR_MESSAGE_INVALID_RANGE + range1Lower + "-" + range1Higher + " on line:" + i + " for range1"); error = true; } if(range2Lower > range2Higher) { console.error(ERROR_MESSAGE_INVALID_RANGE + range2Lower + "-" + range2Higher + " on line:" + i + " for range2"); error = true; } if(error) { continue; } // Check for overlap if(fullOverlap && doesRangeFullyOverlap(range1Lower, range1Higher, range2Lower, range2Higher) || !fullOverlap && doesRangeOverlap(range1Lower, range1Higher, range2Lower, range2Higher)) { console.debug("Found overlapping range:" + range1Lower + "-" + range1Higher + "," + range2Lower + "-" + range2Higher); containedPairs++; } } return "Fully overlapping timeslot counts: " + containedPairs; } function doesRangeFullyOverlap(lower, higher, lower2, higher2) { console.debug("Compare range: " + lower + "-" + higher + " with " + lower2 + "-" + higher2); if(lower > higher || lower2 > higher2) { return false; } return ((lower <= lower2 && higher >= higher2) || (lower2 <= lower && higher2 >= higher)); } function doesRangeOverlap(lower, higher, lower2, higher2) { console.debug("Compare range: " + lower + "-" + higher + " with " + lower2 + "-" + higher2); if(lower > higher || lower2 > higher2) { return false; } return higher2 >= lower && lower2 <= higher; }