Налаштування
Розглянемо незвичайну форму, що містить 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 )
. Може бути заявлений лише один множник.
Адже це дивний світ. ;)