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

Автор fcspartakm, 7 лет назад, По-русски

Всем привет!

Пришла пора рассказать о нововведениях в 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. Теперь пользоваться консольным клиентом стало еще удобнее. Подробнее ознакомиться с ним можно здесь.

В скором времени Вас ждут все новые и новые улучшения! Всем спасибо за внимание!

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

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

Спасибо, быстро у вас движется разработка!

Кроме этого добавлена возможность добавления специальных email адресов, на которые отправляются письма о любых изменениях в задаче или контесте. Добавить дополнительные адреса для констеста можно на странице Properties/Files, а для задачи на странице Advanced Setup.

У меня нет такого поля в контестах на странице Properties/Files. Может, оно есть только у того, кто создал контест? Тогда этого мало.

  • »
    »
    7 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Инструкция по добавлению дополнительных email адресов для контеста находится под табличкой Contest resources/files на странице Properties/Files.

    • »
      »
      »
      7 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      О, спасибо, теперь вижу! Оказывается, надо было прочитать серый текст.

»
7 лет назад, # |
Rev. 7   Проголосовать: нравится +17 Проголосовать: не нравится

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))?

  • »
    »
    7 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Thanks, examples are fixed.

    No, it is impossible for now.

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

      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?

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

        More than a year is "several days" for you. I wish I could live this way.

        • »
          »
          »
          »
          »
          7 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Oh, I thought second issue was filed after last all-Russian Olympiad that has just finished. My bad.

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

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");

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

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" ?

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

I'm sorry if

  • this is already asked or
  • if my question seems stupid for some of the experienced problemsetters or
  • if this is offtopic, but

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:

"Read two integers and print their xor value"

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

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

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:

  • Create problem in Polygon, set judge to return partial scoring.
  • Create new Mashup contest.
  • Add my problem to the Gym Mashup.
  • Submit code. It is judged correctly as "Partial result: 100 points".
  • Open scoreboard. Now I see: "Ooops! Something has broken down in Codeforces. Do not panic, you can try to reload the page or return Home. Anyway we will carefully read megabytes of logs, analyze stacktraces and fix the problem".
»
7 лет назад, # |
  Проголосовать: нравится +10 Проголосовать: не нравится

Это конечно всё круто, но я вот жду когда добавят перемещение нескольких тестов одновременно.

»
7 лет назад, # |
  Проголосовать: нравится -7 Проголосовать: не нравится
ensure(set<int>(inf.readInts(n, 1, n, "p")).size() == n, "p should be a permutation of 1..n");

Как это вообще компилируется? Преобразование std::vector в std::set не работает на паре проверенных компиляторов.

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

Как предполагается писать чекеры (с testlib.h, под ejudge), не_требующие правильного ответа, для обычных (не_интерактивных) задач? Пытаюсь задать (в Web-интерфейсе serve-control) значение "No" для "Use "correct answer" files for check?", в результате в serve.cfg появляется в правильном месте строка use_corr = 0, чекер компилируется, но при запуске выдаёт Check failed

--- Checker output: size 160 ---
FAIL Program must be run with the following arguments: <input-file> <output-file> <answer-file> [<report-file> [<-appes>]]
Use "--help" to get help information

Что я делаю не так?

(Quick-fix вида "вернуть галочку будто я использую правильные ответы, поскладывать в нужное место ненужные типа файлы с типа ответами, но фактически не обращать на них внимание" работает. Но это ведь некрасиво... Как делать правильно?)