UNPKG

grading

Version:

Grading of student submissions, in particular programming tests.

44 lines (42 loc) 1.34 kB
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; }