Згладьте програму Stack Cats


13

Stack Cats - це оборотна мова на основі стека. Його оборотна природа спричиняє дещо дивні петлі. Ця виклик стосується умовного циклу (...). Коли ці петлі вкладені певними способами, можна перетворити код, щоб зменшити глибину введення. Ось правила (де Aі Bстоять довільні фрагменти):

  1. Коли одна петля починається з іншої петлі, ми можемо витягти внутрішню петлю спереду: ((A)B)стає (A)(B).
  2. Коли одна петля закінчується іншою петлею, ми можемо витягти внутрішню петлю до кінця: (B(A))стає (B)(A).
  3. Порожні петлі, ()можна повністю видалити з програми. Як наслідок (спільно з іншими правилами), ((A))рівнозначний (A).

Єдині вкладені цикли , які залишаться мають вигляд (A(B)C), де A, Bі Cне пустили.

Змагання

Вам надана дійсна програма Stack Cats, і ваше завдання - максимально знизити рівень вкладення петель, не залишаючи порожніх циклів, використовуючи перераховані вище перетворення.

Дійсна програма Stack Cats ...

  • ... складається лише з персонажів ()/\<>[]{}!"*+-:=ITX^_|.
  • ... має дзеркальну симетрію (наприклад \(]{}!{}[)/, це дійсна програма, але /|/це не так).
  • ... правильно підібрано та вкладено ()та {}( [], <>і \/не обов'язково їх потрібно узгоджувати, як зазвичай, хоча вони з'являтимуться парами через вимогу симетричності дзеркала).

Ви можете взяти або рядок, або список символів, як вхідні дані, але вихід повинен бути представлений у тому ж форматі.

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

Це , тому найкоротший вірний відповідь - вимірюється в байтах - виграє.

Випробування

Тестові приклади - це два рядки кожен (вхід і вихід), розділені порожніми рядками. Зауважте, що один вихід порожній. Вам також потрібно підтримати порожній вхід (що має призвести до порожнього виводу).

(((=+|+=)))
(=+|+=)

({(=+|+=)})
({(=+|+=)})

((\)/)I(\(/))
(\)(/)I(\)(/)

(()()(())()())


((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)

Напевно, петлі, які ми маємо витягнути, позначаються лише дужками (), тому вхід {{A}B}залишиться таким, який є, і не буде вилучений {A}{B}також?
Кевін Кройсейсен

@KevinCruijssen Так, перетворення справедливе лише для (...)циклів -type.
Мартін Ендер

На завершення тестового випадку, чому \^/всередині дужок?
Кевін Кройсейсен

1
@KevinCruijssen Це найбільш віддалені дужки після вилучення (<|>((X((T)))[_]))та (([_](((T))X))<|>).
Мартін Ендер

1
А, бачу. Так ((A)B(C))стане згодом (A)(B)(C)обома правилами 1 і 2 згодом: ((A)B(C))(A)(B(C))(правило 1) → (A)(B)(C)(правило 2).
Кевін Кройсейсен

Відповіді:


6

Сітківка 0.8.2 , 113 107 67 66 байт

+`\(\)|(\()?(\(((\()|(?<-4>\))|[^()])*(?(4)@)\))(?(1)|(\)))
$5$2$1

Спробуйте в Інтернеті! Включає збереження 3 байтів завдяки @MartinEnder. Пояснення:

+`

Неодноразово застосовуйте заміну, поки не буде збігів.

\(\)|

З'єднайте порожній цикл (у такому випадку нічого не зафіксовано, тому заміна просто видаляє його) або:

(\()?

Необов’язково відповідати а (. Це фіксується у групі 1, якщо вона збігається, але ні, якщо вона не відбулася.

(\(

Захопіть основну частину матчу у групі 2 та збігніть a (.

(
 (\()
|
 (<-4>\))
|
 [^()]
)*

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

(?(4)@)

Переконайтесь, що в групі 4 не залишилося запасних знімань.

\))

Кінець групи захоплення 2 іншою ).

(?(1)|(\)))

Якщо група захоплення 1 була порожньою, тоді захопіть )групу захоплення 5. (Отже, саме одна з цих двох груп матиме захоплення).

$5$2$1

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


2

Stax v1.0.3 +, 76 65 64 62 58 байт CP437

îÜ•$o,Γ{í]Üf╒9♦╛üΣóç*\$ñ₧└ΦJ♠¥c╥jóu≥3E.╘ⁿ◄◘W₧<¶┼7úê╟┴zç↨aG

70 байт при розпакуванні,

{{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Md}X!:Rx!:Rc.()z:rgp

Запустити та налагодити онлайн!

Пояснення

{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Mdце блок, який розділяється A((B)C)Dна чотири частини і перетворює його в A(B)(C)D.

X!:Rx!:Rвиконує блок на вхідній рядку (крок 1), потім відображає рядок (відображення рядка в Stax відноситься до обертання рядка плюс заміни (перекладу) (<[{/на (до) \}]>)) і виконує блок на отриманій рядку, а потім відображає її назад (крок 2). Крок 2 по суті переходить (A(B))до (A)(B).

c.()z:r видаліть усі порожні петлі (крок 3).

gpявляє собою генератор, який знаходить точку фіксації ітерації. У цьому випадку рядок повторюється 3-кроковим процесом, поки він більше не змінюється.

Неявний вихід.


1

Пітон 3 , 226 223 212 206 байт

Гаразд, ось спроба вирішити це мовою, яка не підтримує рекурсивний регулярний вираз.

lambda s:g(g(s,*'()'),*')(').replace('()','')
def g(s,t,u):
 m,*a={},;i=v=0
 for c in s:
  i+=1;a+=[i]*(c==t)
  if c==u:*a,x=a;m[x]=i;v=m.get(x+1)
  if v:return g(s[:x]+s[x+1:v]+t+s[v:],t,u)
 return s[::-1]

Спробуйте в Інтернеті!

Зміни:

  • Refactored , [::-1]щоб зберегти 6 байт, завдяки Mr.Xcoder.

gФункція є основним будівельним блоком, який знаходить входження ((A)B), змінює її (A)(B), а потім застосовує себе до результату , поки не більше перетворення не можливо.

Основні кроки:

  • Застосовуйте gдо вводу нормально.
  • Застосувати gдо входу, перевернутий. Цей запуск виявляє виникнення ))A(B(в зворотному вході, який ефективно обробляє (A(B)).
  • Видаліть будь-яке виникнення ().

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.