Предполагается, что это будет система оценок для соревнования по программированию или для упражнений в университетском курсе? Для этого могут существовать системы с открытым исходным кодом, поэтому сначала зайдите в Google, если вы этого еще не сделали. Если вы хотите / хотите сделать это самостоятельно, я не уверен, что Java позволяет вам ограничивать время, затрачиваемое программой (но вы, конечно, можете просто убить программу после ожидания определенного количества времени), но предел памяти Java-программы может быть указан, например, с -Xmx32m
при запуске программы командой java
. Если это в системе Unix, простейшим решением, вероятно, будет использование ulimit
для ограничения использования памяти и времени выполнения.
В любом случае, я думаю, вам придется использовать Runtime.exec () для запуска как компилятора, так и программы. Это также позволит вам вводить входные данные в процесс и считывать выходные данные процесса (хотя перенаправление ввода-вывода также может выполняться в / из файлов, если вы запускаете программу, например, с
Runtime.getRuntime().exec("java -Xmx32m Program.class < input.txt > output.txt");
Что касается сравнения: если вам не требуется точное совпадение (даже в пробелах), простейшее решение, вероятно, состоит в том, чтобы перенаправить вывод в файл и вызвать diff
с -b
или -w
и, возможно, --ignore-blank-lines
; если код возврата равен 0, выходной результат равен решению (за исключением различий пробелов). С другой стороны, если вам нужна интерактивная оценка (программа должна «общаться» с оценщиком) или если выходные данные могут быть сформированы по-разному, так что нет единственно правильного ответа, вы не можете использовать diff
; Вместо этого грейдер должен прочитать поток вывода процесса.