Користувач 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 ГБ пам'яті, виміряну процесором 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. Дякую Вентеро за цю функцію та розбір варіантів.
Ваше подання
Підсумовуючи, будь ласка, включіть у відповідь:
- Ваш рахунок.
- Якщо ви використовуєте випадковість, будь ласка, вкажіть це, щоб я міг оцінити ваш бал за кілька циклів.
- Код для подання.
- Розташування безкоштовного компілятора чи перекладача на вашу обрану мову, що працює на машині Windows 8.
- Інструкції з компіляції, якщо це необхідно.
- Рядок командного рядка Windows для запуску подання.
- Незалежно від того, чи потрібно подати
-s
прапор, чи ні. - (необов'язково) Нова вирішувана доріжка, яка буде додана до еталону. Я визначу розумний
target
для вашої доріжки вручну. Коли трек буде доданий до еталону, я відредагую його з вашої відповіді. Я залишаю за собою право попросити вас про інший трек (про всяк випадок, якщо ви додасте непропорційно велику доріжку, включіть у трек непристойне мистецтво ASCII тощо). Коли я додаю тестовий випадок до набору тестів, я заміню доріжку у вашій відповіді на посилання на доріжку у файлі еталону, щоб зменшити безлад у цій публікації.
Як бачите, я тестую всі матеріали на машині Windows 8. Якщо абсолютно немає способу запустити ваше представлення в Windows, я також можу спробувати UMM Ubuntu. Це буде значно повільніше, тому, якщо ви хочете збільшити максимальний термін, переконайтеся, що ваша програма працює в Windows.
Нехай найкращий водій вийде векторальним!
Але я хочу грати!
Якщо ви хочете спробувати гру самостійно, щоб краще відчути її, є така реалізація . Правила, які там використовуються, є дещо складнішими, але це досить схоже, щоб бути корисним.
Таблиця лідерів
Останнє оновлення: 01.09.2014, 21:29 UTC
Доріжки в орієнтирі: 25
Розміри автоматичних вимикачів: 290, 440
- 6.86688 - Курой Неко
- 8.73108 - user2357112 - 2-е подання
- 9.86627 - nneonneo
- 10.66109 - користувач2357112 - 1-е подання
- 12.49643 - Рей
- 40.0759 - псевдонім117 (імовірнісний)
Детальні результати тесту . (Оцінки за вірогідними поданнями визначаються окремо.)