По совету госпожи Пак-Мэн, которая беспокоится о том, чтобы он набрал лишний вес, Пак-Мэн решил отслеживать его ежедневное употребление Пак-Дот. Помогите ему подсчитать количество Pac-точек на заданном пути в лабиринте!
Лабиринт
Чтобы помочь вам создать собственную кодировку лабиринта, вы можете получить некоторые необработанные данные здесь .
Путешествие Pac-Man
В контексте этой задачи применяются следующие правила:
- Во-первых, хорошие новости: призраков там нет.
- Pac-Man всегда начинает свою гонку с позиции, указанной на картинке выше, направляясь на восток. В начальной позиции нет Pac-Dot.
- Пока он идет по прямому пути, он продолжает продвигаться к следующим клеткам.
- Когда он встречает поворот на 90 ° без какого-либо другого доступного пути (оранжевые квадраты на карте), он автоматически и систематически берет поворот.
- Когда он встречает перекресток, на котором доступно несколько путей (зеленые квадраты на карте), он может либо продолжить движение в том же направлении (если применимо), либо выбрать другое направление (в том числе сделать разворот).
- Когда Pac-Man проходит через один из выходов в средней левой или средней правой стороне лабиринта, он сразу же появляется на противоположной стороне.
- Pac-Man съедает все Pac-Dots на пути, по которому он идет. Как только Pac-Dot съеден, он удаляется из лабиринта.
Соревнование
вход
Вам дадут строку, описывающую поведение Pac-Man на перекрестках, которые он собирается достичь. Эта строка будет состоять из следующих символов:
L
: поверните налево на 90 °R
: повернуть направо на 90 °F
: идти вперед (без изменения направления)B
: идти назад (сделать разворот)
Когда все персонажи были обработаны, Pac-Man останавливается на следующем перекрестке, с которым он сталкивается.
Выход
Вы должны напечатать или вывести количество Pac-точек, съеденных по пути ввода.
правила
- Вы можете написать полную программу или функцию.
- Вы можете использовать ввод в верхнем или нижнем регистре в виде строки или массива символов. Вы также можете использовать другие символы (но только один символ в каждом направлении) или целые числа в
[0 .. 9]
. Если вы это сделаете, пожалуйста, четко укажите это в своем ответе. - Вы можете предположить, что ввод всегда действителен. (JsFiddle ниже будет обнаруживать ошибки, но вы не должны.)
- Это код-гольф, поэтому выигрывает самый короткий код в байтах.
- Стандартные лазейки запрещены.
намек
Возможно, не требуется и не оптимально хранить точную форму лабиринта.
Тестовые случаи и демо
Следующие тестовые примеры - или любой другой ввод - могут быть протестированы в этом jsFiddle .
1. Input : ""
Output : 1
Comment: Pac-Man just advances to the first junction, eats the Pac-Dot on it and stops.
2. Input : "L"
Output : 7
3. Input : "FFR"
Output : 13
4. Input : "LFLR"
Output : 17
Comment: Pac-Man will exit on the middle right side and re-appear on the left side.
5. Input : "BBBB"
Output : 2
6. Input : "BRRFFFL"
Output : 15
7. Input : "LFFRLFFFFRF"
Output : 50
8. Input : "BRFRLRFRLFR"
Output : 54
Comment: Pac-Man will exit on the middle left side and re-appear on the right side.
9. Input : "FFLRLFFLLLLFFBFLFLRRRLRRFRFLRLFFFLFLLLLFRRFBRLLLFBLFFLBFRLLR"
Output : 244
Comment: All cleared!
источник
Ответы:
Pyth,
356345 + 1 = 346 байтКод содержит некоторые непечатаемые, так что вот обратимый
xxd
hexdump.Требуется
-M
флаг для отключения памятки. К сожалению, это не может быть сделано ни одним онлайн-исполнителем, о котором я знаю.Вот
читаемаяверсия ASCII для печати:объяснение
Это очень большая работа, поэтому я пока не буду публиковать полное объяснение.
По сути, программа представляет плату в виде (несколько странного) графа, используя пять справочных таблиц: 2 для подключения, 1 для направления соединения и 2 для подсчета точек. Он был построен на 200-строчном скрипте Python, на котором я потратил слишком много часов. Затем программа просто просматривает ввод и подсчитывает точки, обновляя таблицы точек до нуля по мере того, как точки собираются.
СДЕЛАТЬ:
источник
к, 264 байта
Шестнадцатеричный дамп:
Двоичные данные в конце кодируют два массива:
a
состоит из пар байтов, каждый из которых представляет (направление 64 *) + junctionIdb
число точек Пакмана между каждой парой соединений вa
Программа читает собственный исходный файл (
p.k
) и декодирует данные.Входные данные поступают из стандартного ввода и используют 0x00,0x01,0x02,0x03 (он же NUL, SOH, STX, ETX - первые четыре кода ASCII) вместо FLBR.
Я использую свою собственную реализацию k, которая ограничена, раздута, аварийна и медленна по сравнению с реальной вещью . Я тестирую с помощью следующей программы:
источник