Решения задачи с Ulearn

Практика «Антиплагиат»

ИТ-компания К. приглашает студентов на летнюю стажировку. Чтобы попасть на стажировку, претенденты решают тестовое задание — задачу на программирование вроде тех, что есть в этом курсе, только сложнее.

Из года в год претенденты присылают несколько сотен решений. Можно ли как-то автоматически найти среди них «списанные» решения, то есть такие, которые слишком сильно похожи друг на друга?

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

Скачайте проект Antiplagiarism.

В этой задаче вам необходимо реализовать класс LevenshteinCalculator, который получает на вход список документов и возвращает список попарных сравнений каждого документа с каждым другим.

Мы хотим, чтобы разница в пробелах, пустых строках или небольшом переименовании переменных не сбивала наш алгоритм. Поэтому вам нужно реализовать модифицированный алгоритм Левенштейна:

  1. Он должен анализировать не последовательности символов, а последовательности токенов — лексических единиц. Например, в коде force = mass * acceleration 5 токенов: force, =, mass, *, acceleration. Код разбиения на токены уже реализован и на вход вашему алгоритму поступает список токенов. Один документ представляется типом DocumentTokens (который объявлен, как синоним List<string>).
  2. Если два токена различаются, то будем учитывать ещё степень различия. Стоимость замены одного токена на другой в алгоритме Левенштейна будем вычислять с помощью формулы коэффициента Жаккара. Она тоже реализована за вас в методе GetTokenDistance класса TokenDistanceCalculator. Стоимость удаления/добавления токена равна единице, как и в оригинальном алгоритме.

Корректность работы проверяйте с помощью имеющихся в проекте модульных тестов.

Стоимость решения этой задачи всего 100 рублей, купи решения у меня 🙂



Обновлено: 05.05.2019 — 19:50

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

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