Кустарники и Smoles - Часть I


10

Настройка

Рассмотрим коробку странной формы, содержащую 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 ). Может быть заявлен только один множитель.

В конце концов, это спокойный мир. ;)


2
+1 за спецификацию, но я не буду участвовать, вероятно.
Джон Дворжак

Это звучит как веселье. Просто чтобы убедиться: форма коробки полностью фиксирована, да? Таким образом, мы не должны учитывать любые другие формы?
Инго Бюрк

@ IngoBürk: правильно. Форма коробки фиксирована.
COTO

Для вывода изображения, можем ли мы использовать ваше изображение в качестве ресурса (или какого-либо другого ресурса) или нам нужно рисовать его целиком в коде? Если мы можем использовать это, как это считается? Я постараюсь попробовать, но я сейчас в отпуске.
Инго Бюрк

1
Вы можете использовать внешние графические ресурсы (например, изображения, разметку SVG), если вы включаете их количество байтов в общую сумму для программы. Основной образ не должен быть ужасно сложным. 12 линий, составляющих сетку; стена; и цветные коробки внутри коробки. Если вы предпочитаете, цветная рамка может заполнить всю ячейку сетки, и стена может проследить точно вдоль границы самых внешних ячеек. Таким образом, всю картину можно определить, нарисовав прямоугольники, линии и ломаную линию на квадратной координатной сетке 6x6.
COTO

Ответы:


2

MATLAB, пока еще не одураченный * 0,15

Было бы здорово, если бы кто-то рискнул догадаться, правильно ли это работает.

n = @()input('', 's');
E = @()fprintf('!');
M = zeros(7,9);
G = M;
I = [9:7:44 17:7:52 18:7:46 12:7:47 20:7:55];
M0 = M;
M0(I) = 1;
M([I 49]) = 1;
G(I) = n()-46;
trot = 0;
Xtr = [0 1-10i 11-7i 8+i];
X0 ='c66++66++oozzoozzn'-i*'YYNNAA--  ++88LLYY'-22+22i;
for a = [97 n()]
    a = find('-|+a^<v>'==a);
    if a<5
        R = @(m) rot90(m, a);
        G = R(G);
        [nr,nc] = size(G);
        M = R(M);
        M0 = R(M0);
        trot = mod(trot+a,4);
        X = exp(i*pi*trot/2)*X0 + 11*Xtr(trot+1);
    else
        z = find(G==18);
        J = z + [-nr,1]*[0,-1;1,0]^(trot+a)*[1;0];
        if ~M0(J) | G(J) | G(z+1)
            E();return
        end
        G(z) = 0;
        G(J) = 18;
    end
    fall = 1; 
    while fall
        clf
        plot(X/11,'k','LineW',3);
        for x = 2:nc; for y = 2:nr
             ch = G(y,x);
             if M0(y,x) 
                 rectangle('Po',[x,-y,1,1],'F',~ch|ch==[74 1 65]);
             end
        end;end
        pause(1);
        G2 = G;
        for r = nr-1:-1:2
            s = G2 > 30;
            f = G2(r,:) .* (s(r,:) & ~s(r+1,:) & M(r+1,:) & G(r+1,:)~=18);
            if r==size(G,1)-1 & any(f==74)
                E();return
            end
            G2(r:r+1,:) = G2(r:r+1,:) + [-f;f];
        end
        G2 = G2 .* M0;
        fall = any(any(G2 ~= G));
        G = G2;
    end 
end

Пример конечного результата для некоторых случайных ходов:

.........@...o....ooo..xox...
+>|<-v+^+

введите описание изображения здесь


1
Не могли бы вы показать GIF-анимацию?
Мартин Эндер

Круто! Я проверю это этим вечером (и выложу несколько тестовых случаев).
COTO

Программа не требует вывода анимированного .gif, но если вы хотите сгенерировать его, feersum, эта статья объясняет, как это легко сделать.
COTO
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.