grading
Version:
Grading of student submissions, in particular programming tests.
49 lines • 1.52 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.compareNumberAware = void 0;
function isNumber(str) {
return str >= '0' && str <= '9';
}
/**
* Compare two strings which may contain numbers. The numbers are compared numerically, i.e. 01 an 1 is considered equal.
* If two strings are equal, the shorter one is considered smaller.
*/
function compareNumberAware(a, b) {
let ia = 0, ib = 0;
for (; ia < a.length && ib < b.length; ia++, ib++) {
const aChar = a.charAt(ia);
const bChar = b.charAt(ib);
if (aChar == bChar) {
continue;
}
if (isNumber(aChar) && isNumber(bChar)) {
let endA = ia + 1;
let endB = ib + 1;
while (endA < a.length && isNumber(a.charAt(endA))) {
endA++;
}
while (endB < b.length && isNumber(b.charAt(endB))) {
endB++;
}
let aNum = parseInt(a.substring(ia, endA));
let bNum = parseInt(b.substring(ib, endB));
if (aNum != bNum) {
return aNum - bNum;
}
ia = endA - 1;
ib = endB - 1;
}
else {
return aChar.localeCompare(bChar);
}
}
if (ia < a.length) {
return 1;
}
else if (ib < b.length) {
return -1;
}
return a.length - b.length;
}
exports.compareNumberAware = compareNumberAware;
//# sourceMappingURL=compareNumberAware.js.map
;