Kỹ sư hình chữ nhật ngược


24

Mọi lập trình viên đều biết rằng hình chữ nhật thực sự thú vị. Để làm trầm trọng thêm niềm vui này, những sơ đồ dễ thương và mờ này có thể được chuyển thành các nhóm dấu ngoặc đan xen.

Thử thách này là nghịch đảo trước đây của tôi .

Giả sử bạn có một nhóm các hình chữ nhật lồng vào nhau như vậy:

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

Ghi chú bổ sung:

  • Không có hai +s sẽ không liền kề
  • Không có hai hình chữ nhật sẽ chia sẻ một cạnh hoặc góc
  • Sẽ chỉ có tối đa một cạnh dọc trong mỗi cột

Bước đầu tiên là nhìn vào cạnh trái của bất kỳ hình chữ nhật nào. Chỉ định nó một trong bốn loại khung ({[<. Tôi chọn [.

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

Bây giờ hãy nhìn vào hình chữ nhật bên trái thứ hai. Vì nó chồng lên một [hình chữ nhật, nó phải thuộc loại khác. Tôi chọn (.

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

Hình chữ nhật bên trái nhất tiếp theo không giao nhau với bất kỳ hình chữ nhật trước, nhưng không lồng trong hình trước đó. Tôi chọn gán nó (một lần nữa. Thông thường, một dự đoán tốt để gán một hình chữ nhật cùng loại với những gì nó được lồng bên trong nếu có thể, nhưng đôi khi cần quay lại.

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

Hình chữ nhật tiếp theo này có thể được chỉ định [lại.

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

Hình chữ nhật tiếp theo này là một niềm vui. Nó giao nhau cả a ([hình chữ nhật, vì vậy tôi có thể gọi nó là {hình chữ nhật (hoặc <không ai thích chúng).

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

Hai hình chữ nhật cuối cùng không phải là xấu. Chúng có thể thuộc bất kỳ hai loại khác nhau.

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

Đọc ra các hình chữ nhật, tôi nhận được [(]([{))}]<{}>. Đây sẽ là một đầu ra có thể cho đầu vào trên. Đây là danh sách nhiều tùy chọn có thể, không đầy đủ:

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

Đầu vào

Các hình chữ nhật nghệ thuật ASCII, trên các giả định rằng chúng không rõ ràng (xem ghi chú ở trên) và có thể được chuyển đổi chính xác thành một chuỗi dấu ngoặc. Bạn có thể giả sử không có dấu cách hoặc được đệm vào một hình chữ nhật, với dòng mới tùy chọn. Sẽ không có khoảng trắng hàng đầu.

Đầu ra

Bất kỳ một trong các chuỗi khung hợp lệ tuân theo các giới hạn giao nhau của các hình chữ nhật. Khác với một dòng mới tùy chọn, không nên có ký tự nào khác ngoài dấu ngoặc. Nguyên tắc chính là, nếu hai hình vuông giao nhau, thì chúng nên được gán các loại khung khác nhau.

Mục tiêu

Đây là mã golf, (thiếu) số lượng so với chất lượng.


3
FYI "làm trầm trọng thêm" có nghĩa là "làm cho một điều tồi tệ trở nên tồi tệ hơn".
Paul R

@PaulR Tôi tin rằng đó là điểm chính
con mèo

Ồ, được rồi, rõ ràng bất kể điểm nào là nó đi thẳng qua đầu tôi!
Paul R

Chúng ta có thể giả sử rằng mỗi hình chữ nhật một số chiều cao? tức là nó không thể có +góc trên bên trái, và sau đó (ngay bên dưới) +cho góc dưới bên trái?
Tersizardos

Câu trả lời:


2

Python 3, 519 byte

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

Đây là một nỗ lực đầu tiên tại một giải pháp. Thuật toán được sử dụng hoàn toàn nhìn vào các góc trong sơ đồ, lạm dụng thực tế chỉ có một đường thẳng đứng có thể xảy ra trong một cột, và do đó, đầu tiên và cuối + trong một cột phải là các góc của hình chữ nhật. Sau đó, nó thu thập tất cả các hình chữ nhật và thực hiện tìm kiếm ngây thơ (và có phần không đặc biệt) cho các nhóm không va chạm. Tôi không chắc chắn nếu điều này sẽ luôn tìm ra giải pháp tối ưu nhất, nhưng nó đã làm việc cho tất cả các ví dụ tôi đã thử cho đến nay. Ngoài ra, nó có thể được thay thế bằng một tìm kiếm vũ phu cho số lượng nhóm ít nhất.

Đầu vào: một chuỗi chứa nghệ thuật ascii. Không có dòng mới, và tất cả các dòng phải được đệm theo cùng một chiều dài bằng cách sử dụng khoảng trắng. Nó cũng hoàn toàn tốt với bạn khi không đặt bất kỳ cái nào trong số đó vì nó chỉ nhìn vào các góc.

Vì việc chơi golf khá đơn giản (chỉ tối thiểu hóa khoảng trắng và đổi tên chủ yếu) nên có thể ngắn hơn, nhưng vì không có câu trả lời nào khác về điều này cho đến bây giờ tôi sẽ để nó như thế này.


Bạn nhận được tiền thưởng, vì tôi không thấy bất kỳ câu trả lời nào khác trong <1 ngày. Cảm ơn đã trả lời, tiếp tục chơi golf!
Rɪᴋᴇʀ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.