Всем привет!
Пришла пора рассказать о нововведениях в Polygon — системе для подготовки задач по программированию. Именно в ней подготавливаются все задачи к раундам Codeforces и многим другим олимпиадам. Системой Polygon могут пользоваться все желающие в любой момент времени.
Общее
На странице со списком используемых в задаче файлов, а также на страницах чекера, интерактора и валидатора теперь отображаются специальные поля с соответствующими примерами. Это поможет новым пользователям быстрее разобраться в системе.
Было добавлено несколько новых уведомлений на почту при изменениях в задачах и контестах. Теперь письма отправляются при добавлении, изменении и удалении прав на задачу/контест. Также во всех письмах теперь содержится прямая ссылка на измененный контест/задачу. Кроме этого добавлена возможность добавления специальных email адресов, на которые отправляются письма о любых изменениях в задаче или контесте. Добавить дополнительные адреса для констеста можно на странице Properties/Files (инструкция по добавлению находится под табличкой Contest resources/files), а для задачи на странице Advanced Setup.
На странице с недавними изменениями по задаче (Recent Changes) для каждого коммита добавлено поле Change Log, в котором содержатся все изменения для соответствующего коммита, по аналогии с письмами, которые отправляются пользователям.
Также реализован корректный переход к предыдущей просмотренной странице.
Контесты и задачи
На странице со списком доступных пользователю контестов добавлен столбец Modification Time, в котором содержится информация о времени последнего изменения контеста и любой из задач, содержащихся в нем.
Теперь, если вы добавили свойство контеста, название которого начинается с буквы и содержит только буквы, цифры и подчеркивания, его можно использовать в statements.ftl как свойство контеста. Например, можно добавить свойство note и использовать его в statements.ftl как ${contest.note}
.
Частично решены проблемы с одинаковыми названиями задач в одном контесте. Если контест содержит задачи с одинаковыми названиями, то на страницу со списком задач, которые содержатся в контесте, выводится предупреждение.
На странице с основной информацией по задаче появилось поле Contests, в котором отображены все доступные для пользователя контесты, в которых есть данная задача.
Для задач реализована возможность добавления коротких заметок. Например, их можно использовать для краткого описания сложности задачи. В таком случае авторы смогут быстрее оценивать сложность больших контестов и принимать решения о том, какие задачи нужно в него добавить.
На странице со списком задач, используемых в контесте, добавлен столбец с предупреждениями (warnings), в котором можно ознакомиться с предупреждениями по каждой из задач (по аналогии с issues). Список предупреждений для задачи обновляется после коммита по ней.
Также была улучшена логика удаления и восстановления удалённых задач и опция добавления прав на задачу нескольким пользователям одновременно.
Поиск задач
Реализована возможность поиска всех задач, которые создал пользователь. Для этого нужно выполнить поиск по его логину (то есть по owner login). На странице результатов поиска теперь всегда отображается краткое описание задачи (description), если оно не пусто. Также теперь можно искать задачи у которых нет ревизии.
Условия
В случае ошибок при построении условий для целого контеста теперь отображается название задачи, в которой произошла ошибка. Это поможет быстрее найти ошибку и исправить её.
Также для русских условий добавлены предупреждения о неверных окончаниях (наращениях) числительных. Например, неправильно писать n-ый, а правильно n-й. С правилами можно ознакомиться по ссылке http://new.gramota.ru/spravka/letters/87-rubric-99.
Валидаторы
Реализована возможность добавления названия тестсета и группы для тестов валидаторов. Это упрощает тестирование валидаторов для задач, в которых используются несколько тестсетов или групп тестов. Добавлять и изменять названия тестсета и группы можно непосредственно на странице добавления/редактирования теста.
Ранее нельзя было запускать тесты для валидатора в том случае, если в задаче нет чекера. Сейчас это исправлено. Также для валидаторов добавлены предупреждения в случаях, если в валидаторе используется старый формат registerValidation(), либо если в валидаторе есть считываемые переменные, для которых не указано название.
Тесты
При добавлении или редактировании теста теперь можно назначать/изменять значение группы для него непосредственно на странице добавления/редактирования. Также реализована специальная логика для подсказки названия предполагаемой группы, а также автодополнения. Были исправлены ошибки, которые возникали при редактировании и копировании тестов. Улучшено отображение ошибок при предпросмотре тестов. Также теперь можно выбирать тесты не по одному, а сразу диапазоном, при помощи клавиши shift.
Стрессы
Выбор решений при создании стрессов стал удобнее, появились checkboxes для выбора нужных (по аналогии с тестами). Также появилась возможность копирования стрессов, при этом у всех копий поддерживается общий список решений. При изменении набора решений в какой-то из копий, он автоматически изменяется во всех копиях, при этом остальные параметры стресса могут быть изменены независимо от остальных копий.
Также было поддержано корректное стресс-тестирование для интерактивных задач.
Решения
На странице со списком решений в задаче реализована возможность загрузки и удаления нескольких решений одновременно. Также реализована возможность одновременного редактирования нескольких решений на одной странице и сохранения их либо по отдельности, либо всех сразу.
Пакеты
Была улучшена логика по созданию пакетов по задаче. К примеру, раньше нельзя было собрать пакет с верификацией по задаче, если до этого был собран пакет без верификации, но для той же ревизии. Сейчас это исправлено.
Testlib
В библиотеку Testlib также были внесены полезные изменения, которые поддержаны и в Polygon. Новый релиз можно скачать по ссылке testlib-0.9.12. Теперь в валидаторе можно сразу считывать последовательности элементов, разделённых пробелами. Элементами могут быть как числа (целые или вещественные), так и строки. Для считывания чисел нужно использовать функции readInts(), readIntegers(), readLongs(), readUnsignedLongs(), readDoubles(), readReals(), readStrictDoubles() и readStrictReals(), а для считывания строк readWords(), readTokens(), readStrings() и readLines(). В результате считывания возвращается вектор элементов соответствующего типа. Например, чтобы считать 100 целых чисел в промежутке от - 1000 до 1000, включительно, нужно написать inf.readInts(100, -1000, 1000, "a")
.
Вот еще несколько примеров:
vector<string> names = inf.readLines(n, "[a-z]{1,10}", "names");
vector<long long> ids = inf.readLongs(2 * n, 1LL, (long long)(1E18), "ids");
inf.readEoln();
vector<int> p = inf.readInts(n, 1, n, "p");
ensuref(set<int>(p.begin(), p.end()).size() == n, "p should be a permutation of 1..n");
inf.readEoln();
Polygon-cli
Реализованы множественные улучшения API Polygon. Теперь пользоваться консольным клиентом стало еще удобнее. Подробнее ознакомиться с ним можно здесь.
В скором времени Вас ждут все новые и новые улучшения! Всем спасибо за внимание!
Спасибо, быстро у вас движется разработка!
У меня нет такого поля в контестах на странице Properties/Files. Может, оно есть только у того, кто создал контест? Тогда этого мало.
Инструкция по добавлению дополнительных email адресов для контеста находится под табличкой Contest resources/files на странице Properties/Files.
О, спасибо, теперь вижу! Оказывается, надо было прочитать серый текст.
Awesome!
Are examples at the bottom correct? Shouldn't we use
vector<long long>
here:vector<string> ids = inf.readLongs
? And the last ensure seems to have different number of opening and ending brackets.EDIT: and btw. how to enable groups of tests in Polygon? And is it possible to choose a group in the script (something like
gen 123453 > test_number (group_number)
)?Thanks, examples are fixed.
No, it is impossible for now.
And that is a great pity. There is a long-standing ticket (in Russian) for such a functionality (duplicated by Burunduk1 several days ago), and it sounds like a very convenient feature that doesn't seem hard at all. Like, if we generate almost all tests, why should we manually mark them with group ids?
More than a year is "several days" for you. I wish I could live this way.
Oh, I thought second issue was filed after last all-Russian Olympiad that has just finished. My bad.
ensure(set<int>(inf.readInts(n, 1, n, "p").size() == n, "p should be a permutation of 1..n");
should be
ensure(set<int>(inf.readInts(n, 1, n, "p")).size() == n, "p should be a permutation of 1..n");
Sure, thanks. Fixed.
Why I can't add a problem to a Mashup, when i try to add problem it give the error "Can't find problem descriptor" and i try with an old problems, and I can't open any problem in an old Mashup it give the error "can't read or parse problem desriptor" ?
Did you add access to "codeforces" user?
yes
Last week I create a mashup and add problem to it today I can't access to the problem, and I try to add the same problem to the mashup but faild
Sorry, it will be fixed tomorrow.Fixed.I'm sorry if
is there a guideline for how to create a complete problem in Polygon?
For example, let's say I have an idea for this dummy problem:
Then, having this, what does the corresponding problem Checker and/or the Validator stand for? And how should the testset for the problem be implemented — by a generator, manually, or...?
Of course, there are many more questions that could be asked, but in general I would like to get comfortable in working with Polygon and its features.
Is there already a such resource, which I should get familiar with?
Thanks
For checker, validator and how to implement them, you can read in testlib section.
When I add mashup contest in Gym, I see that there is option IOI for contest format. Is this feature working? I cannot get scoreboard to work, and it looks like few people in this blog also can not.
What I did:
Это конечно всё круто, но я вот жду когда добавят перемещение нескольких тестов одновременно.
Как это вообще компилируется? Преобразование std::vector в std::set не работает на паре проверенных компиляторов.
Как предполагается писать чекеры (с testlib.h, под ejudge), не_требующие правильного ответа, для обычных (не_интерактивных) задач? Пытаюсь задать (в Web-интерфейсе serve-control) значение "No" для "Use "correct answer" files for check?", в результате в serve.cfg появляется в правильном месте строка use_corr = 0, чекер компилируется, но при запуске выдаёт Check failed
Что я делаю не так?
(Quick-fix вида "вернуть галочку будто я использую правильные ответы, поскладывать в нужное место ненужные типа файлы с типа ответами, но фактически не обращать на них внимание" работает. Но это ведь некрасиво... Как делать правильно?)