使用 docker 作为 online judge(OJ) 的 sandbox (2)

This article is deprecated, please see here for more details. 在 使用 docker 作为 online judge(OJ) 的 sandbox (1) 中我们讨论了OJ在架构上的大概实现,现在我们继续讨论判题(以  leetcode-Longest Common Prefix 为例)。 我们首先将一个完整的题目拆分为以下几个模块: (1)测试集 (2)用户提交代码 (3)将测试集和用户提交的代码结合在一起,并运行出测试结果的预置代码(以下简称测试代码) 测试集 测试集由两部分构成:输入和输出。考虑以下两点: 一、我们不能简单地将输入和输出理解为两个字符串:输入有可能是复杂的数据结构,而针对某个题目是否回答正确的判定标准也不仅仅是输出一项(有可能包括检查输入数据),所以输入和输出需要一个可以存储复杂数据结构的传输格式构成; 二、某一道题需要针对不同的语言提供不同的测试代码,在不同的语言当中初始化数据的方式不尽相同。 由以上两点得出:合理的方式应该是JSON存储输入和输出,并保存在DB中。 用户提交代码 用户提交的代码没有太多的规范,安全性和对现有web系统的影响已经在(1)中讨论过了。 测试代码 这里是最有意思的部分:如何通过现有的测试数据来测试用户提交的代码是正确的? 在Javascript中,我们有一个现成的方法:.apply,我们可以将测试代码传给它来达到测试的目的: 同理,在其它脚本语言中,也都有类似的技巧: PHP – call_user_func_array Python – getattr Javascript’s Apply in Ruby 但是在Java / C / C++ 中,是没有类似的函数或者语法糖可以直接拿来使用的,好在 Java … Continue reading "使用 docker 作为 online judge(OJ) 的 sandbox (2)"

Read More