ブラケットをバブルします!


27

このサイトにブラケットのバランス、およびブラケットのバランスの確認に関するいくつかの質問があります。バランスの取れたブラケットを何かに使う時が来たと私は提案します!

数学とプログラミングでは、ブラケットは泡のようなもので、内側のすべてが外側のすべてから隔離されているため、内側のすべてが平和に機能し、外側のすべてが1つのオブジェクトしか見ることができません。ただし、括弧のストリングは1次元ですが、通常、バブルは少なくとも2次元です。つまり、互いに接触したり、他のバブルの内側と外側を交差したりしない限り、バブルは自由に動き回ることができます。

チャレンジ

入力は、round ()、square []、curly、{}またはangleのいずれかの単一タイプの一致した括弧のストリングです<>。プログラムがどの種類を受け入れるかはあなた次第であり、1種類のブラケットのみを受け入れるプログラムは受け入れられます。(プログラムがそれらのいずれかを処理できる場合は架空のボーナス、同じ入力ですべてを処理できる場合は大規模な架空のボーナスポイント)。

出力は、同じ構成のバブルを生成し、2つの同一の文字列を持たないブラケットのすべての可能な再編成(元の入力を含む任意の順序)です。これは、技術的には場所を入れ替えることができる2つのバブルであるにもかかわらず、入力がの()()場合、出力もちょうど()()であることを意味します。大規模な想像上のボーナスの場合、{}[]()当然、入力は6つの異なる要素/文字列/行の出力につながります。

バブルを別のバブルの内側から外側へ、または外側から内側へクロスさせずに、バブルを移動させて一方をもう一方にすることができる場合、2つのバブルの構成は「同じ」です。ネストされた括弧をツリーにたとえると(一致する各ペアは1つのノードであり、その中の一致するすべてのペアはサブノードであり、その中の一致する各ペアは再びそれらのサブノードであり、以下同様)、任意のノードのサブノードが順序付けられます、バブルの単一の構成は、ノードが順序付けられていないツリーです。

文字列のリストまたは単一文字のリストのリストまたは何らかの種類の空白を含む単一文字列を返す、stdoutまたはstderr何らかの形式の表示可能な空白文字(最も一般的には改行またはスペース)各再編成。

各再編成の末尾のスペース、および実際の出力の前後の改行および空のリスト要素の末尾と先行が許可されます。入力で受け入れるのと同じ種類のブラケットを出力で使用する必要があります。ここで指定されている角かっこ、改行、スペース、および使用するセパレータは別として、何も印刷しないでください(不可視/幅ゼロの文字を含む)。

スコアは、コード内のバイト数です。各言語の最低カウントが優先されます。想像上のボーナスを定期的に獲得するか大量に獲得するかは注意できますが、スコアには影響しません。実際のボーナスはあまりにも難しいため、バランスを取ることができません。

入出力の例

例1:

入力:

()(())

出力:

()(())
(())()

例2:

入力:

(()())()()

出力:

(()())()()
()(()())()
()()(()())

例3:

入力:

(()(()))()

出力:

((())())()
()((())())
(()(()))()
()(()(()))

((()))例1で取得できないのはなぜですか?または()()()?各入力の順列が欠落しているようです。
小麦ウィザード

@WheatWizardそれは同じ構成のバブルを与えません:内部に2つの空のバブルを持つ1つの大きなバブル。
アーサー

私が理解している限り、@ WheatWizardは、別のバブルの内側から外側へ、またはその逆にバブルを取ることはできません。
グルゼゴルツプワフスキ

@WheatWizard簡単な説明を追加しました。
アーサー

7
ところで、PPCGへようこそ!素敵な最初の挑戦!
ミスターXcoder

回答:


4

CJam、18バイト

{~{_{{B}%e!}&}:B~}

オンラインでお試しください!

-2 Business Catに感謝します。

のみを含む文字列として入力を受け取ります[]。順列のリストを返します(空のリストはCJamの空の文字列と同じなので、代わりに[]が取得されます"")。


なぜ出力が[][]ちょうど""ですか?-入力を追加のセットで囲む必要があり[]ますか?もしそうなら、なぜ[]前述の例の出力は(おそらく?)周りに余分なセットがありますか?また、質問には「入力で受け入れるのと同じ種類のブラケットを出力で使用する必要があります。ここで指定したブラケット、改行、スペース、および使用するセパレータは別にして、何も印刷しないでください」 Mではないことを確認のミックス[]とは、""許容可能です。
ジョナサンアラン

@JonathanAllanはいはい[][]、追加のペアで囲む必要があると思います[]。他の人にとっては、それらが無効であるかどうかは本当にわかりません。
エリックアウトゴルファー

_{{B}%e!}&代わりにできると思います_!!{{B}%e!}*
ビジネス猫

@BusinessCat &短絡などがありますか?
エリックアウトゴルファー

&他の値が真実である場合にのみブロックを実行します
Business Cat

4

ハスケル227の 210 208 205バイト

import Data.List
l=last
a!x=init a++[l a++[x]]
h[]=[""]
h(x:y)=["("++z++")"++t|z<-v x,t<-h y]
g(a,r)x|x=='('=(a+1,l$(r++h[]):[r!x|a>0])|1>0=(a-1,l$r:[r!x|a>1])
v s=nub$h=<<(permutations.snd$foldl g(0,[])s)

オンラインでお試しください!

これは大変でした!

少しゴルフ

Laikoniのおかげで2バイト節約

ブルースフォルテのおかげで2バイト節約

これがすべての場合に機能するかどうかはわかりません。いくつかの説明:

  • a!xストリングxの最後のリストにストリングを追加しますa(aはタイプです[[String]]

  • snd$foldl(\(a,r)x->if x=='('then(a+1,last$(r++[[]]):[r!x|a>0])else(a-1,last$r:[r!x|a>1])短い条件を使用して、単純なアイデアを表現します:rootで 文字列を分割し)(ます。例えば、"(()(()))()"与える["()(())", ""]

  • 分割の各部分を処理してから、すべての文字列を収集して結合し、正しい出力を取得する必要があります。

    1. hパーツのリストをv処理します。最初のパーツに適用され、結果を残りのパーツのプロセスに結合します。

    2. v 部品の順列ごとに結果を集計し、重複を削除します。

より広いビューを追加するには、基本的に空のノードを持つツリー(バイナリツリーではない)を使用します。残すは()。各ノードのブランチのすべての順列を作成する必要がありますが、ノードからブランチを取得して別のノードに配置することはできません。ある種の深さ優先検索を行いました。


括弧を前後にドロップできますinit a
ライコニ

2

Python 2、 353 350 331バイト

s=input()
f=lambda i,t=0:i+1if t<0else f(i+1,t-1)if"("<s[i+1]else f(i+1,t+1)
c=[(x,f(x))for x in range(len(s))if")">s[x]]
p=lambda l:[[]]if len(l)<1else[x for y in p(l[1:])for x in[y[:i]+[l[0]]+y[i:]for i in range(len(y)+1)]]
print[''.join(x)for x in p([s[c[x][0]:c[x][1]]for x in range(len(c))if all(c[x][1]>y[1]for y in c[:x])])]

文字列を()入力として受け取り、結果を出力します。

ここで試してみてください!

この質問に対するパオロの答えitertools.permutationsから助けを借りて使用することは避けました。

3バイトを見つけてくれたBusiness Catに感謝し、信じられないほどの19バイトをくれたMr. Xcoderに感謝します!

説明

  1. ()入力文字列の各ペアのインデックスのタプルのリストを作成します。
  2. 別の()ペアに囲まれているリストからタプルをドロップします。
  3. 残りのタプルのインデックスで文字列をスライスします。
  4. スライスのリストの各順列のリストを作成します。
  5. リストを印刷用の新しい行に追加します。

削れる可能性のあるバイトがいくつかあります。削除できる空白がいくつかあります。つまり、(のように)のprintような場所で削除i+1 ifできますi+1if。また、あなたが持っている一つの場所でy[0:i]、あなたは0を省略することができます
ビジネス猫

@BusinessCat、ありがとうございます!私のIDEはそれらのいくつかに不満を持っているので、私はまだいくつかのコードゴルフのトリックを学んでいます。
溶媒和

空白を削除するためにいくつかの条件を並べ替えることにより、342バイト(-8バイト)
Mr Xcoder

等しいかどうかの辞書編集比較を使用して340バイト(-10バイト)
氏Xcoder

チャレンジでは文字のリストを返すことができるため、331バイト(-19バイト)。イェイ、私たちはMathematicaを破った:-)
Xcoder氏

2

JavaScript(Firefox 30-57)、222バイト

s=>(g=a=>a+a?[for(x of g(a[0]))for(y of a.keys())for(z of g(a.slice(1)))(z.splice(y,0,x),z)]:[a])(eval(`[${s.replace(/]\[/g,`],[`)}]`)).map(g=a=>`[`+a.map(g).join``+`]`).sort().filter(s=>t<(t=s),t=``).map(s=>s.slice(1,-1))

[]文字列を受け取ります。説明:

s=>(                                Inner function to permute an array
 g=a=>a+a?[                         If array is not empty
  for(x of g(a[0]))                 Permute the first element of the array
  for(y of a.keys())                Generate a list of insertion points
  for(z of g(a.slice(1)))           Permute the rest of the array
  (z.splice(y,0,x),z)]:             Make all possible permutations
  [a]                               Otherwise return a list of an empty array
)(eval(`[${                         Convert the string to a nested array
   s.replace(/]\[/g,`],[`)}]`)      ... inserting commas where necessary
).map(                              Process the results
 g=a=>`[`+a.map(g).join``+`]`       Recursively convert back to string
).sort().filter(s=>t<(t=s),t=``     Check for duplicates
).map(s=>s.slice(1,-1))             Remove outer `[]`s

0

Mathematica、337バイト

コードゴルフポイントを取得するのではなく、 PermutationsDistribute、この問題では。しかし、より良いアプローチがあるかもしれません。

seq:シーケンス、alt:代替)

SetAttributes[alt, {Flat, OneIdentity}]
StringTake[
  StringReplace[ToString[
    ToExpression["{" <> StringReplace[#, "}{" -> "},{"] <> "}"]
        /. List -> Permutations@*seq
       /. List -> alt
      /. seq -> (Distribute[seq@##, alt] &)
     /. {seq -> List, alt -> Alternatives}],
   {", " -> "", "} | {" -> "\n"}],
  {2, -2}] &

中括弧{とを使用して、入力を文字列として受け取ります}。複数行の文字列を出力します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.