Пользователь CarpetPython опубликовал новый взгляд на эту проблему, в котором гораздо больше внимания уделяется эвристическим решениям из-за увеличенного пространства поиска. Я лично считаю, что этот вызов намного приятнее моего, поэтому подумайте над тем, чтобы попробовать его!
Векторные гонки - это захватывающая игра, в которую можно играть с ручкой и листом бумаги с квадратной линией. Вы рисуете произвольную гоночную трассу на бумаге, определяете начало и конец, а затем управляете автомобилем с точечными размерами пошаговым способом. Доберись до конца как можно быстрее, но будь осторожен, чтобы не оказаться в стене!
Трек
- Карта представляет собой двумерную сетку, где каждая ячейка имеет целочисленные координаты.
- Вы двигаетесь по ячейкам сетки.
- Каждая ячейка сетки является либо частью дорожки, либо стеной.
- Ровно одна ячейка трека является начальной координатой.
- По крайней мере одна ячейка пути обозначена как цель. Посадка на любой из них завершает гонку. Несколько клеток цели не обязательно связаны.
Управление автомобилем
Ваш автомобиль начинается с заданной координаты и вектора скорости (0, 0). В каждом повороте вы можете регулировать каждый компонент скорости ±1или оставить его как есть. Затем результирующий вектор скорости добавляется к позиции вашего автомобиля.
Картинка может помочь! Красный круг был вашей позицией в последний ход. Синий круг - это ваша текущая позиция. Ваша скорость - это вектор от красного до синего круга. В этом случае, в зависимости от того, как вы отрегулируете свою скорость, вы можете перейти к любому из зеленых кругов.

Если вы приземлитесь в стене, вы немедленно проиграете.
Твое задание
Вы уже догадались: напишите программу, которая, учитывая вход в гоночную трассу, направляет машину к одной из клеток ворот за как можно меньшее количество оборотов. Ваше решение должно быть в состоянии справиться с произвольно выбранными треками и не должно быть специально оптимизировано для предоставленных тестовых случаев.
вход
Когда ваша программа вызывается, читайте из stdin :
target
n m
[ASCII representation of an n x m racetrack]
time
targetмаксимальное количество ходов, которое вы можете совершить, чтобы завершить трек, и timeваш общий бюджет времени для трека в секундах (не обязательно целое число). Смотрите ниже подробности о времени.
Для дорожки с разделителями новой строки используются следующие символы:
#- стенаS- начало*- цель.- все остальные трековые ячейки (т.е. дорога)
Предполагается, что все ячейки за пределами n x mпредоставленной сетки являются стенами.
Начало координат находится в верхнем левом углу.
Вот простой пример:
8
4.0
9 6
###...***
###...***
###...***
......###
S.....###
......###
Используя индексирование на основе 0, начальная координата будет (0,4).
После каждого хода вы будете получать дополнительные данные:
x y
u v
time
Где x, y, u, vвсе 0 на основе целых чисел. (x,y)ваша текущая позиция и (u,v)ваша текущая скорость. Обратите внимание, что x+uи / или y+vможет быть за пределами.
timeэто все, что осталось от вашего бюджета времени, в секундах. Не стесняйтесь игнорировать это. Это только для участников, которые действительно хотят довести свою реализацию до установленного срока.
Когда игра закончится (потому что вы приземлились в стене, вышли за границы, превысили targetобороты, не хватило времени или достигли цели), вы получите пустую строку.
Выход
Для каждого хода пишите в stdout :
Δu Δv
где Δuи Δvкаждого из них один из -1, 0, 1. Это будет добавлено (u,v)для определения вашей новой позиции. Просто чтобы уточнить, направления следующие
(-1,-1) ( 0,-1) ( 1,-1)
(-1, 0) ( 0, 0) ( 1, 0)
(-1, 1) ( 0, 1) ( 1, 1)
Оптимальным решением для приведенного выше примера будет
1 0
1 -1
1 0
Обратите внимание, что контроллер не присоединяется к stderr , поэтому вы можете использовать его для любого отладочного вывода, который может вам понадобиться при разработке вашего бота. Пожалуйста, удалите / закомментируйте любой такой вывод в представленном вами коде.
Ваш бот может занять полсекунды, чтобы ответить в каждом ходу. Для поворотов, которые занимают больше времени, у вас будет время (на трек) в target/2секундах. Каждый раз, когда ход занимает больше полсекунды, дополнительное время будет вычитаться из вашего временного бюджета. Когда ваш временной бюджет достигнет нуля, текущая гонка будет прервана.
Новое: по практическим соображениям я должен установить ограничение памяти (так как память кажется более ограничивающей, чем время для разумных размеров дорожек). Поэтому мне придется прервать любой тестовый прогон, когда гонщик использует более 1 ГБ памяти, что измеряется Process Explorer как частные байты .
счет
Существует эталон из 20 треков. Для каждого трека:
- Если вы пройдете трассу, ваш счет - это количество ходов, необходимое для достижения ячейки цели, деленное на
target. - Если у вас закончилось время / память или вы не достигли цели до того
target, как пройдут ходы, или вы в любой момент приземлились в стене / за пределами, ваш счет равен2. - Если ваша программа не является детерминированной, ваш результат составляет в среднем более 10 пробежек на этом треке (укажите это в своем ответе).
Ваш общий балл - это сумма баллов отдельных треков. Самый низкий балл побеждает!
Кроме того, каждый участник может (и настоятельно рекомендуется) предоставить дополнительный контрольный трек , который будет добавлен в официальный список. Предыдущие ответы будут переоценены, включая этот новый трек. Это делается для того, чтобы убедиться, что ни одно решение не адаптировано слишком близко к существующим тестовым примерам, и для учета интересных крайних случаев, которые я мог пропустить (но которые вы можете заметить).
Разрыв связи
Теперь, когда уже существует оптимальное решение, это, вероятно, будет основным фактором для оценки участников.
Если есть связь (из-за того, что несколько ответов решают все треки оптимально или иным образом), я добавлю дополнительные (более крупные) контрольные примеры, чтобы разорвать связь. Чтобы избежать предвзятости человека при создании этих тай-брейков, они будут сгенерированы фиксированным образом:
- Я увеличу длину стороны
nпо10сравнению с последним треком, сгенерированным таким образом. (Я могу пропустить размеры, если они не сломают галстук.) - Основа этой векторной графики
- Это будет растеризовано с желаемым разрешением, используя этот фрагмент Mathematica .
- Начало в левом верхнем углу. В частности, это будет самая левая ячейка самого верхнего ряда этого конца дорожки.
- Цель в правом нижнем углу. В частности, это будет самая правая ячейка самого нижнего ряда этого конца дорожки.
targetВоля4*n.
Финальная дорожка исходного теста уже была сгенерирована следующим образом n = 50.
Контроллер
Программа, которая проверяет представленные материалы, написана на Ruby и может быть найдена на GitHub вместе с файлом эталонного теста, который я буду использовать. Там также есть пример бота randomracer.rb, который просто выбирает случайные ходы. Вы можете использовать его базовую структуру в качестве отправной точки для вашего бота, чтобы увидеть, как работает связь.
Вы можете запустить свой собственный бот для файла трека по вашему выбору следующим образом:
ruby controller.rb track_file_name command to run your racer
например
ruby controller.rb benchmark.txt ruby randomracer.rb
Хранилище также содержит два класса Point2Dи Track. Если ваша заявка написана на Ruby, не стесняйтесь использовать ее для вашего удобства.
Командная строка
Вы можете добавить параметры командной строки -v, -s, -tперед именем файла в бенчмарка. Если вы хотите использовать несколько переключателей, вы также можете сделать, например, -vs. Вот что они делают:
-v (подробный): Используйте это, чтобы произвести немного больше отладочного вывода от контроллера.
-s (без звука): Если вы предпочитаете самостоятельно отслеживать свою позицию и скорость и не заботитесь о временном бюджете, вы можете отключить эти три строки вывода каждый ход (отправленный на ваше представление) с помощью этого флага.
-t(дорожки): позволяет выбрать отдельные дорожки для проверки. Например, -t "1,2,5..8,15"будут проверяться только треки 1, 2, 5, 6, 7, 8 и 15. Большое спасибо Ventero за эту функцию и парсер опций.
Ваше представление
В заключение, пожалуйста, включите в свой ответ следующее:
- Твой счет.
- Если вы используете случайность, укажите это, чтобы я мог усреднить ваш результат за несколько прогонов.
- Код для вашего представления.
- Расположение бесплатного компилятора или интерпретатора для вашего языка, выбранного на компьютере с Windows 8.
- Инструкция по компиляции при необходимости.
- Строка командной строки Windows для запуска вашего представления.
- Требует ли ваше представление
-sфлаг или нет. - (опционально) Новый, разрешимый трек, который будет добавлен в тест. Я определю разумный
targetдля вашего трека вручную. Когда трек будет добавлен в тест, я отредактирую его из вашего ответа. Я оставляю за собой право попросить вас о другой дорожке (на случай, если вы добавите непропорционально большую дорожку, включите в нее непристойную графику ASCII и т. Д.). Когда я добавлю тестовый набор в набор тестов, я заменим трек в вашем ответе ссылкой на трек в файле тестов, чтобы уменьшить беспорядок в этом посте.
Как вы можете видеть, я буду тестировать все материалы на компьютере с Windows 8. Если нет абсолютно никакой возможности запустить ваше представление в Windows, я также могу попробовать виртуальную машину Ubuntu. Это будет значительно медленнее, поэтому, если вы хотите максимально увеличить ограничение времени, убедитесь, что ваша программа работает в Windows.
Пусть лучший водитель появится в векторе!
Но я хочу играть!
Если вы хотите попробовать игру самостоятельно, чтобы лучше почувствовать ее, есть такая реализация . Правила, используемые там, немного более изощренны, но я думаю, что они достаточно похожи, чтобы быть полезными.
Leaderboard
Последнее обновление: 01.09.2014, 21:29 UTC
Дорожки в тесте: 25
Размеры стяжки: 290, 440
- 6.86688 - Курой Неко
- 8.73108 - user2357112 - 2-я подача
- 9.86627 - nneonneo
- 10.66109 - user2357112 - 1-я подача
- 12.49643 - Рэй
- 40.0759 - псевдоним117 (вероятностный)
Подробные результаты теста . (Баллы за вероятностные представления были определены отдельно.)