Bash Plagiarism Check
plagiarism_check() {
local -n _code1="$1"
local -n _code2="$2"
local _c1 _c2
_c1=$(IFS=' '; echo "${_code1[*]}")
_c2=$(IFS=' '; echo "${_code2[*]}")
if [[ "$_c1" == "$_c2" ]]; then
echo false
return
fi
local -a _d1 _d2
IFS=' ' read -ra _d1 <<< "$_c1"
IFS=' ' read -ra _d2 <<< "$_c2"
local -A _rcand
local -a _rcand_keys=()
local _k
for _k in "${!_d1[@]}"; do
local _v=${_d1[$_k]}
local _w=${_d2[$_k]}
if [[ "$_v" != "$_w" ]] && ! [[ "$_v" =~ ^-?[0-9]+$ ]]; then
if [[ -z "${_rcand[$_v]:-}" ]]; then
_rcand_keys+=("$_v")
fi
_rcand[$_v]=$_w
fi
done
local _orig _repl
for _orig in "${_rcand_keys[@]}"; do
_repl=${_rcand[$_orig]}
_c1=$(echo "$_c1" | sed -E "s/(^|[^A-Za-z0-9_])${_orig}([^A-Za-z0-9_]|$)/\1PLACEHOLDER${_orig}\2/g")
_c1=$(echo "$_c1" | sed -E "s/(^|[^A-Za-z0-9_])${_orig}([A-Za-z0-9_]|$)/\1PLACEHOLDER${_orig}\2/g")
done
for _orig in "${_rcand_keys[@]}"; do
_repl=${_rcand[$_orig]}
_c1=$(echo "$_c1" | sed -E "s/(^|[^A-Za-z0-9_])PLACEHOLDER${_orig}([^A-Za-z0-9_]|$)/\1${_repl}\2/g")
_c1=$(echo "$_c1" | sed -E "s/(^|[^A-Za-z0-9_])PLACEHOLDER${_orig}([A-Za-z0-9_]|$)/\1${_repl}\2/g")
done
if [[ "$_c1" == "$_c2" ]]; then echo true; else echo false; fi
}
This flattens both snippets, tries consistent identifier replacements, and checks whether the rewritten code matches.