sim工具是在搭建hustoj的过程中发现的一个小玩意。毕竟作为一个OJ,hust的人肯定也考虑到了网络比赛中代码复制粘贴的现象。所以一个代码判重的工具肯定是必不可少的。然而这个工具在网站的前后台中并没有体现,而是作为一个附带的工具一起打包下来的。而且事实上他打包的版本有点老了,所以我去了作者的博客上找了最新的版本--Dick grune。
额,是的没错,他就叫 Dick~~,大概看了下博客,真是个挺厉害的人,写了不少的书,都是关于编译方面的东西,好像还搞了LaTeX的解释器啥的。。。我现在要用的是他的一个小工具,在这里下载。
下下来解包之后还要细心的查看并编辑下Makefile的配置,然后进行编译,主要是这几步:
- 选择操作系统,Makefile里有两套配置,一套是“For UNIX-like systems”,另一套是“For MSDOS + MinGW”,根据当前系统把另一套注释掉就行了。
- 修改
BINDIR
的值,推荐设置为/usr/bin/
,一般来说,放到$PATH下比较方便。 - 修改
MAN1DIR
的值,推荐设置为/usr/share/man/man1
,这个目录是系统man文档的默认目录。 - 将
sim.1
文件放到刚才设置的MAN1DIR
里,放进去之后,man sim
命令就应该可用了。 - 安装依赖,一般来说,安装了
gcc
,make
,flex
这几个东西就够了。 - 执行
make install
。
搞定之后就会发现生成了一堆可执行文件:
1 | sim_8086 |
这样,编译工作就搞定了。不过,如果是用的windows,其实直接就有编译好的可执行文件了,不需要自己编译安装。。。
用法
- 选择语言: sim 支持多种语言:C, Java, Pascal, Modula-2, Lisp , Miranda, or text files,对应的命令分别是: sim_c ,sim_java,sim_pasc ,sim_m2,sim_lisp ,sim_mira,sim_text 。
- 选择参数: 常用的参数有三个:
参数 | 含义 |
---|---|
-p | 表示以“F consists for x % of G material”的形式输出相似度 |
-t N | 表示只显示相似度大于N%的条目(除text 默认为20%外,其余默认为1%); |
-o file | 表示将结果输出到file中 |
最后可以输入文件名,支持通配符。
示意
如下两个文件:
1 | //a.cpp |
1 | //b.cpp |
这两个是用来计算日期只差的cpp文件(学生提交的作业,对不对另说),看上去还是有点差别的,至少很多变量名都经过了替换,修改了注释,而且也改了缩进的风格,但是经过sim程序判别之后,可以发现他们的相似度还是极高的:
1 | myths@Business:~/桌面$ sim_c -p a.cpp b.cpp |
相似度仍然达到了90%左右,所以我们可以确定的认为这两份作业是抄袭的。可以证明这个程序的识别率还是非常高的~