用户在我的网站上提交代码(主要是 java)来解决简单的编程挑战,但将代码发送到服务器进行编译和执行有时可能需要 10 多秒。
为了加快这个过程,我计划首先检查提交数据库,看看之前是否提交过等效代码。我意识到这会导致 Random 方法总是返回相同的结果,但这并不重要。不运行代码可能会导致其他任何潜在问题吗?
为了找到匹配项,我在比较代码时删除了注释和空格。但是,相同的代码仍然可以用不同的方式编写,例如使用不同的变量名称。有没有办法比较可以找到更多等效代码的代码?
最佳答案
变量名:
您可以编写代码将一个文件中的变量名与另一个文件中的变量名匹配,然后您可以用一致的变量名替换这两个集合。
文件 1:
var1 += this(var1 - 1);
文件2:
sum += this(sum - 1);
阅读文件 1 后,查找文件 2 使用的变量名称代替 sum,然后使两个文件中的变量名称相同。
*注意,如果变量以类似的方式使用,您可能会得到不正确的替换。这最有可能发生在声明变量时。为了帮助缓解这种情况,您可以开始在文件底部搜索变量名称并进行处理。
短手:
强制 {} 和 () 大括号进入每个 if/else/for/while/etc...
将诸如“i+=...”之类的操作重写为“i=i+...”
职能:
在函数顺序无关紧要的情况下,您可以确保函数是等效的,然后忽略它们。
运算符优先级:
“3 + (2 * 4)”通常等价于“2 * 4 + 3”
解决此问题的一种方法是确定每个操作的优先级,然后将其与另一组代码中具有相同优先级的操作进行匹配。一旦匹配了一组操作,您就可以将它们替换为一个变量来表示它们。
前任。
(2+4) * 3 + (2+6) * 5 == someotherequation
//substitute most precedent: (2+4) and (2+6) for a and b
... a * 3 + b * 5
//substitute most precedent: (a*3) and (b*5) for c and d
... c + d
//substitute most precedent....
这些只是我能想到的几种方法。如果你这样做,它最终会成为一个相当大的项目……尤其是当你使用多种语言时。