В 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 действий в чекере.
Проблема 1: я попробовал добавить в тестовую задачу семпл 40x40 символов (как я понимаю, этого будет достаточно для твоей задачи), для этого я добавил тест с флагом Example=Y и скопировал ввод дополнительно в поле Input in statements (не знаю, обязательно ли это). После этого (с горем пополам) семпл отобразился в пдфке на полигоне, а потом и в мэшапе.
Проблема 3: участники с тренерским доступом точно не могут смотреть чужие посылки в мэшапах, а касательно кредита доверия автора... Если автору интересно самому порешать эту задачу, зачем смотреть чужие решения (которые, к тому же, не дают ничего, кроме места в табличке на древнем сайте)?
P.S. я сам так себе разбираюсь в полигоне, может кто-то более опытный подскажет по второму вопросу.
Спасибо за помощь! Теперь я понял, где это поле "Input in statements". Надо нажать "Edit" у выбранного теста на вкладке "Tests", дальше поставить галку "Use in statements" и в появившихся текстовых полях под этой галкой ("Input in statements:" и "Output in statements:") вставить сэмплы.
вот бл, я ж теперь в оригинальную игру залипну на несколько дней
Для выставления баллов за тест не нужен scorer (он нужен для изменения баллов за тест в зависимости от других тестов, насколько я понимаю, это не до конце реализованная технология, поэтому и спрятана на вкладке advanced).
Чтобы выставить баллы за один тест, в чекере нужно сделать
quitp(score, comment, ...)
с желаемымscore
.Да, я уже сделал новую версию задачи с
quitp
, спасибо)Теперь в задаче один тест.
Также я пофиксил проблему с "слишком большим семплом" через custom output.
На всякий случай, полезная информация по чекерам есть, как ни странно, в официальной документации полигона.
Также полезная информация есть, например, в данном посте (как и в множестве других обсуждений).
Added english statement (thx automatic translation)