リバースエンジニアブラケットの長方形


24

すべてのプログラマーは、長方形が本当に楽しいことを知っています。この楽しさを悪化させるために、これらのキュートでファジーな図は、織り込まれたブラケットのグループに変換できます。

この挑戦は私の以前のものの逆です

次のような連動する長方形のグループがあるとしましょう:

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

その他の注意事項:

  • 2つ+が隣接することはありません
  • 2つの長方形がエッジやコーナーを共有することはありません
  • 各列に垂直方向のエッジは最大で1つしかありません

最初のステップは、長方形の左端を調べることです。4つのブラケットタイプのいずれかに割り当てます({[<。を選択します[

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

次に、左から2番目の長方形を見てください。[長方形と重なるため、異なるタイプである必要があります。を選択します(

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

次の左端の長方形は前の長方形と交差しませんが、前の長方形内にネストします。(再度割り当てることにしました。通常、長方形は、可能であれば内部にネストしているものと同じタイプを割り当てることが適切ですが、バックトラッキングが必要な場合があります。

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

この次の長方形は[再び割り当てることができます。

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

この次の長方形はちょっと楽しいです。これはa ([長方形の両方に交差するため、長方形と呼ぶことができます{(または<、誰も好きではありません)。

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

最後の2つの長方形はそれほど悪くはありません。任意の2つの異なるタイプを使用できます。

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

長方形を読んで、私は得る[(]([{))}]<{}> これは、上記の入力の1つの可能な出力です。以下は、網羅的ではない多くの可能なオプションのリストです。

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

入力

ASCII-artの長方形。それらは明確であり(上記の注を参照)、括弧の文字列に適切に変換できるという仮定に基づいています。オプションで末尾の改行を使用して、末尾のスペースがないか、長方形に埋め込まれると仮定できます。先行する空白はありません。

出力

長方形の交差制限に従う有効なブラケット文字列のいずれか。オプションの末尾の改行以外には、括弧以外の文字は使用できません。主なルールは、2つの正方形が交差する場合、それらに異なるブラケットタイプを割り当てる必要があることです。

ゴール

これはcode-golfであり、品質に対する量の不足です。


3
参考までに、「悪化」とは「悪いことを悪化させる」ことを意味します。
ポールR

@PaulRそれがポイントだったと思う

ああ、わかりました、明らかにそれがポイントであったことは何でも私の頭の上にまっすぐに行きました!
ポールR

各長方形ある程度の高さあると仮定できますか? つまり+、左上隅にforを使用することはできません。次に(すぐ下に)+左下隅にforを使用できますか?
テルソサウルス

回答:


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

これが解決策の最初の試みです。使用されるアルゴリズムは純粋にダイアグラムの角を調べ、列に1本の垂直線しか発生しないため、列の最初と最後の+は長方形の角でなければなりません。次に、すべての長方形を収集し、衝突のないグループに対して単純な(およびやや非決定的な)検索を実行します。これが常に最適なソリューションを見つけるかどうかはわかりませんが、これまで試したすべての例でうまくいきました。あるいは、最小数のグループに対するブルートフォース検索に置き換えることもできます。

入力:ASCIIアートを含む文字列。末尾の改行はなく、すべての行はスペースを使用して同じ長さにパディングする必要があります。また、コーナーを見るだけで|や-を入れなくても問題ありません。

ゴルフは非常に単純なので(ホワイトスペースの最小化と変数名の変更がほとんど)、おそらく短くなる可能性がありますが、これに関する他の答えはまだないので、このままにしておきます。


私は1日以内に他の答えを予測しないので、あなたは賞金を受け取ります。答えてくれてありがとう、ゴルフを続けてください!
Rɪᴋᴇʀ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.