Настройка
Рассмотрим коробку странной формы, содержащую 29 пронумерованных ячеек, как показано на рис. 1 ниже.
Внутри этой 2D коробки находятся два вида животных квадратной формы: кустарники и копытные. На рис. 1 (а) показано несколько кустарников синим цветом, а некоторые - красным. Каждое существо занимает ровно одну ячейку сетки. Коробка может содержать от 0 до 26 кустарников, но всегда будет содержать ровно два кубика.
Будучи подверженными гравитации, осколки и клубни сидят на дне коробки, укладывая сверху что-нибудь под ними. Оба вида исключительно ленивы и остаются постоянно неподвижными.
Коробка также содержит стот, изображенный в виде черного квадрата, который занимает ровно одну ячейку сетки. Стот не подвержен гравитации.
Коробка имеет одно отверстие, расположенное в нижней части ячейки 28, как показано на фигуре.
Для текстового представления конфигурации блоков, сглаживаний и значений в блоке мы используем строку из 29 символов, по одному символу на ячейку сетки, в перечисляемом порядке, с .
представлением пустой ячейки, o
представляющей шубл, x
представляющей сглаживание, и @
представляющий стот. Например, конфигурация на фиг. 1 (а) представлена строкой .........@...o....ooo..xox...
.
Манипуляции
Коробка может быть повернута на любое кратное 90 °. В то время как коробка вращается, кусты и смолки остаются неподвижными в своих ячейках сетки. Как только вращение завершено, они падают прямо вниз до тех пор, пока либо i ) они не будут заблокированы стенкой внизу, ii ) они не заблокированы опушкой, не смолой или не проложены ниже, или iii ) они не упадут через отверстие в камере 28 и выйдите из коробки. Стот не падает; он остается фиксированным в своей текущей клетке, даже если существа покоятся на нем.
Ящик не может вращаться снова, пока существа не закончат падать и не достигнут новой стабильной конфигурации.
Текстуально повороты бокса обозначаются как +
для поворота на 90 ° по часовой стрелке, |
для поворота на 180 ° и -
для поворота на 90 ° против часовой стрелки.
Кроме того, карусель может перемещаться в четырех направлениях компаса с шагом в одну ячейку сетки. Движение не может: i ) вызвать столкновение между кладом и существом (т. Е. Ячейка сетки назначения должна быть пустой), ii ) вызвать столкновение между кладом и стеной, или iii ) привести к тому, что клад выходит из коробки через дыра в камере 28.
Кроме того, стот может не двигаться, если над ним покоятся существа (относительно текущей силы тяжести).
Текстуально ходы Скотта обозначаются как <
слева, >
справа, ^
вверх и v
вниз. Стеки всегда задаются относительно «стандартной» (не повернутой) рамки, изображенной на рисунках. То есть, если стот находится в ячейке 10, перемещение ^
всегда будет перемещать его в ячейку 5, а перемещение >
всегда будет перемещать его в ячейку 11. Ориентация прямоугольника не влияет на направление перемещения.
Последовательности манипуляций кодируются с использованием символьных строк слева направо. Например, строка +<<^-
указывает, что ящик поворачивается по часовой стрелке на 90 °, затем стоек перемещается влево дважды и вверх один раз (относительно стандартной рамы), затем ящик поворачивается на 90 ° против часовой стрелки в исходное положение.
Соревнование
По вполне веским причинам (которые я не могу раскрыть), мы хотим вытащить все кусочки из коробки, не выбрасывая ни единого сглаза. Для этого мы можем использовать манипуляции, специально описанные выше.
Прежде чем решить эту проблему, нам следует смоделировать, как наши различные манипуляции повлияют на содержимое коробки, которая является целью этой задачи.
Вы должны написать программу, которая принимает два аргумента из stdin
(или эквивалентных):
- строка, описывающая начальное состояние коробки
- последовательность манипуляций
Вы можете предположить, что оба аргумента синтаксически действительны, что блок начинается в стандартной ориентации, и что начальное состояние блока стабильно и допустимо.
Программа должна выводить stdout
(или эквивалентно) либо:
( случай 1 ) конечное состояние блока, выраженное в виде строки, если последовательность ходов допустима (это не нарушает правила перемещения стота) и не приводит к сглаживанию выхода из блока. Окончательная ориентация коробки не имеет значения.
( случай 2 ) один восклицательный знак,
!
если последовательность ходов является недопустимой или приводит к тому, что любые сглазы выходят из поля
счет
Программа-победитель является самой короткой программой по количеству байтов , с учетом некоторых чрезвычайно прибыльных бонусных множителей:
потребуйте множитель 0,65, если вместо печати закодированного вывода для случая 1 программа выводит ASCII-изображение блока в его окончательном состоянии и ориентации, используя специальные символы для стрижек, сглаживаний, смещений и пустых ячеек и помещая
*
в ячейке рядом с отверстием в ячейке 28. Пробелы в начале и конце игнорируются.Например, если рис. 1 (а) повернуть на 90 °, результат будет
. . ..... .o... xo.@. *ooo.. x .
потребуйте множитель 0,22, если вместо печати закодированного вывода для случая 1 программа выводит файл изображения или отображает окно графического интерфейса пользователя с изображением коробки в ее конечном состоянии и ориентации. Картинка должна быть в стиле рис. 1 (а), показывая ячейки сетки, стены и существа / клады, используя цветные прямоугольники.
потребуйте множитель 0,15, если вместо печати закодированного вывода для случая 1 программа выводит анимированное окно .gif или анимированный графический интерфейс, показывающий все промежуточные состояния в симуляции с интервалами в 1 секунду. Применяются те же правила изображения, что и для множителя 0,22. Первый кадр анимации должен отображать начальное состояние симуляции. Кроме того, анимация должна показывать «скрытые» промежуточные состояния, которые
шарики / сглаживания попадают в стабильную конфигурацию по одной ячейке на кадр анимации после поворота
промежуточное повернутое на 90 ° состояние коробки при повороте на 180 °
потребуйте множитель 0.12, если программа создает анимированное .gif или анимированное окно графического интерфейса пользователя указанного выше стиля, но работает со скоростью 20 кадров в секунду и показывает
плавные, непрерывные анимации вращающейся коробки
плавные, непрерывные анимации движения стота и попадания кусочков / смол в устойчивую конфигурацию
Кусочки, падающие через отверстие в ячейке 28, должны быть видны на выходе из коробки и должны полностью исчезнуть наружу. Вы можете выбрать собственное время для анимации, если выполняется не более 1 манипуляции в секунду.
Общий балл floor( base score * multiplier )
. Может быть заявлен только один множитель.
В конце концов, это спокойный мир. ;)