完全に括弧で囲まれた式


11

今日、あなたの課題は、式のすべての可能な完全な括弧を生成することです。

入力は、演算子で区切られた1つ以上の用語を含む1行の印刷可能なASCIIです。入力にはスペースも含まれる場合があります。これらは無視する必要があります。用語は[a-zA-Z0-9]、演算子は[^ ()a-zA-Z0-9]です。入力は常に有効であると仮定することができます。

指定された式を完全に括弧で囲むすべての可能な方法を出力し、オプションの末尾の改行で改行で区切られます。

ないでください:

  • 用語を括弧で囲む-演算子の周りのみを括弧で囲みます。
  • 用語を並べ替えます。
  • スペースを出力します。

入出力の例:

N
N

a * b
(a*b)

x_x_0
(x_(x_0))
((x_x)_0)

a * b|c|d
(a*(b|(c|d)))
(a*((b|c)|d))
((a*b)|(c|d))
((a*(b|c))|d)
(((a*b)|c)|d)

バイト単位の最小コードが優先されます。


考慮しなければならない正確な演算子をリストする必要があります。ある!オペレータ?どう
オプティマイザー

@Optimizer演算子と見なされるものの正確な正規表現をリストしました。!正規表現に合う、そうしかし、それは印刷可能なASCIIではないため、入力の一部にすることはできません。
orlp

うん、いいよ。したがって、用語以外は演算子です
オプティマイザー

では、用語と演算子は常に1文字の長さですか?
user81655

1
ここに必須のLISP関連のしゃれを挿入します
cat

回答:


2

Pyth、38バイト

L?tbsmmjj@bdk"()"*y<bdy>bhd:1lb2bjy-zd

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

次の再帰関数を定義します。

  • 長さが1の場合、入力を返します
  • 演算子の入力のすべての2分割を取り、各分割に対して:
    • それぞれの半分で再帰的に自分自身を呼び出します
    • 各半分の結果のデカルト積を取ります
    • 分割で演算子による各結果を結合します
    • 結合された結果を括弧で囲みます
  • 最後に、結果の配列を連結します。

次に、スペースが削除された入力文字列で関数が呼び出され、結果が改行で結合されます。


3

JavaScript(ES6)、208 197バイト

s=>((q=x=>x.map((_,i)=>(a=[...x.slice(0,i*=2),p="("+x[i]+x[++i]+x[++i]+")",...x.slice(i+1)],x[i]?a[1]?q(a):r.push(p):0)))([...s.replace(/ /g,o="")],r=[]),r.map((l,i)=>r.indexOf(l)<i?0:o+=l+`
`),o)

説明

再帰関数を使用して、[ t, o, t, o, etc... ]2つの用語の配列を取得し、2つの用語の各連続ペアを括弧で囲ん[ (tot), o, etc... ]で、配列に要素が1つだけになるまでこのプロセスを繰り返し、重複する値をフィルターで除外します。

s=>(                                  // s = input string
  (q=x=>                              // q = parenthesise array function
    x.map((_,i)=>(
      a=[                             // a = p with parenthesised pair of terms
        ...x.slice(0,i*=2),
        p="("+x[i]+x[++i]+x[++i]+")", // parenthesise and join 2 terms and an operator
        ...x.slice(i+1)
      ],
      x[i]?a[1]                       // make sure the loop is not over
        ?q(a)                         // check next level of permutations
        :r.push(p)                    // add the permutation to the results
      :0
    ))
  )([...s.replace(/ /g,               // remove spaces and parenthesise all expressions
    o="")],                           // o = output string
    r=[]),                            // r = array of result strings
  r.map(                              // filter out duplicates
    (l,i)=>r.indexOf(l)<i?0:o+=l+`
`
  ),o)                                // return o

テスト

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