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

Автор dmkz, история, 19 месяцев назад, По-русски

В 2004 году на просторах интернета появилась игра "Жук", рекламный блог на CF, где необходимо построить лабиринт, который задержит Жука на как можно более длительное время. Сегодня я обновил свой рекорд, построив лабиринт на $$$93.401.998$$$ ходов и, заняв 6-е место в топе, решил сделать зеркало этой игры, подготовив задачу на платформе Polygon и добавив в мэшап на codeforces. У меня это получилось, можно сабмитить решения и набирать баллы, но получилось не так, как хотелось бы... Буду рад, если кто-нибудь подскажет, как решить возникшие проблемы. Первое, что не удалось сделать, это огромные сэмплы в условии задачи. В игре поле $$$21 \times 31$$$ и при попытке добавить сэмпл с таким полем вылезает ошибка и предложение использовать опцию "examples in statements". Где эта опция находится — я не нашёл. Гугление тоже не помогло.

UPD Первая проблема решена здесь

Второе, что не удалось сделать, это пользовательский "Scorer file" на вкладке Advanced. Примеров в интернете и на самом полигоне не было (аналогичных примерам чекеров и валидаторов), поэтому я что-то написал сам, просматривая исходники библиотеки testlib. Это скомпилировалось и должно работать, но не работает — просто не запускается при проверке решения. Даже из-за assert(false); не вылетает. Исходный код того, что получилось. Предполагалось, что чекер будет писать в поле checkerComment, сколько ходов сделал Жук на лабиринте участника, и это значение бы доставалось и возвращалось...

Эта проблема меня не остановила и я решил сделать следующее: вычислить количество очков бинпоиском по ответу участника. То есть, я даю на вход степень двойки и если побитовое И от ответа участника и степени двойки даёт эту степень двойки, то к ответу прибавляется эта степень двойки. Таким образом, за $$$64$$$ теста можно посчитать количество очков (да, чекер будет считать ответ $$$64$$$ раза). Собственно, это и реализовано по ссылке выше.

Видите ли вы в этом уязвимость? Конечно, ведь можно для каждого теста сообщать всё новый и новый ответ (новый лабиринт), зарабатывая степени двойки на различных лабиринтах (подгоняя ответ так, чтобы нужный бит был выставлен). К тому же, если возвращать WA, то пакет с задачей на полигоне не может быть собран, так как решение жюри обязано проходить все тесты. Разумеется, у меня нет лабиринтов тех, кто находится выше меня в топе, поэтому программа жюри не может пройти некоторые тесты на степень двойки.

Как же я собрал пакет? А просто заифал, что это решение жюри, и если это оно, то возвращал OK.

Также придётся иметь $$$64$$$ группы тестов и чтобы каждая группа проверялась независимо?

Ну и третья проблема: автор задачи в мэшапе видит все решения участников. Возможно, фиолетовые участники в режиме тренера тоже видят. Если вы отправите код, который генерит лабиринт на 1 млрд, то лично я будут его видеть и смогу использовать в корыстных целях... Но это решаемо, если бы мэшап создавал автор игры "Жук" или тот, у кого кредит доверия довольно высок.

Буду рад, если поможете решить первые две проблемы.

P.S. Оригинальный сайт buglab.ru не осиливает проверку огромных лабиринтов, а если сабмитить огромные лабиринты, то, похоже, что весь сайт виснет на продолжительное время. Насколько я понимаю, у текущего топ-1 лабиринт на $$$7.550.297.908$$$ и он не может его сабмитнуть. Интересно, осилит ли чекер такой лабиринт? У меня проверка делается влоб за $$$O(\text{кол-во ходов жука})$$$. Да, 7*10^9 действий в чекере.

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

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

Проблема 1: я попробовал добавить в тестовую задачу семпл 40x40 символов (как я понимаю, этого будет достаточно для твоей задачи), для этого я добавил тест с флагом Example=Y и скопировал ввод дополнительно в поле Input in statements (не знаю, обязательно ли это). После этого (с горем пополам) семпл отобразился в пдфке на полигоне, а потом и в мэшапе.

Проблема 3: участники с тренерским доступом точно не могут смотреть чужие посылки в мэшапах, а касательно кредита доверия автора... Если автору интересно самому порешать эту задачу, зачем смотреть чужие решения (которые, к тому же, не дают ничего, кроме места в табличке на древнем сайте)?

P.S. я сам так себе разбираюсь в полигоне, может кто-то более опытный подскажет по второму вопросу.

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

    Спасибо за помощь! Теперь я понял, где это поле "Input in statements". Надо нажать "Edit" у выбранного теста на вкладке "Tests", дальше поставить галку "Use in statements" и в появившихся текстовых полях под этой галкой ("Input in statements:" и "Output in statements:") вставить сэмплы.

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

вот бл, я ж теперь в оригинальную игру залипну на несколько дней

»
19 месяцев назад, # |
  Проголосовать: нравится +26 Проголосовать: не нравится

Для выставления баллов за тест не нужен scorer (он нужен для изменения баллов за тест в зависимости от других тестов, насколько я понимаю, это не до конце реализованная технология, поэтому и спрятана на вкладке advanced).

Чтобы выставить баллы за один тест, в чекере нужно сделать quitp(score, comment, ...) с желаемым score.

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

    Да, я уже сделал новую версию задачи с quitp, спасибо)

    Теперь в задаче один тест.

    Также я пофиксил проблему с "слишком большим семплом" через custom output.

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

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

Также полезная информация есть, например, в данном посте (как и в множестве других обсуждений).

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

Added english statement (thx automatic translation)