ย้อนกลับวงเล็บเหลี่ยมวิศวกร


24

โปรแกรมเมอร์ทุกคนรู้ว่ารูปสี่เหลี่ยมสนุกจริงๆ เพื่อทำให้ความสนุกทวีความรุนแรงมากขึ้นแผนภาพที่น่ารักและคลุมเครือเหล่านี้สามารถเปลี่ยนเป็นกลุ่มของวงเล็บสาน

ความท้าทายนี้เป็นสิ่งที่ตรงกันข้ามของฉันก่อนหน้านี้

สมมติว่าคุณมีกลุ่มของรูปสี่เหลี่ยมผืนผ้าที่เชื่อมต่อกันดังนี้

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

หมายเหตุเพิ่มเติม:

  • จะไม่มีสองคน+ติดกันเลย
  • จะไม่มีรูปสี่เหลี่ยมผืนผ้าสองอันที่แบ่งปันขอบหรือมุม
  • จะมีได้ไม่เกินหนึ่งแนวตั้งในแต่ละคอลัมน์

ขั้นตอนแรกคือดูที่ขอบซ้ายสุดของสี่เหลี่ยมใด ๆ ({[<กำหนดให้หนึ่งในสี่ประเภทวงเล็บ [ฉันเลือก

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

ตอนนี้ดูที่สี่เหลี่ยมผืนผ้าซ้ายสุดที่สอง เนื่องจากมันซ้อนทับ[สี่เหลี่ยมผืนผ้ามันจะต้องเป็นประเภทที่แตกต่างกัน (ฉันเลือก

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

สี่เหลี่ยมที่อยู่ซ้ายสุดถัดไปจะไม่ตัดกับสี่เหลี่ยมที่ผ่านมา แต่จะซ้อนกันภายในสี่เหลี่ยมที่ผ่านมา ฉันเลือกที่จะมอบหมาย(อีกครั้ง โดยปกติจะเป็นการดีที่จะกำหนดสี่เหลี่ยมประเภทเดียวกันกับสิ่งที่มันซ้อนอยู่ข้างในถ้าเป็นไปได้ แต่บางครั้งจำเป็นต้องมีการย้อนรอยกลับ

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

สี่เหลี่ยมถัดไปนี้สามารถกำหนดได้[อีกครั้ง

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

สี่เหลี่ยมต่อไปนี้สนุกดี มันตัดกันทั้ง a (และ[สี่เหลี่ยมดังนั้นฉันจึงเรียกมันว่า{สี่เหลี่ยม (หรือ<แต่ไม่มีใครชอบอันนั้น)

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

รูปสี่เหลี่ยมผืนผ้าสองอันสุดท้ายนั้นไม่เลว พวกเขาสามารถเป็นสองประเภทที่แตกต่างกัน

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

[(]([{))}]<{}>การอ่านออกสี่เหลี่ยมที่ผมได้รับ นี่จะเป็นหนึ่งเอาต์พุตที่เป็นไปได้สำหรับอินพุตด้านบน นี่คือรายการของตัวเลือกที่เป็นไปได้มากมายไม่ใช่อย่างละเอียด:

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

อินพุต

ASCII-art rectangles บนสมมติฐานที่ว่ามันไม่คลุมเครือ (ดูหมายเหตุด้านบน) และสามารถแปลงเป็นสตริงของวงเล็บปีกกาได้อย่างเหมาะสม คุณอาจสันนิษฐานว่าไม่มีช่องว่างต่อท้ายหรือเพิ่มเบาะสี่เหลี่ยมโดยมีบรรทัดใหม่ต่อท้ายที่เป็นตัวเลือก จะไม่มีช่องว่างชั้นนำ

เอาท์พุต

ใด ๆ ของสตริงวงเล็บเหลี่ยมที่ถูกต้องที่เป็นไปตามข้อ จำกัด ทางแยกของสี่เหลี่ยม นอกเหนือจากบรรทัดใหม่ที่เป็นทางเลือกไม่ควรมีอักขระอื่นนอกเหนือจากวงเล็บ กฎหลักคือถ้าสองสแควร์สตัดกันก็ควรกำหนดประเภทของวงเล็บต่าง ๆ

เป้าหมาย

นี่คือ code-golf, (ขาด) ปริมาณมากกว่าคุณภาพ


3
FYI "exacerbate" หมายถึง "ทำให้แย่ลง"
Paul R

@ พอลฉันเชื่อว่านั่นคือประเด็น
แมว

อ๋อโอเคเห็นได้ชัดว่าประเด็นคือตรงไปที่หัวของฉัน!
Paul R

เราสามารถสมมติว่าแต่ละสี่เหลี่ยมมีความสูงได้ไหม คือมันไม่มี+มุมที่ด้านบนซ้ายแล้ว (ด้านล่างทันที) +สำหรับมุมด้านซ้ายล่างใช่ไหม
Tersosauros

คำตอบ:


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

นี่เป็นความพยายามครั้งแรกในการแก้ปัญหา อัลกอริทึมที่ใช้ดูอย่างหมดจดที่มุมในไดอะแกรมการใช้ความจริงเพียงบรรทัดเดียวในแนวตั้งดังนั้นคอลัมน์แรกและสุดท้ายในคอลัมน์จะต้องเป็นมุมของสี่เหลี่ยมผืนผ้า จากนั้นจะรวบรวมสี่เหลี่ยมทั้งหมดและทำการค้นหาที่ไร้เดียงสา (และค่อนข้างไม่เป็นระเบียบ) เพื่อค้นหากลุ่มที่ไม่มีการปะทะกัน ฉันไม่แน่ใจว่าสิ่งนี้จะหาทางออกที่ดีที่สุดเสมอหรือไม่ หรืออาจถูกแทนที่ด้วยการค้นหาแบบ brute-force สำหรับจำนวนกลุ่มที่น้อยที่สุด

อินพุต: สตริงที่มี ascii art ไม่มีการขึ้นบรรทัดใหม่และทุกบรรทัดต้องมีความยาวเท่ากันโดยใช้ช่องว่าง นอกจากนี้ยังเป็นเรื่องที่ดีมากหากคุณไม่ใส่ส่วนใดส่วนหนึ่งของ | ไว้ในนั้นเพราะมันแค่มองมุม

เนื่องจากการเล่นกอล์ฟค่อนข้างง่าย (เพียงแค่การลดขนาดช่องว่างและการเปลี่ยนชื่อตัวแปรเป็นส่วนใหญ่) มันอาจจะสั้นลง แต่เนื่องจากไม่มีคำตอบอื่น ๆ เกี่ยวกับเรื่องนี้ แต่ฉันจะทิ้งมันไว้อย่างนี้


คุณได้รับรางวัลเพราะฉันไม่ได้ละทิ้งคำตอบอื่น ๆ ใน <1 วัน ขอบคุณสำหรับการตอบรับให้เล่นกอล์ฟต่อไป!
Rɪᴋᴇʀ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.