Как стать автором
Обновить

Комментарии 15

А как в олимпиадных задачах вообще возможен какой-то плагиат? Можно пример в двух словах хотя бы? Хочется понять, что там вообще можно списывать, по идее алгоритмы же на стэковерфлоу не валяются.

Речь идёт о списывании решений этих же задач у других участников, с небольшими изменениями чтобы "не совсем".

Стало еще интереснее. А другие участники незаинтересованы в победе и спокойно дают скопировать свои решения? Или есть прям настолько коварные люди, что могут, глядя через плечо, перепечатать портянку кода?

На победу или хотя бы top-100 99% участников (цифра с потолка) в онлайн-соревнованиях не рассчитывают. А заиметь какой-то определённый рейтинг может быть нужно по каким-то причинам. Поэтому читерство цветёт и процветает, вот чудесный пост на Codeforces про то как автор контеста пошёл ловить читеров в их чаты: https://codeforces.com/blog/entry/95415

А вот про списывание на школьном этапе всероссийской олимпиады: https://codeforces.com/blog/entry/96490 . Общего рейтинга нет, но плюшки за проход на региональный этап могут выдавать в зависимости от школы, начиная от "можно не делать домашку".

У нас в универе всем, кто хорошо решал олимпиадные задачи ставили автомат по программированию. И были такие люди, которые списывали задачи, чтобы заиметь автомат.

Довольно много участвовал в олимпиадах в 00-х, в школьных и вузовских, личных и командных, правда только своего региона. И пока не понимаю решаемой проблемы. Возможно, что-то изменилось за это время, или это мы такие честные были и поэтому про читерские способы не знали. Но даже технически, если регламенты только не изменились, не понятно, как на олимпиаде возможен плагиат, если только не говорим о каких-то заочных форматах. Да даже если и говорим. Потому что на нормальной олимпиаде/контесте задачи пишутся под конкретное мероприятие. Базовые алгоритмы всем известны, но суть задачи не в том, чтобы написать стандартный алгоритм (не считая "утешительных" задач). Соответственно, списать можно разве что у соседа. А этот способ читерства решается организационно - расстановкой рабочих мест, наблюдением со стороны оргкомитета.

Если же говорить о стандартных алгоритмах, которые входят в решение, то здесь ситуация другая. Это спорт, и как в спорте заучиваются до автоматизма базовые движения, так и в олимпиадах по программированию Дейкстра и подобные алгоритмы пишутся наизусть, заученным шаблоном. И тут не то что граф зависимостей, а сам код символ в символ может совпадать у тех, кто готовился вместе или по одному учебнику. А ещё код скорее всего будет максимально похож у "сильных" участников на простых и средних по сложности задачах, где участники почти сразу видят оптимальный алгоритм и его и пишут без лишних действий в коде. Здесь говорю не по наслышке, был опыт ещё и проведения собственных контестов и проверки решений на некоторых олимпиадах, нередко код разных участников, которые точно писали сами, очень и очень похож, в том числе на нигде не опубликованное авторское решение.

Так что да, хотелось бы подробнее рассмотреть, какие ситуации рассматриваются в качестве исходной решаемой проблемы.

Добрый вечер, спасибо за проявленный интерес.

Сейчас существует множество случаев, где возвожен плагиат в олимпиадных задачах. Конечно, говорить про заключительные этапы олимпиад скорее не стоит, но, например, отборы, которые часто проходят онлайн, без какого-либо контроля часто пишутся школьниками не совсем честным путем. Похожая ситуация с любыми соревнованиями на онлайн платформах по типу codeforces.

Наиболее понятным случаем для меня является использование олимпиадных задач для проверки знаний студентов, либо как задания для отбора в различные школы. Там как раз часто используются популярные задачи, решения которых при должном умении очень просто можно найти на просторах интеренета.

У них домашние задания по программированию, по алгоритмам надо сдавать. Там задачи очень похожие на олимпиадные…

Это, видимо, не совсем про олимпиады, а скарее про практические курсы. В последнее время стало модно проводить практику в университетах на фактически олимпиадных системах. Только задачи тривиальные, да ограничений по времени нет.


Это сильно экономит время преподавателей, но гораздо более уязвимо к списыванию.

Проверялся ли метод на ложные срабатывания? Потому как:

  1. Если говорить именно об олимпиадах, списать там от "очень трудно" до "вообще невозможно".

  2. Использовать куски кодов третьих лиц в принципе возможно. Но их ещё надо найти. И потом, достаточно помнить чужой алгоритм (а это не возбраняется), и написать по нему свой код, похожий на чужой.

  3. Главное. Мы все учимся в одних и тех же школах, читаем одни и те же книги и статьи. Поэтому наше мышление достаточно шаблонно. Особенно в решении известных задач. А любую новую задачу в первую очередь сводишь к тривиальным частям. И эти тривиальные части одинаковы у разных людей. Как раз и различаются циклами for и while.

Это как автомобиль - мотор впереди, багажник сзади, руль на первом ряду сидений. Это я сам придумал, или у меня плагиат?

То есть, не получится ли так, что тех, кто сделал самостоятельно и правильно, но мыслил сходным образом, объявят в плагиате. А того, кто сделал через одно место индийским кодом объявят победителем?

Не автор, но частично отвечу: списывания на онлайн-соревнованиях много. А это в том числе и обычные олимпиады из-за COVID-19, например, школьный этап всероссийской олимпиады. Там совершенно чудесные истории про списывание, когда копировали код с номерами строк и это работало: https://codeforces.com/blog/entry/96490

И эти тривиальные части одинаковы у разных людей.

Похожи - да. Но не одинаковы и почти всегда что-нибудь сделать либо "через одно место", либо у кого-то свой хитрый трюк. По моему опыту решения и просмотра глазами решений в задаче на >= 50 строк кода два участника просто не могут получить одинаковое решение (даже с точностью до небольших преобразований). Да даже в задаче на пять строк и две формулы это маловероятно (хоть и случается): кто-то напишет всё в одну строчку, кто-то вынесет все промежуточные вычисления в отдельные переменные, кто-то только часть, а ещё про оператор % вспомнит только половина, а вторая половина напишет `a - a / b * b`.

А тупого списывания на уровне "немного переименовали переменные, поменяли for на while" очень много: его просто сделать и ничего не сломать. Даже что-нибудь в функцию переносить - уже появляется риск сломать.

Это как автомобиль - мотор впереди, багажник сзади, руль на первом ряду сидений. Это я сам придумал, или у меня плагиат?

Но смотрим-то мы при поиске списывания не на "общую идею решения"/"алгоритм", а именно на конкретный код. Провода от задних фар у вас идут сбоку, сверху или обматываются вокруг мотора два раза по часовой и два раза против часовой, "чтобы помехи компенсировать"? Аккумулятор слева от руля в салоне или в багажнике? Обивка на сиденьях одинаковая?

Добрый вечер, спасибо за проявленный интерес.

Да, какого-то отдельного тестирования на это не было, но при общем тестировании были ситуации, когда можно было говорить о ложном срабатывании. Например, в статье говорилось, что нашелся блок решений простой задачи, которые алгоритм назвал одинаковыми, хотя исходно решения считаются разными. Проблема была как раз в примитивности самих решений.

Сейчас алгоритм никак не пытается бороться с такими случаями, но потенциально это возможно. Как минимум, наиболее простым способом бороться с этим может быть тонкая настройка алгоритма, а именно подбор константы, отвечающей за размеры рассматриваемых подграфов, чем больше она будет, тем более сложные куски кода будут сравниваться, тем самым отсекая случаи срабатывания на каких-то примитивных решениях. Но я этим не занималась, контстанта была выбрана с опорой на статью GPLAG как наиболее оптимальная, но в целом она, конечно, должна меняться в зависимости от сложности задачи (ожидаемого решения).

Соглашусь с другими комментаторами, что наверняка у подобного рода методов будет много false positive и false negative. Например:

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

  • Если задача - это какая-нибудь хитрая комбинаторика, в которой надо долго корпеть над бумажкой и получить какую-нибудь простую формулу, реализация которой будет занимать лишь несколько строк кода.

  • Наконец, мне кажется, если люди активно занимаются командным олимпиадным программированием в фиксированной команде, то у их стили программирования начинают сближаться - иногда до смешения.

Мне кажется, более перспективным направлением был бы сравнительный анализ по нескольким решениям, т. е. реализация критерия "участник X реализовал все задачи в одном стиле A, а одну задачу реализовал в совершенно непохожем стиле B". И то, здесь надо быть осторожным, потому что, может быть, этот "непохожий стиль" - какой-нибудь развесистый стандартный алгоритм, выученный или скопированный из общедоступного источника.

Мой опыт работы с такими системами и обсуждение с коллегами приводит к мысли, что все подходы на основе tree matching -- это несколько "из пушек по воробьям": то есть да, теоретически всё верно и интересно (насчёт "перспективности" -- я про такое читал ещё в статье 2004 года), но на практике и более простые методы работают достаточно хорошо.

В частности, JPlag и аналоги пытаются найти некое общее пересечение подстрок, покрывающее пару входных текстов (разновидность алгоритма RKR-GST). Чем обширнее покрытие, тем выше уровень плагиата. При этом используется токенизация с целью отловить переименование переменных, замена for-циклов на while и т.п.

Сам я неспешно в редкие часы досуга делаю GUI оболочку для JPlag с целью выводить и анализировать результаты в более удобном виде. На мой субъективный взгляд, алгоритмов сравнения уже достаточно интересных, а вот UI хромает чудовищно. Если у вас перед глазами сотни работ, да ещё и имеются усложнения (типа разрешённых кусков кода, выданных организатором), на первый план выходит уже процесс ручного анализа результатов. А качество уходит немного на второй план: в конце концов, всё равно нельзя раздавать оценки тупо на основе скоринга системы, нужна дополнительная проверка.

Кажется, что многие из этих изменений будут ловиться даже простым токенизатором, который выкидывает комментарии. И для случая, когда списывают 1-в-1 или просто переименовывают переменные, это достаточно. Вставка случайных элементов, возможно, решается добавлением "забывчивости" в токенизатор. (Говнокод на эту тему можно посмотреть тут, будет время, может прогоню на датасете). Но хотелось бы видеть сравнение с JPLAG и аналогами, чтобы было понятно, насколько предложенное решение лучше.

Насчет применения: одним из возможных приложений может быть проверка студенческих лаб/заданий.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий