Блог пользователя RodionGork

Автор RodionGork, история, 9 лет назад, По-русски

Поздравьте меня — на моём сайте CodeAbbey обнаружен первый крупный читер. Блин! Чел не поленился скопировать и слегка отрефакторить 125 задач (видимо, у коллеги) — чтобы попросить сертификат. Зачем — ума не приложу. Это же не сертификат оракла или микрософта. Но потратил в сумме недели три. Выглядит это так:

оригинальный код

код последователя

(А может мне только кажется что они похожи?)

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

Пока обмозговываю — можно по коду считать какие-то метрики / хэши и записывать вместе с решением. Ну скажем, количество знаков препинания, символьных операторов. Потом для проверяемого пользователя найти еще одного с близкими показателями метрик. В общем что-то вроде Locality-Sensitive-Hashing получается. Однако прежде чем врукопашную и наобум экспериментировать — решил спросить — вдруг уже более-менее проторенные дорожки есть? Быть может кто-то уже сталкивался (а то и собаку съел) с похожими задачами — и подскажет направление?

Догадываюсь что администрация CF имеет свои способы наверняка — но как подсказывает мудрый коллега, наверняка они достаточно засекречены во избежание сами понимаете чего :o

  • Проголосовать: нравится
  • +14
  • Проголосовать: не нравится

»
9 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

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...

»
9 лет назад, # |
  Проголосовать: нравится +16 Проголосовать: не нравится
  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится

    Thank you! Great hint! I suspected that some people already worked on similar problem — and here it is — and interesting article by the way... :)

»
9 лет назад, # |
  Проголосовать: нравится +48 Проголосовать: не нравится

Тебе нужен кто-то из этих ребят

результаты

»
9 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
»
9 лет назад, # |
  Проголосовать: нравится +16 Проголосовать: не нравится

Если нужно быстро что-то сделать, не затрачивая много усилий — могу порекомендовать SequenceMatcher из питоновской библиотеки difflib. Несколько десятков строк — и вы получаете то, что хотели. Я преподавал студентам программирование, и эта штука очень мощно помогает находить "примерно одинаковые" решения (в результате вся группа недоумевала, как я смог отловить за "овацио" всех читеров, попарно сравнив между собой несколько сотен решений). Там используется алгоритм, по которому работает *nix-овый diff. На выходе вы получаете метрику схожести — число от 0 до 1 (SequenceMatcher.ratio()). По моему опыту, значение > 0.5 — вероятно списывание, > 0.7 — списывание почти наверняка.