Как стать автором
Обновить
13
0
Александр Зоркин @somnoynadno

Инженер

Отправить сообщение

А, понял вопрос. Могу ответить только то, что тут вся ответственность за это ложится на ANTLR. Он не занимается интерпретацией кода, а список лексем выдает в соответствии с описанием грамматики языка программирования в специализированном формате (можете ознакомиться, вот пример для плюсов).

Если он не может понять определенный токен (например, добавленый в новой мажорной версии языка программирования), то он просто добавляет неизвестный идентификатор и продолжает свою работу, а не падает с ошибкой.

Если программа сегфолтнет на этапе исполнения, то она не пройдёт тесты в системе контестов, а следовательно даже и не дойдет до модуля антиплагиата.

Ой, а я забыл упомнянуть тот момент, что мы запускаем скоринг только для решений на одном языке программирования (например, только на шарпах).

Дело в том, что если студент переписал чужое решение на другой язык программирования (например, с шарпа на плюсы), то это уже не должно считаться плагиатом как таковым, ведь он как-то понял структуру и логику работы программы, чтобы перенести её в совершенно другое окружение.

Вы действительно правы, что антиплагиат должен проверять и решения других групп, ранее усвоивших данный предмет. У нас он тоже это делает, ведь база данных одна для всего института. Были даже интересные случаи сливов эталонных (преподавательских) решений, но это просто прецеденты на фоне списываний внутри одной группы :)

Замечания очень верные и, вероятно, проблем с производительностью бы не было, если бы обращения шли не из рантайма языка Go :)

Для каждой программы, помимо её исходного кода, на вход антиплагиата поступает её уникальный ID. И первым делом проверяется, не поступала ли эта программа ранее. Здесь же гораздо проще и быстрее обратиться к in-memory хранилке за этим вопросом, чем заново прогонять код через ANTLR.

Если говорить конкретнее, то в кэш попадает весь выход ANTLR. Например, AST туда прилетает в формате (compilation_unit (using_directives (using_directive using (namespace_or_type_name (identifier System)), а затем (при необходимости) повторно парсится и загружается в память сотней строк на Go и становится снова готовым для скоринга. К сожалению, не могу предоставить исходники, потому что это немного коммерческий продукт.

Кстати, мы действительно задумывались о проблеме взлома системы антиплагиата, как только об этом прознают студенты. Штош, нам самим будет интересно посмотреть). Мы даже готовимся к некоторой гонке вооружений, когда нашу систему будут пытаться обойти, а мы будем придумывать новые эвристики для поиска таких хитрицов.

Для порождающей матрицей в систематическом виде будет достаточно транспонировать её чётную часть и «дописать» справа единичную матрицу, чтобы выполнилось тождество GH^T = 0. В общем виде это действительно работать не будет.

Для каждой матрицы перестановок всегда существует обратная (и да она тоже будет задавать перестановку). Существует модификация алгоритма, в которой вместо матрицы перестановки берётся случайная матрица, имеющая вес строки, допустим, w. Тогда количество ошибок, которое сможет исправить код, уже будет рассчитываться как t / w. И здесь уже существенным условием является невырожденность такой матрицы.
1) Верное замечание, уже исправил, спасибо.
2) Матрица P представляет собой матрицу перестановки. Результатом умножения вектора на неё будет являться вектор, отличный от исходного только перестановкой элементов. Умножение на обратную матрицу даст лишь обратную перестановку (т.е. исходную), но никак не увеличит количество ошибок в коде.

Информация

В рейтинге
Не участвует
Откуда
Томск, Томская обл., Россия
Дата рождения
Зарегистрирован
Активность