Прием решений участников завершен. Спасибо за участие. В скором времени мы проведем финальное тестирование и подведен результаты.
Всем доброго дня.
Все что написано ниже не первоапрельская шутка, но тоже мероприятие веселое :) Мы рады анонсировать новое экспериментальное соревнование на Codeforces — "Парсер контест: разбор архива задачи".
Вы когда-либо составляли тренировки, используя архивы прошедших контестов? Вы выкачивали из интернета архивы контестов для тестирования своих решений локально? Если да, то вы не могли не заметить, что каждый организатор так и норовит придумать свой собственный формат распространения задач. Да это правда!
За свою жизнь я подготовил и провел огромное количество тренировок по прошедшим соревнованиям. Зачастую, это довольно однообразное занятие — часто к каждой задаче надо писать какие-то скрипты, которые переименовывают входные/выходные файлы задачи в стандартный вид. В архивах они называются совсем по-разному: может это river.in.1, river.out.1, river.in.2, river.out.2 и т.д. В другой задаче это может быть tests/1.dat, tests/1.ans, tests/2.dat, tests/2.ans и т.п.
В какой-то момент времени это мне надоело, и я написал скрипт, который на основе каких-то эвристик и подмеченных мной закономерностей угадывал шаблоны путей до файлов с тестами. Скрипт работал вполне неплохо, но неидеально.
Codeforces работает над функциональностью по улучшению проекта как тренировочной площадки. Мы планируем дать пользователям возможность готовить и проводить тренировки непосредственно на Codeforces. Вы сами подготовите тренировку или выберите публичную для участия. Подготовили сами? Отлично! Дайте общий доступ к ней и люди скажут вам спасибо.
Нами уже проделана большая работа, и некоторая часть функционала разработана. Впереди еще много дел, технически непростых моментов и просто рутины. Однако, я уверен, что сообщество молодых талантливых программистов может справляться с некоторыми задачами не хуже команды Codeforces. Например, это может быть задача автоматического распознавания содержимого архива задачи.
Итак, если коротко, вам задан набор файлов, имеющих отношение к этой задаче. Ваша программа на основании подмеченных закономерностей, эвристических решений или как-то иначе должна выделить файлы тестов (входные данные и ответы), решения и исходник чекера.
Самое главное: код победителя будет оформлен в отдельную маленькую библиотечку, которая будет распространять по свободной лицензии. Этот код будет использовать Codeforces для автоматизации рутинных процессов. Вы на самом деле поможете нам, ваше имя войдет в анналы истории Codeforces, а код, написанный вами код, будет регулярно использоваться на благо сообщества. Я еще не убедил вас принять участие?
Так как почти вся кодовая база Codeforces написана на Java, то и решения к этой задаче мы ожидаем на этом языке. Мы полагаем, что вам не понадобятся глубокие знания Java — наверное, будет достаточно базовых знаний о языке.
Мы даже решили назначить небольшой призовой фонд, который будет распределен между лучшими пятью участниками:
- 1 место — 8000 руб.
- 2 место — 4000 руб.
- 3-5 место — 2000 руб.
Условие задачи
Ваша задача написать java-программу, которая запускается в каталоге, содержащем файлы одной или нескольких задач.
Относительные пути всех файлов, имеющие отношение к рассматриваемой задаче, перечислены в файле files.lst, находящимся в корне. Разделителем в путях каталогов является символ '/' (UNIX-разделитель).
Пример (files.lst):
tester/check_a.pas tester/check_a.exe a/tests/02.in a/tests/01.ans a/tests/01.in a/tests/02.ans a/tests/gen.exe a/tests/t.bat a/tree_mm.exe a/tree_mm.cpp a/doall.bat a/problem.xml a/validator.cpp a/tree_dm_wrong.cpp
Программа имеет право читать и анализировать исключительно те файлы, которые перечислены в files.lst.
Задача программы — выделить набор тестов в данной задаче (официальный, если их несколько), исходные тексты решений (если найдены) и исходный текст проверяющей программы (если найден).
Результат работы программы должен быть выведен в стандартный поток вывода. Вывод должен содержать от одной до трех секций: секция тестов, секция решений и секция чекера (обязательной является только секция тестов).
Секция тестов должна начинаться строкой "tests:". Далее она должна содержать одну или более строку, состоящую из имени файла самого теста и имени файла ответа на этот тест, разделенных символов ':' (двоеточие). Тесты должны быть перечислены в порядке возрастания их номеров в оригинальной задаче. Выводить следует только официальные тесты (в случае, если было найдено несколько наборов тестов).
Пример (секция тестов):
tests: a/tests/01.in:a/tests/01.ans a/tests/02.in:a/tests/02.ans
Секция решений, если она присутствует в выводе, должна следовать второй по порядку. Секция начинается строкой "solutions:". Далее следуют строки, содержащие имена файлов исходных текстов решений. Порядок следования имен файлов — лексикографический. Под решениями понимаются как правильные, так и неправильные решения (которые зачастую так же присутствуют в архиве жюри).
Пример (секция решений):
solutions: a/tree_dm_wrong.cpp a/tree_mm.cpp
Секция чекера, если она присутствует в выводе, должна начинаться строкой "checker:" и содержать единственный элемент — имя файла с исходным текстом чекера.
Пример (секция чекера):
checker: tester/check_a.pas
Таким образом, полный вывод может иметь вид:
tests: a/tests/01.in:a/tests/01.ans a/tests/02.in:a/tests/02.ans solutions: a/tree_dm_wrong.cpp a/tree_mm.cpp checker: tester/check_a.pas
Все имена файлов в выводе должны быть именно в том виде, как они представлены в файле files.lst.
Ваше решение будет запускаться с ограничением на используемую память "-Xmx32M -Xss1M" (размер кучи 32M, размер стека 1M). Ограничение на время работы — 1 секунда.
Главный класс вашей программы должен иметь имя ProblemParser и находиться в пакете по умолчанию.
Как все будет проходить
Соревнование будет длиться две недели и завершится в полдень 15-го апреля. Система проведения соревнования нами пока окончательно не дописана и будет улучшена и расширена в ближайшие дни.
Вас ждут знакомые вкладки: отослать, мои посылки, статус и положение участников. Отсылать вы можете либо один файл (ProblemParser.java) или zip-авхив с исходными текстами вашего проекта.
Тестирование в эти две недели будет производиться на 30-ти тестах. Первые десять из них открытые — вы можете их скачать (архив обновлен). В архиве доступны ответы на эти тесты, они расположены в файлах answer.lst. Двадцать оставшихся тестов вам не известны. Участников мы сортируем по невозрастанию баллов, при равенстве — по уменьшении. времени достижения балла. Решения можете отсылать сколько угодно раз, если будет очередь, то установим ограничение на частоту посылок. Учитывается балл за последнее решение по задаче.
Решение может набрать один балл на каждом тесте. Частичная ошибка на тесте приводит к его непрохождению.
После окончания основной части соревнования, нами будет проведено дополнительное тестирование. Для каждого участника будет протестировано его последняя попытка на расширенном наборе тестов. Этот набор будет содержать 20 уже знакомых закрытых тестов и 20 новых. Так как задача и система проведения ну очень экспериментальная, то мы оставляем за собой право что-то менять по ходу контеста, хотя я надеюсь, что существенные изменения не понадобятся.
Все тесты, это настоящие задачи (возможно, слегка модифицированные). Задачи взяты из разнообразных источников — мы постарались максимально покрыть географию их происхождения.
Если этот опыт окажется успешным, то мы попробуем расширить эксперимент. У меня в голове есть еще несколько интересных задач, решения которых окажется полезным сообществу
Пусть победит сильнейший,
MikeMirzayanov
UPD: В архиве исправлены некоторые недочеты, рекомендуется скачать его заново.
I'm waiting for the English translation.
Что делать, если в каталоге файлы нескольких задач? Для какой выбирать тесты и чекер?
Что подразумевается под "официальными" тестами?
Ведь главная цель парсерконтеста не померяться рейтингом, а принести максимальную пользу ресурсу. Денежный приз в этом случае получает капитан команды (как он разделит между коллегами - их внутреннее дело), а слава достается всему коллективу лучшего решения в неограниченном количестве и даром, и пусть никто не уйдет обиженным!
Выдает ошибку тестирования.
Нельзя ли выводить какое-нибудь сообщение, как при ошибке компиляции?
Что такое пакет по умолчанию? Это никакого пакета или что-то нужно написать? Может с этим быть проблема?
Еще такая неисправность (?): у меня не получается отослать исходник (то есть один java-класс) - принимает только архив или копипасту.
Мы хотим получить удобный механизм для парсинга архивов контестов. Предполагается, что данный механизм после завершения контеста будет использоваться по прямому назначению. Т.е. основная цель - получить код, который будет качественно обрабатывать все известные форматы архивов.
Так не лучше ли открыто объявить все эти форматы и разработать расширяемую архитектуру парсера. С тем чтобы если в будущем появится новый формат, можно было ничего не переделывать, а просто дописать подключаемый плагин.
Зачем нужно, чтобы участники писали нечто, что кое-как обрабатывает что-то им неизвестное, и совершенно непонятно как будет обрабатывать то, что может появиться в будущем?
Я понимаю, что поучаствовать интересно, но результат будет иметь гораздо меньшую практическую ценность, чем мог бы иметь.
1. Плагин по архиву умеет определять его ли это случай. По совершенно формальным признакам.
2. Сам комплекс имеет набор плагинов. При парсинге архива, опрашивается каждый плагин. Если есть один подходящий - он парсит. Если несколько - просят юзера выбрать один из списка подходящих.
Можно было бы сделать и более расширенную версию. Где каждый плагин говоит не "да-нет", а выдает процент соответствия.
Также сделать два режима - автоматический и ручной парсинг. Автоматический парсит только со 100% вероятностью единственным образом. Ручной выдает отчет анализа соответствия, возможно предпросмотр результатов и спрашивает пользователя что выбрать.
В общем куча вариантов...
А как вы будете пользоваться эвристическим парсером? Вот я скачал новый архив с сайта какого-нибудь. Распарсил вашим кодом и что? Как я пойму правильно он распарсил или не правильно? Все или не все? Это я должен буду глазами каждый раз просматривать весь архив и сверять с тем что выдал парсер?
...каждый плагин говоит не "да-нет", а выдает процент соответствия.Также сделать два режима - автоматический и ручной парсинг...
Ну вот вы и описали простенькую систему поддержки принятия решения (DSS), с простенькой реализацией AI, основанном на вероятностном анализе.
"Тестирование в эти две недели будет производиться на 30-ти тестах. Первые десять из них открытые — вы можете их скачать" ->
Not Found
The requested URL /codeforces/files/parsercontest-examples-1-10.zip was not found on this server.
Это так надо или временный баг?
тогда что-то вроде:
files/checker_best.cpp
files/checker_new.cpp
files/checker_new.java
files/checker_the_best_very_new.pas
Должно вгонять в ступор %)
> Здесь в качестве чекера используется tester.dpr.
Э... а как вы это узнали???
Получается вы обладаете дополнительной информацией - может стоит предоставить её и контестантам? Так это больше будет похоже на соревнование по созданию ИИ, а не по гаданию.
Да, конечно я буду пользоваться самым современным компилятором - FPC, и файлы для него (по официальной рекомендации) имеют расширение .pas или .pp, но никак не .dpr. И наличие бинарников под всякие древние ОС мне ни о чем не скажет, т.к. раз от меня требуют исходник, то для меня главным критерием, я думал, является то, чтобы он компилировался и правильно тестировал. А оказывается это совсем неважно! Я могу вернуть правильный чекер, который компилируется и правильно работает, но это будет неправильный ответ.
2. Наличие бинарника под любую систему повышает вероятность того, что эта программа не просто лежит в архиве, а ею на самом деле пользовались. А то — мало ли какие недописанные чекеры, которые даже совсем не обязаны компилироваться, кто-то когда-то писал к этой задаче...
А вообще, странно спорить в таком ключе об условии задачи. По-моему, ответ Михаила следует принять как разъяснение по условию, а не доказывать, что условие не соответствует твоим представлениям об архивах с задачами.
1. В Delphi багов не меньше... но FPC хотя бы активно допиливают. А... ну ещё FPC более "современный", потому что работает во всех современных ОС, а не только в Windows.
2. А если пойти дальше "вероятности", то можно проверить что он дописан, компилируется и правильно чекерит. Почему мой ответ в таком случае будет считаться неправильным?
P.S. Всё это к тому, что чекер к этому контесту должен быть более гибким, и иметь возможнось считать правильным несколько вариантов ответа на тестах типа такого.
2. Ну встроить в решение компилятор для проверки корректности — это ещё ладно. Но боюсь, что задача “определить, правильно ли чекерит” окажется алгоритмически неразрешима. Даже если предположить, что уже написан формальный пониматор условия.
Вот найти бинарник — вполне понятная задача.
Не факт. С какой-то степенью "вероятности" мой супер-ИИ вполне может справится (в простейшем случае: если на эталонных решениях чекер выдает OK, а на любом другом мусоре WA), и для некоторых частных случаев это может работать.
Но вот стоит ли решать эту задачу и создавать такое подобие ИИ??? Если в условии от меня требуют "чекер", я в конкретном случае возвращаю исходник, который компилится в нормальной ОС, работает, и в данном случае корректно тестирует, т.е. достойно претендует на то, чтобы называться "чекером"... но этот ответ неправильный.
Я так понимаю предполагается разбирать архив, уже подготовленный к загрузке в некоторую систему тестирования?
Ведь архивы задач часто распространяют со всякими скриптами и генераторами, причём скрипты могут быть на чем-нибудь вроде sh, bat или py. Более того, чекеры работают по-разному в различных системах - их надо изменять. Даже тесты могут (иногда) содержать различные типы переводов строк... Есть ещё условие задачи, которое было бы неплохо как-нибудь обработать.
В общем: программа, которая дифференцирует файлы с готовыми тестами по категориям - это конечно забавно. Но при адаптации архива задачи к неродной системе тестирования ручной работы останется очень много.
То есть
А взламывать чужие решения можно будет ?
Почему в первом же тесте в files.lst:
WINDOWS/J1/j1.1.in
WINDOWS/J1/j1.1.out
...
А в answer.lst:
tests:
j1.1.in:j1.1.out
Когда путь в файлу убирать, а когда нет?
Почему регистр файлов иногда не совпадает?
Почему в 4-м тесте files.lst пустой, а ответ нет? Сказано же, что другие файлы (кроме тех, что перечислены) не трогать.
6-й тест: почему data/v_elev.cpp не считается чекером? Вроде бы чекер, который генерит XML-ку как результат, что с ним не так?
TC always describe random distribution and all ranges. So... optimal solution = solution that get best summary score for all possible input data (if you have infinite time you can bruteforce all possible next opponent's moves and taking into account their probability distribution choose the best variant).
problem/Source/tester.dpr
problem/Source/TESTER.PAS
why .dpr is a checker, not *.pas?
Если
Редактировать сообщения
То их получится не очень много :-)
А будут по окончанию выложены решения участников?
Или это будет закрытое имущество codeforces?
У нас тренировки внутриУрГУшные проходят на тимусе.
Мне обычно лень разбираться в форматах и заливать :)
Круто было бы иметь инструмент. Было бы клёво, если б проект открытый был.
P.S. Может я неверно что-то прочитал. Тыкните меня, если где-то это уже обсуждалось.
Самое главное: код победителя будет оформлен в отдельную маленькую библиотечку, которая будет распространять по свободной лицензии.
У меня Mozilla 3.6.16
Каким-либо автоматизированным способом или же Михаил собственными руками его заполняет?
Если он создается в ручную, то автоматизацию процесса с помощью данного парсера можно поставить под сомнение.