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

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

Доброй ночи/рассвета/утра/дня/заката/вечера/ночи, Codeforces!

Сегодня я рад представить вам последнее обновление в функциональности Polygon — системы подготовки олимпиадных задач по программированию. В системе Polygon создаются все раунды Codeforces.

Это обновление сосредоточено вокруг скриптов для генерации тестов.

Окно ввода скрипта  

Часть первая. Автонумерация тестов

Появилась возможность автоматической нумерации тестов.

Вместо

gen_n 5 10 1 > 57
gen_n 5 10 2 > 58
gen_n 5 10 3 > 59
gen_n 5 10 4 > 60
gen_n 5 10 5 > 61

теперь можно писать

gen_n 5 10 1 > $
gen_n 5 10 2 > $
gen_n 5 10 3 > $
gen_n 5 10 4 > $
gen_n 5 10 5 > $

Символ доллара, используемый для обозначения автоматической нумерации, означает наименьший из не занятых номеров. То есть, если написать

gen 1 > $
gen 2 > $
gen 4 > $
gen 5 > $
gen 3 > 3

то получится следующий скрипт генерации:

gen 1 > 1
gen 2 > 2
gen 3 > 3
gen 4 > 4
gen 5 > 5

Однако, не подумайте, что доллары при сохранении заменяются на индексы тестов. Это было бы слишком просто и неинтересно. Естественно, они сохраняются. Когда вы введете скрипт из примера выше и сохраните его, то получите следующее:

gen 1 > $
gen 2 > $
gen 3 > 3
gen 4 > $
gen 5 > $

Более того, при удалении какого-либо теста, тесты с долларами сами себя перенумеруют, а доллары никуда не исчезнут.

Уже давно в Polygon можно мышкой перетаскивать тесты с места на место за левый столбец таблицы. К сожалению, это функция мало заметная и поэтому ей не очень часто пользуются. Поэтому я решил о ней напомнить. Тесты с долларами можно перетаскивать, как и любые другие.

К сожалению, не обошлось и без капли дегтя. Было принято решение не поддерживать доллары для генераторов, которые генерируют несколько тестов, то есть имеют синтаксис

gen > {5-10,12,15}

Как известно, такие генераторы должны генерировать тесты и сохранять их в файлы 05, 06, ..., 10, 12, 15. Таким образом, если сделать эти тесты долларами, то при удалении какого-нибудь теста в начале, тесты будут перенумерованы, то есть вместо {5-10,12,15} получим {4-9,11,14}, а генератор не изменится. Для избежания таких проблем было решено не поддерживать доллары для таких генераторов.

Часть вторая. Скрипты для генерации скриптов.

На самом деле, автонумерация тестов, которая сама по себе является полезной, сделана для облегчения реализации следующего нововведения.

Появилась возможность писать скрипты на языке Freemarker Template Engine, которые будут исполняться на сервере и уже их вывод будет использоваться как скрипт для генерации тестов. То есть вместо

gen 10 1 1 > $
gen 10 1 2 > $
gen 10 1 3 > $
gen 100 4 1 > $
gen 100 4 2 > $
gen 100 4 3 > $
gen 1000 9 1 > $
gen 1000 9 2 > $
gen 1000 9 3 > $
gen 10000 16 1 > $
gen 10000 16 2 > $
gen 10000 16 3 > $

можно писать

<#assign n = 1>
<#list 1..4 as pow>
    <#assign n = n * 10/>
    <#list 1..3 as i>
        gen ${n} ${pow * pow} ${i} > $
    </#list>
</#list>

Краткую инструкцию о том как именно писать скрипты на этом языке можно найти по адресу https://polygon.codeforces.com/docs/freemarker-manual. Более подробно познакомится с языком можно при помощи официальной документации.

Однако, в связи с тем, что скрипт всегда должен соответствовать таблице тестов, при использовании языка Freemarker возникают некоторые ограничения:

  • Нельзя удалить, отредактировать или переместить тест из скрипта при помощи веб-интерфейса. Все это необходимо делать редактированием самого скрипта.

  • Необходимо всегда использовать доллары вместо индексов тестов. Это ограничение позволяет перетаскивать мышкой ручные тесты.

  • Из предыдущего вытекает, что при использовании Freemarker нельзя использовать генераторы, которые генерируют несколько тестов. Однако, как мне кажется, если вы написали один генератор на своём любимом языке программирования, который генерирует все тесты, то зачем вам Freemarker : )

Вы заметите, что кроме кнопки Save Script появились также Preview Script и Run Script.

Preview Script показывает вам конечный результат, то есть какие строки генерации попадут в какие тесты. Кнопка Run Script заменяет ваш скрипт на языке Freemarker, на скрипт в старом стиле, то есть последовательность строк генерации. Этой кнопкой можно воспользоваться, если вы уже практически закончили делать тесты и вам нужна какая-либо функциональность, которая ограничена при использовании Freemarker. Обратите внимание, что эта кнопку заменяет скрипт в поле ввода, но не сохраняет его.

Это все на сегодня. Я надеюсь эти нововведения облегчат вам непростой процесс создания задач.

С уважением, Иван.

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

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

Очень крутая функциональность, большое спасибо! =)

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

Еее, спасибо! Приятно, что можно в ПТЗ поговорить с Майком о чём-нибудь, а потом оно воплощается в жизнь прямо на глазах =)

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

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

Первый раз готовлю тетсы с использованием генератора с testlib.h Почему-то не выходит запустить скрипт. Мои действия:

1) загрузил генератор gen.cpp во вкладке Files

2) во вкладке Tests написал gen 1 1 1 1 > $

3) нажимаю Preview script получаю gen 1 1 1 1 > 1

4) нажимаю Run script и получаю сообщение Script has no Freemarker code. Nothing to run.

Подскажите, пожалуйста, что я делаю не так:)

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

    Моё предположение: запускать скрипт вам не нужно, так как все строчки генерации явно выписаны. То есть просто не нажимать на Run script.

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

    Run script не выполняет генерацию тестов (как могло показаться), он просто раскроет Freemarker код в обычный.

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

      спасибо! в этом и была моя главная ошибка:)