Гра
Більшість із нас знає про Frogger , аркадну гру 80-х років, де мета - безпечно перескочити жабу через напружене шосе та заповнений небезпекою ставок, щоб безпечно прибути додому.
Кілька місяців тому було випущено завдання щодо створення клона Frogger. Але навіщо клонувати Frogger, коли ти можеш грати у Frogger? :)
Розглянемо наступну спрощену ігрову сітку:
XXXXXXXXXXXXXXXXXXXXXXX North Safe Zone
-----------------------
| | <<<< Express Lane West (Lane 1)
| | > Gridlock East (Lane 2)
| | << Freeflowing Traffic West (Lane 3)
| | < Gridlock West (Lane 4)
| | >>>> Express Lane East (Lane 5)
-----------------------
XXXXXXXXXXX@XXXXXXXXXXX South Safe Zone
\__________ __________/
'
23 cells horizontally
У нас є п'ять смуг руху, кожна на 23 клітини шириною, і дві безпечні зони (де жаба може безпечно рухатися ліворуч та праворуч), також 23 клітини шириною. Ви можете ігнорувати праву та ліву межі, оскільки це для наочності наочності.
Наша жаба починається в південній безпечній зоні, в центральній (12-й) клітині, як зазначено на @
малюнку вище.
Час у грі поділяється на дискретні кроки, які називаються кадрами. Жаба - це швидка жаба, яка може скакати одну клітинку в будь-якому напрямку (вгору, вниз, вправо, вліво) на кадр. Він також може залишитися нерухомим для будь-якого кадру. Рух по п'яти смугах руху рухається з постійною швидкістю таким чином:
- рух по експрес-смузі на захід (смуга 1) переміщує 2 комірки зліва від кожного кадру
- трафік у сітковій смузі східної смуги (смуга 2) рухається по 1 осередку вправо кожного другого кадру
- трафік по потоку, що протікає по потоку на західній смузі (смуга 3), переміщується по 1 осередку зліва від кожного кадру
- трафік у сітковій смузі заходу (смуга 4) переміщається по 1 осередку зліва на кожен другий кадр
- рух по експрес-смузі на схід (смуга 5) рухається по 2 комірки вправо кожного кадру
Сам трафік однозначно визначений на бл. 3 000 часових кроків у цьому текстовому файлі . "Рух" складається з транспортних засобів та просторів між транспортними засобами. Будь-який персонаж, який не є пробілом, є частиною транспортного засобу. Текстовий файл містить п'ять рядків, що відповідають п'яти смугам руху (з однаковим порядком).
Для смуг, що перебувають на захід, на початку кадру 0 (початок гри) ми вважаємо, що перший транспортний засіб на смузі руху знаходиться лише за правим краєм гральної сітки.
Для смуг, що перебувають на схід, смугу руху слід вважати "назад" в тому сенсі, що транспортні засоби з'являються починаючи в кінці рядка. На початку кадру 0 ми вважаємо, що перший автомобіль на цих смугах знаходиться лише за лівим краєм ігрового поля.
Розглянемо як приклад:
Traffic Lane 1: [|==| =
Traffic Lane 2: |) = o
Traffic Lane 3: (|[]-[]:
Traffic Lane 4: <| (oo|
Traffic Lane 5: |==|] :=)
Тоді гральна сітка з’явиться наступним чином:
Start of Frame 0 XXXXXXXXXXXXXXXXXXXXXXX
[|==| =
|) = o
(|[]-[]:
<| (oo|
|==|] :=)
XXXXXXXXXXXXXXXXXXXXXXX
Start of Frame 1 XXXXXXXXXXXXXXXXXXXXXXX
[|==| =
|) = o
(|[]-[]:
<| (oo|
|==|] :=)
XXXXXXXXXXXXXXXXXXXXXXX
Start of Frame 2 XXXXXXXXXXXXXXXXXXXXXXX
[|==| =
|) = o
(|[]-[]:
<| (oo|
|==|] :=)
XXXXXXXXXXXXXXXXXXXXXXX
Start of Frame 3 XXXXXXXXXXXXXXXXXXXXXXX
[|==| =
|) = o
(|[]-[]:
<| (oo|
|==|] :=)
XXXXXXXXXXXXXXXXXXXXXXX
Після того, як весь трафік у смузі "виснажений" (тобто рядок закінчується), ми вважаємо, що всі символи рядка є пробілами.
Наша жаба лущиться, якщо трапляється щось із наступного:
- жаба займає клітинку, зайняту транспортним засобом, на будь-якій рамі
- жаба залишається нерухомою в експрес-смузі, і транспортний засіб шириною 1 клітини проходить над ним у цій рамці
- жаба стрибає на схід «через» транспортний засіб, який прямує на захід, або стрибає на захід через транспортний засіб, що прямує на схід
- жаба стрибає за межами 7 (лінії) на 23 (клітинку) граючої сітці, на будь-якому кадрі
Зауважте, що це єдині умови, при яких жаба лягає. Зокрема, дозволено жабу, що стрибає разом із «рухом», як і жаба, що стрибає у клітину або виходить із неї в експрес-смузі, що передається автомобілем шириною-1 у тому ж кадрі.
Мета та підрахунок балів
Завдання програмування полягає в тому, щоб якомога більше разів переходити жабу через дорогу до виходу останнього транспортного засобу з гральної сітки . Тобто програма закінчується відразу після заповнення кадру X , де кадр X - перший кадр, який приймає сітку до стану, коли більше транспортних засобів немає.
Виведенням вашої програми повинен бути рядок (або текстовий файл), що містить послідовність рухів для жаби, використовуючи таке кодування:
< frog moves left
> frog moves right
^ frog moves up
v frog moves down
. frog remains stationary
Наприклад, рядок <<^.^
вказує на те, що жаба двічі рухається ліворуч, потім вгору, потім робиться пауза для одного кадру, потім знову рухається вгору.
Один бал набирається кожного разу, коли жаба перетинає південну безпечну зону до північно безпечної зони, і один бал нараховується всякий раз, коли жаба перетинає від безпечної північної зони до південної безпечної зони.
Деякі важливі правила:
- Жаба не повинна коситись.
- Будь ласка, опублікуйте своє рішення (послідовність рухів) разом із кодом програми, вбудованим чи текстовим файлом (наприклад, використовуючи pastebin.com).
- Наша жаба є давнім і невідомим, тому ваша програма може використовувати будь-які дані про трафік у будь-якому кадрі, шукаючи рішення. Сюди входять дані про трафік, який ще не досяг сітки гри.
- Сітка не загортається. Вихід із сітки призведе до того, що жаба буде скуйовджена, а значить, заборонена.
- Ні в якому разі трафік не "скидається" або жаба "телепортується". Моделювання безперервне.
- Жаба може повернутися до безпечної зони на південь після виходу з неї, але це не зараховується. Так само і для північної безпечної зони.
- Переможець конкурсу - програма, яка генерує послідовність руху, даючи найбільшу кількість перетинів.
- По будь-яких додаткових питаннях чи занепокоєннях, будь ласка, не соромтесь задавати їх у розділі коментарів.
Для деякого додаткового стимулу, я додаю ще суму в 100 переспівів програмі-переможниці, коли зможу це зробити.
Бонуси
+ 2,5% до базового показника * (до + 10%) за кожен кут ігрової сітки, до якого жаба торкається. Чотири кути сітки - це крайній лівий і правий осередки двох безпечних зон.
+ 25% до базового балу *, якщо ваша послідовність рухів утримує жабу в межах +/- 4 клітинок ліворуч або праворуч від його вихідної комірки протягом усього моделювання (він, звичайно, може вільно рухатися вертикально).
Жоден бонусний бонус не буде, але спеціальні реквізити в ОП потраплять до тих, хто опублікує швидкий n 'брудний валідатор рішення, щоб мені не довелося програмувати його. ;) Валідатор просто прийняв би послідовність рухів, забезпечив його законність (відповідно до правил та файлу трафіку) та повідомив про його рахунок (тобто загальну кількість переїздів).
* Загальний бал дорівнює базовому балу плюс бонус, округлений до найближчого цілого числа.