grading
Version:
Grading of student submissions, in particular programming tests.
44 lines (42 loc) • 1.34 kB
text/typescript
function isNumber(str: string): boolean {
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.
*/
export function compareNumberAware(a: string, b: string): number {
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;
}