Сміли і Смоли - частина I


10

Налаштування

Розглянемо незвичайну форму, що містить 29 пронумерованих комірок, як показано на рис. 1 нижче.

шумить і смалить

Всередині цього двовимірного ящика знаходяться два види тварин квадратної форми: шматки та смоли. На рис. 1 (а) показані деякі міхури синього кольору, а деякі смоли червоного кольору. Кожна істота займає рівно одну сітку комірки. У коробці може міститися від 0 до 26 шум, але завжди буде рівно два смоли.

Піддаючись тяжкості, шматки і смоли сидять на дні коробки, укладаючи зверху все, що під ними. Обидва види є винятково ледачими і постійно залишаються нерухомими.

У коробці також є сотня, зображена як чорний квадрат, який займає рівно одну сітку комірки. Сотня не підлягає гравітації.

У коробці є одне отвір, розташоване в нижній частині комірки 28, як зображено на малюнку.

Щоб зобразити конфігурацію шублів, смолів та сотень у полі текстово, ми використовуємо рядок із 29 символів, один символ на комірку сітки, в перерахованому порядку із .поданням порожньої комірки, що oпредставляє собою шуб, що xпредставляє собою smole, і @представляє сотню. Наприклад, конфігурація фіг. 1 (a) представлена ​​рядком .........@...o....ooo..xox....

Маніпуляції

Короб можна обертати будь-яким кратним на 90 °. Під час обертання ящика, камінчики та смоли залишаються нерухомими всередині осередків сітки. Як тільки обертання завершено, вони не потрапляють безпосередньо вниз , поки або я ) вони блокують нижче стінки, б ) вони блокують shubble, Smole або STOT нижче, або III ) вони потрапляють через отвір в камері 28 і вийти з поля. Сотня не падає; він залишається нерухомим у своїй поточній комірці, навіть якщо істоти опираються на ньому.

Коробку не можна повертати знову, поки істоти не впадуть і не набули нової стабільної конфігурації.

Текстуально обертання коробки позначають +для обертання на 90 ° за годинниковою стрілкою, |для обертання на 180 ° і -для 90 ° обертання проти годинникової стрілки.

Крім того, сотня може переміщуватися в чотирьох напрямках компаса з кроком однієї комірки сітки. Переміщення може не: i ) спричинити зіткнення між сотнею та істотою (тобто комірка сітки призначення повинна бути порожньою); ii ) спричинити зіткнення між сотнею та стіною, а також iii ) змусити сотню вийти з коробки через отвір у комірці 28.

Крім того, сотня може не рухатися, якщо на ній лежать якісь істоти (щодо сили тяжіння струму).

Текстуально сто ходів позначається <ліворуч, >праворуч, ^вгору та vвниз. Рухи стота завжди задаються щодо "стандартного" (не обертового) кадру, зображеного на малюнках. Тобто, якщо сотня знаходиться у комірці 10, переміщення ^завжди перемістить її у комірку 5, а переміщення >завжди перемістить її до комірки 11. Орієнтація поля не впливає на напрямок руху.

Послідовності маніпуляцій кодуються за допомогою символьних рядків зліва направо. Наприклад, рядок +<<^-вказує, що ящик повертається за годинниковою стрілкою на 90 °, потім стот переміщується вліво двічі вгору (стосовно стандартного кадру), потім коробку повертають на 90 ° проти годинникової стрілки назад в початкову орієнтацію.

Змагання

З цілком поважних причин (які я не можу розкрити) ми хочемо витягнути всі шматки з коробки, не видаляючи жодного смоля. Для цього ми можемо скористатися описаними вище маніпуляціями.

Перш ніж вирішити цю проблему, ми змушені моделювати, як наші різні маніпуляції впливатимуть на вміст коробки, що є фокусом цього завдання.

Ви повинні написати програму, яка приймає два аргументи stdin(або еквівалент):

  • рядок, що описує початковий стан поля
  • послідовність маніпуляцій

Ви можете припустити, що обидва аргументи синтаксично справедливі, що поле починається у стандартній орієнтації та що початковий стан поля є стабільним та законним.

Програма повинна виводити stdout(або еквівалент) або:

  • ( випадок 1 ) остаточний стан поля, виражений рядком, якщо послідовність рухів є законною (вона не порушує сотень правил переміщення) і не спричиняє жодного смола виходу з поля. Кінцева орієнтація коробки неважлива.

  • ( випадок 2 ) єдиний знак оклику !, якщо послідовність рухів незаконна або змушує будь-який смол вийти з поля

Оцінка балів

Переможна програма - це найкоротша програма за кількістю байтів , за умови надзвичайно вигідних бонусних множників:

  • вимагають множника 0,65, якщо замість друку кодованого виводу для випадку 1 програма виводить ASCII зображення поля в його остаточному стані та орієнтації, використовуючи символи spec для міхурових, смол, статистичних та порожніх комірок, і розміщуючи *у комірці просто поза отвором у комірці 28. Провідна та відстала пробіли ігноруються.

    Наприклад, якщо фіг. 1 (a) повернутий на 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 ліній, що складають сітку; стіна; і кольорові коробки всередині коробки. Якщо ви віддаєте перевагу, кольоровий ящик може заповнити цілу клітинку сітки, і стіна може простежити точно вздовж кордону самих зовнішніх комірок. Таким чином, всю картину можна визначити, намалювавши прямокутники, лінії та полілінію на квадратній координатній сітці 6х6.
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.