Ters Mühendis Braketi Dikdörtgenleri


24

Her programcı dikdörtgenlerin gerçekten eğlenceli olduğunu bilir . Bu eğlenceyi alevlendirmek için, bu sevimli ve bulanık diyagramlar iç içe parantez gruplarına dönüştürülebilir.

Bu meydan okuma önceki yorumumun tersidir .

Diyelim ki şöyle bir grup birbirine bağlı dikdörtgen var:

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

Ek Notlar:

  • Hiçbir zaman iki +saniye yan yana gelmeyecek
  • İki dikdörtgen hiçbir zaman bir kenarı veya köşeyi paylaşmaz
  • Her sütunda yalnızca en fazla bir dikey kenar olacak

İlk adım, herhangi bir dikdörtgenin en sol köşesine bakmaktır. Dört dirsek tipinden birini atayın ({[<. Seçtiğim [.

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

Şimdi en soldaki ikinci dikdörtgene bakın. Bir [dikdörtgene bindiği için farklı türde olmalıdır. Seçtiğim (.

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

Bir sonraki en soldaki dikdörtgen, önceki herhangi bir dikdörtgene kesişmez, ancak önceki içine yuva yapar. (Tekrar atamayı seçtim . Normalde, mümkünse iç içe yerleştirdiği ile aynı türde bir dikdörtgen atamak iyi bir tahmindir, ancak bazen geri izleme gerekir.

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

Bu sonraki dikdörtgen [tekrar atanabilir .

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

Bir sonraki dikdörtgen çok eğlenceli. Bu a hem kesişiyor (ve bir [ben bir de diyebiliriz bu yüzden, dikdörtgen {dikdörtgen (veya <ama kimse o seviyor).

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

Son iki dikdörtgen o kadar da kötü değil. Herhangi iki farklı tipte olabilirler.

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

Dikdörtgenleri okurken anlıyorum [(]([{))}]<{}>. Bu, yukarıdaki giriş için olası bir çıkış olacaktır. Kapsamlı olmayan pek çok olası seçenek listesi:

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

Giriş

ASCII-art, açık oldukları varsayımları üzerinde dikdörtgenleşir (yukarıdaki notlara bakınız) ve uygun şekilde bir parantez dizisine dönüştürülebilir. İsteğe bağlı izlemeli yeni satırlı bir boşluk bırakmadığınızı veya bir dikdörtgene dolgulu olduğunuzu varsayabilirsiniz. Önde gelen bir boşluk olmayacak.

Çıktı

Geçerli köşeli parantezlerin herhangi biri, dikdörtgenlerin kesişme kısıtlamalarına uyandır. İsteğe bağlı izleyen bir yeni satır dışında, parantez dışında başka karakter olmamalıdır. Ana kural, eğer iki kare kesişirse, o zaman farklı braket tiplerine atanmaları gerekir.

Hedef

Bu kod golf, kalite üzerinde (eksik) miktardır.


3
FYI "alevlendirmek", "daha kötü bir şey yapmak" anlamına gelir.
Paul R

@ PaulR Ben bu nokta olduğuna inanıyorum
kedi

Oh, tamam, açıkça neyin nesi olduğu doğrudan kafamdan geçti!
Paul R

Her dikdörtgen varsayabiliriz sahip bazı yüksekliğe? yani bir +sol üst köşesine sahip olamaz ve sonra sol alt köşesinde (hemen altında) +?
Tersosauros

Yanıtlar:


2

Python 3, 519 bayt

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

İşte bir çözüm için ilk girişimi. Kullanılan algoritma, şemadaki köşelere yalnızca bakar, bir sütunda sadece bir dikey çizginin olabileceği gerçeğini kötüye kullanır ve bu nedenle, bir sütundaki ilk ve son + bir dikdörtgenin köşeleri olmalıdır. Daha sonra, tüm dikdörtgenleri toplar ve çarpışmayan gruplar için saf (ve biraz özgün olmayan) bir arama yapar. Bunun her zaman en uygun çözümü bulacağından emin değilim, ancak şimdiye kadar denedim tüm örnekler için işe yaradı. Alternatif olarak, en az miktarda grup için kaba kuvvet aramasıyla değiştirilebilir.

Giriş: ascii sanatını içeren bir dize. Sondaki yeni satır yok ve tüm satırlar boşluk kullanılarak aynı uzunlukta doldurulmalı. Ayrıca köşelerden tam olarak bakıldığında | ya da işaretlerini içeri sokmamanız da tamamen iyi.

Golf oynamak oldukça basit olduğu için (sadece boşlukları en aza indirgemek ve çoğunlukla yeniden isimlendirmek değişken) muhtemelen daha kısa olabilirdi, fakat bununla ilgili başka bir cevap olmadığı için şimdilik bunu böyle bırakacağım.


Ödül aldın, çünkü <1 günde başka cevap beklemiyorum. Cevap verdiğiniz için teşekkürler, golf oynamaya devam edin!
Rɪᴋᴇʀ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.