鼓泡括号!


27

这里几个问题,在这个网站如何去平衡支架,并检查是否括号是平衡的。我建议现在是时候将那些平衡的括号用于某些东西了!

在数学和程序设计中,方括号就像气泡,将内部的所有事物与外部的所有事物隔离开,以便内部的任何事物都可以安心地做它的事情,而外部的任何事物只能看到一个对象。但是,一串括号是一维的,而气泡通常至少是二维的。这意味着只要气泡从不相互接触或在任何其他气泡的内部和外部之间交叉,它们就可以自由地在彼此之间移动。

挑战

输入是一串匹配的单一类型的括号,可以是圆形(),正方形[],卷曲{}或尖角<>。取决于您希望程序接受哪种类型,是否接受仅接受一种括号的程序。(如果您的程序可以处理其中的任何一个,则有虚构的奖励;如果它可以在同一个输入中处理所有的它们,则有虚构的奖励点。)尽管括号中可以包含空格,但输入不能包含任何括号。

输出是那些括号的所有可能的重组(以任意顺序,包括原始输入),产生相同的气泡配置,没有两个相同的字符串。这意味着,输入()()为时()(),即使从技术上讲可以交换位置的两个气泡,其输出也只是。对于巨大的想象中的奖金,{}[]()意志的输入当然会导致输出6个不同的元素/字符串/行。

如果您可以通过在周围移动气泡而不让任何气泡从另一个气泡内部到外部或从外部到内部交叉而使另一个气泡相互“形成”,则两种气泡是“相同的”。如果您将嵌套括号比作树(每个匹配对都是一个节点,并且每个匹配对都是一个子节点,并且每个匹配对中又有一个子节点,依此类推),那么给定节点的子节点是有序的,那么气泡的单个配置就是一棵树,其中的节点是无序的。

任何合理的输出格式都可以,例如返回字符串列表或单个字符列表或带有某种空白的单个字符串列表,或者在两者之间使用stdoutstderr以某种形式的可见空白字符(最常见的是换行符或空格)进行打印每个重组。

每次重组的尾随空格以及在实际输出之前和之后的尾随和换行符/空列表元素的位置。您应该在输出中使用与输入相同的括号。除了此处指定的方括号,换行符和空格以及您使用的任何分隔符,均不应打印任何内容(包括不可见/零宽度字符)。

分数是代码中的字节数。每种语言的最低计数获胜。您可能会注意到您是否获得了想象中的奖励,无论是常规奖励还是巨额奖励,但这都不会影响您的分数。实际的奖金太难平衡了。

输入输出示例

范例1:

输入:

()(())

输出:

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

范例2:

输入:

(()())()()

输出:

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

范例3:

输入:

(()(()))()

输出:

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

为什么我们不能得到((()))示例1?还是()()()?似乎您缺少每个输入的排列。
小麦巫师

@WheatWizard不会给出相同的气泡配置:一个大气泡里面有两个空气泡。
亚瑟

据我了解,@ WheatWizard不能将气泡从另一个气泡内部带到外部,反之亦然。
GrzegorzPuławski17年

@WheatWizard我添加了一个小解释。
亚瑟

7
顺便说一句,欢迎来到PPCG!不错的第一个挑战!
Xcoder先生17年

Answers:


4

CJam,18个字节

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

在线尝试!

-2多亏了Business Cat

以仅包含的字符串形式接收输入[]。返回一个排列列表(空列表与CJam中的空字符串相同,因此[]您将获得而不是"")。


为什么输出[][]公正""?-输入是否应该包含在额外的一组中[]?如果是这样,为什么[]在上述示例的输出周围还有(可能是?)呢?还有一个问题指出:“您应该在输出中使用与输入相同的括号。除了此处指定的括号,换行符和空格,以及使用的任何分隔符之外,都不应打印任何内容”,因此我我不确定是否可以将[]和混合使用""
乔纳森·艾伦

@JonathanAllan是的,我认为您需要[][]附加一副[]。对于其他人,我不确定它们是否无效。
暴民埃里克(Erik the Outgolfer)

我想您可以_{{B}%e!}&代替_!!{{B}%e!}*
Business Cat

@BusinessCat &短路还是什么?
Erik the Outgolfer '17

&仅当其他值为真时,才运行该块
Business Cat

4

Haskell中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,节省了两个字节

节省两个字节,感谢Bruce Forte

我不确定这在任何情况下都有效。一些解释:

  • a!x将String添加x到的最后一个String列表中a(a为type [[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])使用较短的条件来表达简单的想法:在 )( s 上拆分字符串。例如"(()(()))()"["()(())", ""]

  • 我们需要处理拆分的每个部分,然后收集并连接所有字符串以获取正确的输出:

    1. h处理零件清单:它适用v于第一部分,并将结果组合到其余零件的过程中。

    2. v 汇总每个部分排列的结果,并删除重复项。

要添加更广泛的视图:您基本上有一棵树(不是二进制树),其中有空节点。请假()。您必须为每个节点生成分支的所有排列,但是您可以不从一个节点获取分支并将其放在另一个节点上。我做了一种深度优先搜索。


您可以在圆括号中加上括号init a
Laikoni

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])])]

接收字符串of ()作为输入并打印结果。

在这里尝试!

我避免itertools.permutationsPaolo的回答这个问题的帮助下使用。

感谢Business Cat找到3个字节,也感谢Xcoder先生提供令人难以置信的19个字节!

说明

  1. ()在输入字符串中创建每对索引的元组列表。
  2. 从列表中删除由另一()对包围的所有元组。
  3. 在其余元组的索引处将字符串切成薄片。
  4. 列出切片列表的每个排列。
  5. 将列表加入新行以进行打印。

我看到一些字节可以刮掉。您有一些空白可以删除,即在(可能是)之后print和之后。此外,在一个地方,你有,你可以省略0i+1 ifi+1ify[0:i]
商业猫

谢谢@BusinessCat!我的IDE抱怨其中一些问题,因此我仍在学习一些高尔夫技巧代码。
溶剂化

342个字节(-8个字节),通过对一些条件进行重新排序以删除空白。
Xcoder先生17年

通过按字典检查比较相等性检查获得340字节(-10字节)
Xcoder先生17年

331个字节(-19个字节),因为质询允许返回字符串列表。
没错

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}] &

使用大括号{和将输入作为字符串}。输出多行字符串。

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.