TypeScript Plagiarism Check
function isNumeric(value: string): boolean {
return value !== "" && !Number.isNaN(Number(value));
}
function plagiarismCheck(code1: string[], code2: string[]): boolean {
let c1 = code1.join(" ");
let c2 = code2.join(" ");
if (c1 === c2) {
return false;
}
const d1 = c1.match(/[\w]+/g) ?? [];
const d2 = c2.match(/[\w]+/g) ?? [];
const rCand = new Map<string, string>();
for (let k = 0; k < d1.length; k++) {
const v = d1[k];
if (v !== d2[k] && !isNumeric(v)) {
rCand.set(v, d2[k]);
}
}
for (const [orig] of rCand) {
c1 = c1.replace(new RegExp(`(\\W)${orig}(\\W*)`, "g"), `$1PLACEHOLDER${orig}$2`);
c1 = c1.replace(new RegExp(`(\\W)${orig}`, "g"), `$1PLACEHOLDER${orig}`);
}
for (const [orig, repl] of rCand) {
c1 = c1.replace(new RegExp(`(\\W)PLACEHOLDER${orig}(\\W)`, "g"), `$1${repl}$2`);
c1 = c1.replace(new RegExp(`(\\W)PLACEHOLDER${orig}`, "g"), `$1${repl}`);
}
return c1 === c2;
}
This flattens both snippets, tries consistent identifier replacements, and checks whether the rewritten code matches.