Прямокутні кронштейни реверсу


24

Кожен програміст знає, що прямокутники - це дійсно весело. Щоб посилити цю забаву, ці милі та нечіткі діаграми можна перетворити на групи переплетених дужок.

Цей виклик є зворотним моїм попереднім .

Скажімо, у вас є така група замикаючих прямокутників так:

   +------------+
   |            |
+--+-+     +----+-+
|  | |     |    | |
|  | | +---+--+ | |
|  | | |   |  | | |
+--+-+ | +-+--+-+-+-+
   |   | | |  | | | |
   |   | | |  | | | |
   |   | | |  | | | |    +-+
   |   +-+-+--+ | | |    | |
   |     | |    | | |  +-+-+-+
   +-----+-+----+ | |  | | | |
         | |      | |  | +-+ |
         | +------+ |  |     |
         |          |  |     |
         +----------+  +-----+

Додаткові нотатки:

  • Жоден два +s ніколи не буде суміжним
  • Жоден два прямокутники ніколи не поділить край чи кут
  • У кожному стовпчику завжди буде щонайменше один вертикальний край

Перший крок - подивитися лівий край лівого прямокутника. Призначте його одному з чотирьох типів дужок ({[<. Я вибираю [.

   +------------+
   |            |
[--+-]     +----+-+
[  | ]     |    | |
[  | ] +---+--+ | |
[  | ] |   |  | | |
[--+-] | +-+--+-+-+-+
   |   | | |  | | | |
   |   | | |  | | | |
   |   | | |  | | | |    +-+
   |   +-+-+--+ | | |    | |
   |     | |    | | |  +-+-+-+
   +-----+-+----+ | |  | | | |
         | |      | |  | +-+ |
         | +------+ |  |     |
         |          |  |     |
         +----------+  +-----+

Тепер подивіться на другий лівий прямокутник. Оскільки він перекриває [прямокутник, він повинен бути іншого типу. Я вибираю (.

   (------------)
   (            )
[--(-]     +----)-+
[  ( ]     |    ) |
[  ( ] +---+--+ ) |
[  ( ] |   |  | ) |
[--(-] | +-+--+-)-+-+
   (   | | |  | ) | |
   (   | | |  | ) | |
   (   | | |  | ) | |    +-+
   (   +-+-+--+ ) | |    | |
   (     | |    ) | |  +-+-+-+
   (-----+-+----) | |  | | | |
         | |      | |  | +-+ |
         | +------+ |  |     |
         |          |  |     |
         +----------+  +-----+

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

   (------------)
   (            )
[--(-]     +----)-+
[  ( ]     |    ) |
[  ( ] (---+--) ) |
[  ( ] (   |  ) ) |
[--(-] ( +-+--)-)-+-+
   (   ( | |  ) ) | |
   (   ( | |  ) ) | |
   (   ( | |  ) ) | |    +-+
   (   (-+-+--) ) | |    | |
   (     | |    ) | |  +-+-+-+
   (-----+-+----) | |  | | | |
         | |      | |  | +-+ |
         | +------+ |  |     |
         |          |  |     |
         +----------+  +-----+

Цей наступний прямокутник можна призначити [заново.

   (------------)
   (            )
[--(-]     +----)-+
[  ( ]     |    ) |
[  ( ] (---+--) ) |
[  ( ] (   |  ) ) |
[--(-] ( [-+--)-)-+-]
   (   ( [ |  ) ) | ]
   (   ( [ |  ) ) | ]
   (   ( [ |  ) ) | ]    +-+
   (   (-[-+--) ) | ]    | |
   (     [ |    ) | ]  +-+-+-+
   (-----[-+----) | ]  | | | |
         [ |      | ]  | +-+ |
         [ +------+ ]  |     |
         [          ]  |     |
         [----------]  +-----+

Цей наступний прямокутник - це щось цікаве. Він перетинає і a, (і [прямокутник, тому я міг би назвати його {прямокутником (або, <але, ніхто їх не любить).

   (------------)
   (            )
[--(-]     {----)-}
[  ( ]     {    ) }
[  ( ] (---{--) ) }
[  ( ] (   {  ) ) }
[--(-] ( [-{--)-)-}-]
   (   ( [ {  ) ) } ]
   (   ( [ {  ) ) } ]
   (   ( [ {  ) ) } ]    +-+
   (   (-[-{--) ) } ]    | |
   (     [ {    ) } ]  +-+-+-+
   (-----[-{----) } ]  | | | |
         [ {      } ]  | +-+ |
         [ {------} ]  |     |
         [          ]  |     |
         [----------]  +-----+

Останні два прямокутники не такі вже й погані. Вони можуть бути будь-яких двох різних типів.

   (------------)
   (            )
[--(-]     {----)-}
[  ( ]     {    ) }
[  ( ] (---{--) ) }
[  ( ] (   {  ) ) }
[--(-] ( [-{--)-)-}-]
   (   ( [ {  ) ) } ]
   (   ( [ {  ) ) } ]
   (   ( [ {  ) ) } ]    {-}
   (   (-[-{--) ) } ]    { }
   (     [ {    ) } ]  <-{-}->
   (-----[-{----) } ]  < { } >
         [ {      } ]  < {-} >
         [ {------} ]  <     >
         [          ]  <     >
         [----------]  <----->

Відчитуючи прямокутники, я отримую [(]([{))}]<{}>. Це був би один можливий вихід для вищевказаного вводу. Ось перелік багатьох можливих варіантів, не вичерпних:

[(]([{))}]<{}>
<(>(<{))}>{()}
{<}[{(]>)}[<>]
any of the 4! permutations of ([{<, you get the idea...

Вхідні дані

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

Вихідні дані

Будь-яка з дійсних дужок, що дотримуються обмежень перетину прямокутників. Окрім необов’язкового останнього нового рядка, не повинно бути ніяких інших символів, крім дужок. Головне правило, якщо два квадрати перетинаються, то їм слід призначити різні типи дужок.

Мета

Це код-гольф, (відсутність) кількості над якістю.


3
FYI "загострювати" означає "зробити гірше".
Пол Р

@PaulR Я вважаю, що це було справа
кішка

О, гаразд, очевидно, що б це не було, це було прямо над моєю головою!
Пол Р

Чи можна припустити, що кожен прямокутник має деяку висоту? тобто у нього не може бути +лівого верхнього кута, а потім (безпосередньо внизу) +для нижнього лівого кута?
Терсосаврос

Відповіді:


2

Python 3, 519 байт

def c(i):
 a,b,c,d={},0,[],{}
 for e in map("".join,zip(*i.split("\n"))):
  if"+"in e:
   f=e.index("+"),e.rindex("+")
   if f in a:j=a.pop(f);d[j]=f+(d[j],len(c));c.append(j)
   else:a[f]=b;d[b]=len(c);c.append(b);b+=1
 g,h={},0
 while d:
  i={list(d)[0]};
  for j,(k,l,m,n)in d.items():
   for(o,p,q,r)in(d[v]for v in i):
    if not(m>r or n<q or k>p or l<o or(q<m<n<r and o<k>l<p)):break
   else:i.add(j)
  for j in i:del d[j];g[j]=h
  h+=1
 s,u=set(),""
 for t in c:u+="[{(<]})>"[g[t]+4*(t in s)];s.add(t)
 return u

Ось перша спроба рішення. Використовуваний алгоритм суто розглядає кути на діаграмі, зловживаючи фактом, у колонці може виникнути лише одна вертикальна лінія, і тому перший і останній + у стовпці повинні бути кутами прямокутника. Потім він збирає всі прямокутники і здійснює наївний (і дещо недетермінований) пошук без зіткнень. Я не впевнений, чи завжди це знайде найоптимальніше рішення, але воно працювало для всіх прикладів, які я намагався до цього часу. Крім того, його можна було б замінити жорстоким пошуком найменшої кількості груп.

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

Оскільки гольф досить простий (мінімізація простору білого простору та перейменування змінних в основному), можливо, це може бути коротшим, але оскільки інших відповідей на це поки немає, я покину його таким.


Ви отримуєте винагороду, тому що я не бачу жодних інших відповідей за <1 день. Дякуємо за відповідь, продовжуйте займатися гольфом!
Rɪᴋᴇʀ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.