完整的括号表达式


11

今天,您面临的挑战是生成表达式的所有可能的完整括号。

您的输入是一行可打印的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

@Optimizer我列出了被视为运算符的确切正则表达式。!适合正则表达式,所以也适合,但是不能作为输入的一部分,因为它不是可打印的ASCII。
orlp 2015年

啊好吧。因此,除了术语外,其他任何东西都是运算符...
Optimizer

那么,术语和运算符总是一个字符长吗?
user81655

1
在此处插入与LISP相关的强制性双关语

Answers:


2

Pyth,38个字节

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

在线尝试。

它定义了一个递归函数:

  • 如果输入的长度为1,则返回输入
  • 接受运算符的所有两个输入分割,对于每个分割:
    • 在每个半部分上递归调用自身
    • 取各一半结果的笛卡尔积
    • 在拆分时将运算符的每个结果合并
    • 用括号括起来的结果
  • 最后连接结果数组。

然后使用删除了空格的输入字符串调用该函数,并用换行符连接结果。


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... ]并将两个连续的每一对都用括号括起来,[ (tot), o, etc... ]然后重复此过程,直到数组中只有一个元素为止,然后滤除重复的值。

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

测试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.