powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тестирующая система
14 сообщений из 14, страница 1 из 1
Тестирующая система
    #36285314
Добрый день.

Пишу небольшую системку для проверки решений задач учеников. Т.е. ученики посылают в систему файл на паскале/C++/Jav'e, система компилирует и выдает ответ - правильно или нет решена задача (напоминает правила олимпиад по программированию ACM).

На данный момент стоят вопросы:
1. об определении есть ли в кодже ученика ассемблерная вставка.
2. как убивать выполняемое решение ученика по истечению определенного промежутка времени, т.е. если программа ученика написано не оптимально и долго работает, то завершать её автоматически и выдавать ответ что превышено время исполнения
3. Как ограничить программу по памяти, дав ей, к примеру, не более 64Мб.

На этом моменте я застрял, помогите пожалуйста...
...
Рейтинг: 0 / 0
Тестирующая система
    #36285336
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евпатий ЧередаНа данный момент стоят вопросы:
1. об определении есть ли в кодже ученика ассемблерная вставка.
а какая разница ? всё равно нет прав что-либо сломать.
Евпатий Череда2. как убивать выполняемое решение ученика по истечению определенного промежутка времени, т.е. если программа ученика написано не оптимально и долго работает, то завершать её автоматически и выдавать ответ что превышено время исполнения
3. Как ограничить программу по памяти, дав ей, к примеру, не более 64Мб.ulimit ? там можно задать количество процессорного времени и ограничения памяти.
...
Рейтинг: 0 / 0
Тестирующая система
    #36285474
Ёша какая разница ? всё равно нет прав что-либо сломать.


Дело в том что нужно выдать ошибку - Ошибка компиляции и "надрать уши" юному хакеру.


Ёш
ulimit ? там можно задать количество процессорного времени и ограничения памяти.

Для компиляции решений используются компиляторы языков C#, C++, Delphi - в связи с этим система будет работать под Windows.

Но проблема в том что нужно выполнить решение ученика, и если превысило ограничения на данную задачу выдать ошибку.
...
Рейтинг: 0 / 0
Тестирующая система
    #36285750
Фотография RT183.1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евпатий Череда,

вот тут http://www.contester.ru/ предлагают проверяющую систему
...
Рейтинг: 0 / 0
Тестирующая система
    #36286013
К сожалению данныя тестирующая не подходит.
Требуется немного другой функционал.
Я знаком с большинством нынешних тестирующий систем, к сожалению они далеки от идеала или же как МГУшная системы ejudje - очень сложна в настройках.

Поэтому и решено было написать свою.
...
Рейтинг: 0 / 0
Тестирующая система
    #36293684
По условию решение ученика читает данные из файла input.txt и пишет в файл output.txt
Для каждой задачи есть набор тестов. Т.е. скомпилированному решению ученика даются по очереди тесты от 1 до N.
Есть чекер - программа для проверки данных в выходном файле. Как запустить этот чекер для всех тестов ?

Напрашивается решение для компиляции решения ученика и копирования в папку с этим решением по очереди файлов input.txt, затем выполнение скомпилированного решения и проверка с помощью чекера.

Возможно ли обойтись без такого копирования ?
...
Рейтинг: 0 / 0
Тестирующая система
    #36293762
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для того, чтобы проверить нет ли на C++ ассемблерных вставок надо
1. обработать препроцессором исходники
2. произвести лексический разбор выхлопа препроцессора.

Я не помню C++ в деталях, но первое наверняка можно попросить сделать компилятор, а второе регулярным выражением или тулами типа Lex, JavaCC (или что там сейчас актуально)

Я не понимаю в чем сложность ограничения по времени: запустил задачу, получил pid и проверяешь периодически не вылезло ли оно за ограничения. Если вылезло, то киляешь.

Я думаю, даже на скриптах можно это сделать - какой-нибудь bash на юниксе и PowerShell на винде
...
Рейтинг: 0 / 0
Тестирующая система
    #36293845
Фотография RT183.1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
похоже как здесь: http://acmp.ru/article.asp?id_text=118
Напиши им, может поделятся
...
Рейтинг: 0 / 0
Тестирующая система
    #36294368
Фотография Pablo_new
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евпатий ЧередаДобрый день.

Пишу небольшую системку для проверки решений задач учеников. Т.е. ученики посылают в систему файл на паскале/C++/Jav'e, система компилирует и выдает ответ - правильно или нет решена задача (напоминает правила олимпиад по программированию ACM).

На данный момент стоят вопросы:
1. об определении есть ли в кодже ученика ассемблерная вставка.
Pablo_new
Парсить сам текст перед компиляцией, хотя бы через теже регулярки

2. как убивать выполняемое решение ученика по истечению определенного промежутка времени, т.е. если программа ученика написано не оптимально и долго работает, то завершать её автоматически и выдавать ответ что превышено время исполнения
Pablo_new
Анализ когда pid процесса когда запущен и долго ли крутиться, если долго то килить его.


3. Как ограничить программу по памяти, дав ей, к примеру, не более 64Мб.
Pablo_new
Сходу решения не вижу. но если затыка сурьезная то можно подумать.



На этом моменте я застрял, помогите пожалуйста...
...
Рейтинг: 0 / 0
Тестирующая система
    #36296160
ОК, а как тогда передать передать скомпилированному решению в виде Exe-шника данный поток ?

Вот к примеру есть какое то решение на паскале

автор
var
f1, f2: Text;
begin
Assign(f1, 'input.txt');
Assign(f2, 'output.txt');
Reset(f1);
Rewrite(f2);
...
Close(f1);
Close(f2);
end.



Допустим что будет следующая струтура папок:
./checker.exe - чекер
./solves/solve.exe - решение ученика
./tests/ - тесты:
./tests/1/input.txt
./tests/2/input.txt
...


Как мне породить из Чекера процесс solve.exe (решение ученика), чтобы это решение могло обратиться к файлам тестов ?

Получается что я должен перенаправить поток из файла.
Нужно использовать CreateProcess + TMemoryStream (для Delphi) , так ли это ?


Сейчас задался вопросом - как перенаправить чтение из файла в чтение потока.
т.е. перенаправить чтение данных файла в чтение данных с консоли.

Есть примеры перенаправления "Creating a Child Process with Redirected Input and Output" из МСДНа, но только там перенаправляется выходной с консоли в файл. А мне нужно перенаправить чтение из файла в чтение потока, и вывод не в файл а на консоль.

В силу того что ничего не смог сам сделать, прошу вашей помощи.
...
Рейтинг: 0 / 0
Тестирующая система
    #36296454
Фотография RT183.1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> А мне нужно перенаправить чтение из файла в чтение потока, и вывод не в файл а на консоль.

Так... а зачем тогда вообще требовать чтобы в решении ученика открывались какие-то файлы?
Зачем там assign, reset, rewrite, close?
...
Рейтинг: 0 / 0
Тестирующая система
    #36296540
Фотография RT183.1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение ученика zzz.exe читает числа из stdin и выводит в stdout их квадраты:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#include <iostream>
using namespace std;

int main() {
    int n;
    while (cin >> n) cout << n * n << endl;
    return  0 ;
}


Простейшая проверяющая система на Питоне:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
from os import popen2

z = popen2('E:/zzz.exe')

test_in = \
"""
1
2
3
4
5
"""

test_out = \
"""1
4
9
16
25
"""


z[ 0 ].write(test_in)
z[ 0 ].close()

ans = z[ 1 ].read()
z[ 1 ].close()

print ans

if ans == test_out:
    print 'Accepted'
else:
    print 'Wrong Answer'

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
>>> 
 1 
 4 
 9 
 16 
 25 

Accepted
>>>

и всё это в цикле по всем тестовым файлам, с замером времен и т.д.
...
Рейтинг: 0 / 0
Тестирующая система
    #36296867
Фотография RT183.1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если проверяемый экзешник зависнет надолго?
Значит, его ответ надо читать в другом потоке и если превышен тайм лимит
убивать его в главном. Я убиваю его утилитой PsKill.exe; из самого Питона ну никак нельзя.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
tested_file = 'E:/zzz.exe'
test_data_in = '1 2 3 4 5'
test_data_out = '1 4 9 16 25 '
time_limit =  1 
exe_ans = None

import os
from time import time, sleep

start_time = time()

exe_stdin, exe_stdout = os.popen2(tested_file)
exe_stdin.write(test_data_in)
exe_stdin.close()

def exe_stdout_read():
    global exe_ans
    exe_ans = exe_stdout.read()
    exe_stdout.close()

import thread
thread.start_new_thread(exe_stdout_read, ())

while not(exe_stdout.closed) and time() - start_time < time_limit *  1 . 1 :
    sleep( 0 . 005 )

delta_time = time() - start_time

if not(exe_stdout.closed):
    os.system('pskill ' + tested_file[ 1  + tested_file.rfind('/'):])

print 'Time:', delta_time

if delta_time > time_limit:
    print 'Time Limit Exceeded'
elif exe_ans == test_data_out:
    print 'Accepted'
else:
    print 'Wrong Answer'
...
Рейтинг: 0 / 0
Тестирующая система
    #36307967
RT183.1,
Большое спасибо за исходники, но к сожалению требуется именно работа с файлами, т.к. тестирующаю проверяет не только навыки олимпиадного программирования, но и умение работать учеников с файлам, т.е. самый начальный уровень. Вот поэтому и стоит задача перенаправления потомка.

Вообще изначально была идея реализовать как чтение данных из файла так и из потока, как, к примеру - интерактивные задачи на полуфинале ACM в этом и прошлом годах.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тестирующая система
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]