基于SIM的python程序相似度判别

从开始着手SIM的研究已经将近一个月了,总算功夫不负有心人,好歹在SIM上增加了对python程序的支持。现在回过头来想想,真正需要自己动手去编写的代码还是非常有限的,大多时间都是对HUSTOJ代码不熟悉而消耗了。

在HUSTOJ下,通过judge_client调用SIM以实现判题过程的相似度判别,所有判别的数据库均来源于服务器端每次存储的已AC代码,例如题号1000的AC代码存放在data/1000/ac文件夹下。SIM所判别的结果也可以通过修改judge_client.cc及judged.cc中的debug为1,并重新编译这两个文件,将产生的.exe文件复制到/usr/bin文件夹下,重启judged进程即可。SIM输出的结果保存在/home/judge/run0中的sim文件中。当然,也可以通过修改/fps/core/sim下sim.sh文件代码,将判别结果以不同形式输出至制定位置。

python语言的词法分析,其实还是蛮简单的,只需要重写pythonlang.l文件就可以了。因为在SIM计算形似度规则中保留字要比普通标识符的贡献大,所以第一步就是要修改识别保留字。第二步就是识别注释、空格、换行、制表位等无用信息。python的注释分两种:基于单行的注释通过SingleLineCom("#".*)识别即可;基于段的注释通过重写MultiLineCom
("‘‘‘"(.|\n)*)也可实现。最后将pythonlang.l文件放入相应的sim文件夹下,修改makefile文件,增加python的编译生成sim_py可执行程序,拷贝到/usr/bin下,验证之。在初期的调试下,可以通过命令行来验证,./sim_py -p 1.py 2.py |grep ^1.py|awk ‘{print $4}‘输出判别结果。需要注意的是,hustoj默认只支持5种语言的相似度判别,所以增加新的语言时需要将judge_client.cc程序中的2268行&&lang<5这句话删除。

运行判别的两个程序如下:

文件1:

###################

‘‘‘

ldf:a+b

‘‘‘

import sys

for line in sys.stdin:

b = line.split()

print int(b[0]) + int(b[1])

文件2:

import sys

for line in sys.stdin:

a = line.split()

print int(a[0]) + int(a[1])

结果显示文件1与文件2的相似度为100%。

时间: 2024-11-06 09:34:09

基于SIM的python程序相似度判别的相关文章

基于2-channel network的图片相似度判别

一.相关理论 本篇博文主要讲解2015年CVPR的一篇关于图像相似度计算的文章:<Learning to Compare Image Patches via Convolutional Neural Networks>,本篇文章对经典的算法Siamese Networks 做了改进.学习这篇paper的算法,需要熟悉Siamese Networks(经典老文献<Signature Verification Using a Siamese Time Delay Neural Network

介绍Python程序员常用的IDE和其它开发工具

概述 “工欲善其事,必先利其器”,如果说编程是程序员的手艺,那么IDE就是程序员的吃饭家伙了. IDE 的全称是Integration Development Environment(集成开发环境),一般以代码编辑器为核心,包括一系列周边组件和附属功能.一个优秀的IDE,最重要的就是在普通文本编辑之外, 提供针对特定语言的各种快捷编辑功能,让程序员尽可能快捷.舒适.清晰的浏览.输入.修改代码.对于一个现代的IDE来说,语法着色.错误提示.代码折 叠.代码完成.代码块定位.重构,与调试器.版本控制

基于本体概念的语义相似度计算

最近在做基于本体概念的语义相似度的计算理论研究及实现,现在做一个相关的总结,以便今后查找或者供他人借鉴和学习. 做这个研究的目的是为了进行Agent能力模型中目标和能力的匹配,从而进行目标对能力的一个择优过程.在我们的能力模型中,capability表示为C(InConstaints,OutContaints),目标goal表示为G(TriggerConditions, FinalStates).而InConstaints,OutContaints,TriggerConditions, Fina

Python程序的常见错误(收集篇)

关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Application Development)中颇为受欢迎,同时Python还能作为脚本语言或者胶水语言讲现成的组件或者服务结合起来.Python支持模块(modules)和包(packages),所以也鼓励程序的模块化以及代码重用. 关于本文 Python简单.易学的语法可能会误导一些Python程序员(特别是那些

CSDN日报20170319——《人工智能风口, Python 程序员的狂欢与企业主的哀嚎》

[程序人生]人工智能风口, Python 程序员的狂欢与企业主的哀嚎 作者:赖勇浩 人工智能风口有多火?估计很多人已经感受到了,我在这里引用一下新智元的报道: "2017年短短不到三个月的时间,国内AI获投项目已有36个,千万级别融资占据半数以上." 嗯,就是那么霸道.两会刚刚结束,"人工智能"首次被列入政府工作报告,随之而来的是人工智能板块领跑大盘涨势,无疑,这一切将刺激人工智能在多个领域的全面发展. [深度学习]NeuralFinder :集成人工生命和遗传算法

基于pycharm的python开发配置

虽然基于命令行+文本编辑可以完成python程序开发,并熟悉操作系统下的命令操作.但是基于集成开发环境的开发能够更有效率.因此选择一个适合的集成开发工具是重要的.最开始的时间也是从命令行+文本编辑来进行开发,这样可以熟悉基本的命令操作.之后本人尝试使用了eclipse+pyDev,pycharm.相对来说,pycharm更加简单. 1.               安装pycharm 点击.exe文件即可,resources_cn.jar为汉化包,拷贝到安装目录下的lib下即可. 2.     

编写高质量代码–改善python程序的建议(二)

原文发表在我的博客主页,转载请注明出处! 建议七:利用assert语句来发现问题断言(assert)在很多语言中都存在,它主要为调试程序服务,能够快速方便地检查程序的异常或者发现不恰当的输入等,可防止意想不到的情况出现.其语法如下: assert expression1 ["," expression2] 其中expression1的值会返回True或者False,当值为False的时候会引发AssertionError,而expression2是可选的,常用来传递具体的异常信息. 不

Python程序员的10个常见错误(转)

add by zhj:虽然学Python也有两年了,但这些问题的确容易犯,看来对Python的理解还有些地方不深入.先转了,有时间再好好看 译文:http://blog.jobbole.com/68256/ 本文由 伯乐在线 - datorhjaelten 翻译.未经许可,禁止转载!英文出处:toptal.欢迎加入翻译小组. 关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Ra

Python 程序员经常犯的 10 个错误

关于PythonPython是一种解释性.面向对象并具有动态语义的高级程序语言.它内建了高级的数据结构,结合了动态类型和动态绑定的优点,这使得... 关于Python Python是一种解释性.面向对象并具有动态语义的高级程序语言.它内建了高级的数据结构,结合了动态类型和动态绑定的优点,这使得它在快速应用开发中非常有吸引力,并且可作为脚本或胶水语言来连接现有的组件或服务.Python支持模块和包,从而鼓励了程序的模块化和代码重用. 关于这篇文章 Python简单易学的语法可能会使Python开发