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.