我需要一种自动化的方法来获得C编程考试作弊者。我要做的第一件事是比较两个文件,并认为我可以将文件与另一行的所有行进行比较,如果等于另一个,则计数器会收到 1。
。要做的一件聪明的事情是忽略所有空间和{}
,但我不知道一种明智的方法,我看到.replace()
使性能真的很糟糕,还有其他解决方案吗?基本上我到目前为止所做的事情,但没有根据我想要的工作:
def line_compare(filename1, filename2):
counter = 0
result = {}
with open(filename1) as codefile1:
with open(filename2) as codefile2:
lines1 = codefile1.readlines()
lines2 = codefile2.readlines()
for line1 in lines1:
for line2 in lines2:
if line1 == line2:
counter += 1
key = filename1 + " " + filename2
result[key] = counter / len(lines1)
return result
dict的想法是将两个文件的名称作为键,而值是可能会复制的代码的百分比。它给了我很多错误的阳性,这是在python中做到的最好的方法吗?
关于白空间和{},第一步可能涉及使用诸如Astyle等代码美化器(例如Astyle)重新格式化源文件。这将使这两个程序都具有完全相同的格式。ASTYLE还可以执行小任务,例如删除注释。
试图通过检查单个行而试图查找复制和贴上的代码,这不是要走的,有两个原因:(1)如您指出的那样,许多误报 - 每个空白行,每条if x:
行等等都将显示为匹配,而这些都不是问题的证据。然后(2)一种非常简单的窃代码的方法是为每条行添加一个小但无关紧要的更改,例如通过将xxx
添加到末尾,更改每个变量名称,甚至只是在每条线上添加额外的评论或空间!<<<</p>
您想远离代码线,而要关注代码的整体结构 - 在抽象语法树中寻找相似之处可能是一种更有生产力的方法。