Поздравьте меня — на моём сайте CodeAbbey обнаружен первый крупный читер. Блин! Чел не поленился скопировать и слегка отрефакторить 125 задач (видимо, у коллеги) — чтобы попросить сертификат. Зачем — ума не приложу. Это же не сертификат оракла или микрософта. Но потратил в сумме недели три. Выглядит это так:
(А может мне только кажется что они похожи?)
Ну, кроме шуток я задумался — сейчас мне не очень-то трудно было обнаружить жульничество — т.к. пользователей-то не много, а уж решивших помногу — лишь несколько десятков. Но если такое повторится в более светлом будущем, хорошо бы иметь инструментарий для автоматического сравнения.
Пока обмозговываю — можно по коду считать какие-то метрики / хэши и записывать вместе с решением. Ну скажем, количество знаков препинания, символьных операторов. Потом для проверяемого пользователя найти еще одного с близкими показателями метрик. В общем что-то вроде Locality-Sensitive-Hashing получается. Однако прежде чем врукопашную и наобум экспериментировать — решил спросить — вдруг уже более-менее проторенные дорожки есть? Быть может кто-то уже сталкивался (а то и собаку съел) с похожими задачами — и подскажет направление?
Догадываюсь что администрация CF имеет свои способы наверняка — но как подсказывает мудрый коллега, наверняка они достаточно засекречены во избежание сами понимаете чего :o
Auto comment: topic has been translated by RodionGork(original revision, translated revision, compare)
Wow — autocomment is a cool feature but seems I could not remove it now...
This paper: Winnowing: Local Algorithms for Document Fingerprinting
might be useful for you.
For its application, see Moss — A system for software plagiarism
Thank you! Great hint! I suspected that some people already worked on similar problem — and here it is — and interesting article by the way... :)
Тебе нужен кто-то из этих ребят
результаты
Я думаю, вот это будет более полезно.
Another tool: https://github.com/jplag/jplag
Если нужно быстро что-то сделать, не затрачивая много усилий — могу порекомендовать SequenceMatcher из питоновской библиотеки difflib. Несколько десятков строк — и вы получаете то, что хотели. Я преподавал студентам программирование, и эта штука очень мощно помогает находить "примерно одинаковые" решения (в результате вся группа недоумевала, как я смог отловить за "овацио" всех читеров, попарно сравнив между собой несколько сотен решений). Там используется алгоритм, по которому работает *nix-овый diff. На выходе вы получаете метрику схожести — число от 0 до 1 (SequenceMatcher.ratio()). По моему опыту, значение > 0.5 — вероятно списывание, > 0.7 — списывание почти наверняка.