括号顺序按字典顺序


9

挑战来自这里也是在这里

一个ñ括号序列由ñ ( S和ñ )秒。

有效的括号序列定义如下:

您可以找到一种方法来重复擦除相邻的一对括号“()”,直到其变为空为止。

例如,如果(())是有效的括号,则可以在第二和第三位置删除该对(),然后将其变为,然后将其设为空。 )()(不是有效的括号,则在第二和第三位置删除该对后,它将变为)(并且您无法再删除

任务

给定数字n,您需要按字典顺序生成所有正确的括号序列

输出可以是数组,列表或字符串(在这种情况下,每行一个序列)

您可以使用不同的一对括号如{}[]()或开闭标志

  • n = 3

    ((()))    
    (()())    
    (())()    
    ()(())    
    ()()()
    
  • n = 2

    (())
    ()()
    

@JoKing当然可以。我认为这对挑战的主要概念没有任何影响。
路易斯·费利佩·德·耶稣·穆诺兹

恩,我可以想到几种语言,例如eval会对eval进行不同的解释,例如
Jo King

1
相关信息:加泰罗尼亚语数字(该挑战的结果=该挑战的结果行数)
user202729

3
几乎相同,但是有一些奇怪的限制,例如“您可能不会编写递归函数”。/// 此挑战的超集(允许所有Brain-Flak括号)
user202729 '18

“任何开闭符号”的“序列的数组,列表或字符串”是否表示我们可以输出两个整数(例如1s和-1s)的列表的列表?
乔纳森·艾伦

Answers:


8

Perl 6、36字节

{grep {try !.EVAL},[X~] <[ ]>xx$_*2}

在线尝试!

查找所有按字母顺序排序的组合 2n []并过滤EVAL正确的内容。请注意,所有有效组合(甚至是类似的东西[][])的计算[]结果也是(这是错误的,但我们not将(!)与try返回相区别Nil

说明:

{                                  }  # Anonymous code block
                        <[ ]>         # Create a list of ("[", "]")
                             xx$_*2   # Duplicate this 2n times
                   [X~]               # Find all possible combinations
 grep {          },                   # Filter from these
            .EVAL                     # The EVAL'd strings
       try !                          # That do not throw an error

3
如果有人好奇,[][]是一个空数组的Zen切片,它会产生数组本身。该切片可以应用多次,因此[][][][]...计算为[]。此外,[[]]由于单参数规则(您必须[[],]为嵌套数组编写),因此不构造嵌套数组而是构造空数组。因此,[]括号的任何平衡序列都将导致出现一个空数组,该数组将变为false。
nwellnhof '18

6

[R 112个 107 99字节

非递归方法。我们使用“ <”和“>”,因为它避免了正则表达式中的转义字符。为了使我们可以将较短的规范用于ASCII范围,我们使用expand.grid(通过其ASCII代码60、61和62)生成3 ^ 2n个2n个字符字符串“ <”,“ =“和”>” ,然后使用grep看看哪些组合能使括号括起来。当然,“ =”可能性将被忽略。

通过http://rachbelaid.com/recursive-regular-experession/

function(n)sort(grep("^(<(?1)*>)(?1)*$",apply(expand.grid(rep(list(60:62),2*n)),1,intToUtf8),,T,T))

在线尝试!

说明

"^(<(?1)*>)(?1)*$" = regex for balanced <> with no other characters
^ # match a start of the string
  ( # start of expression 1
    < # open <>
       (?1)* # optional repeat of any number of expression 1 (recursive)
  # allows match for parentheses like (()()())(()) where ?1 is (\\((?1)*\\))
    > # close <>
  ) # end of expression 1
  (?1)* # optional repeat of any number of expression 1
$ # end of string

function(n)
  sort(
    grep("^(<(?1)*>)(?1)*$", # search for regular expression matching open and close brackets
      apply(
        expand.grid(rep(list(60:62),2*n)) # generate 3^(2n) 60,61,62 combinations
      ,1,intToUtf8) # turn into all 3^(2n) combinations of "<","=",">"
    ,,T,T) # return the values that match the regex, so "=" gets ignored
  ) # sort them

R,107字节

通常的递归方法。

-1感谢@Giuseppe

f=function(n,x=0:1)`if`(n,sort(unique(unlist(Map(f,n-1,lapply(seq(x),append,x=x,v=0:1))))),intToUtf8(x+40))

在线尝试!


1
啊,我当时正试图去找Map高尔夫球,但无法将自己的头缠住。我不确信parse+ eval会因为()()类似的抛出错误而开始工作。
朱塞佩

4

C(gcc),114个字节

f(n,x,s,a,i){char b[99]={};n*=2;for(x=1<<n;x--;s|a<0||puts(b))for(s=a=i=0;i<n;)a|=s+=2*(b[n-i]=41-(x>>i++&1))-81;}

在线尝试!

应该适用于n <= 15。

说明

f(n,x,s,a,i){
  char b[99]={};   // Output buffer initialized with zeros.
  n*=2;            // Double n.
  for(x=1<<n;x--;  // Loop from x=2**n-1 to 0, x is a bit field
                   // where 1 represents '(' and 0 represents ')'.
                   // This guarantees lexicographical order.
      s|a<0||puts(b))  // Print buffer if s==0 (as many opening as
                       // closing parens) and a>=0 (number of open
                       // parens never drops below zero).
    for(s=a=i=0;i<n;)  // Loop from i=0 to n-1, note that we're
                       // traversing the bit field right-to-left.
      a|=              // a is the or-sum of all intermediate sums,
                       // it becomes negative whenever an intermediate
                       // sum is negative.
        s+=            // s is the number of closing parens minus the
                       // number of opening parens.
                        x>>i++&1   // Isolate current bit and inc i.
                    41-(        )  // ASCII code of paren, a one bit
                                   // yields 40 '(', a zero bit 41 ')'.
             b[n-i]=               // Store ASCII code in buffer.
          2*(                    )-81;  // 1 for ')' and -1 for '(' since
                                        // we're going right-to-left.
}


3

05AB1E,13 个字节

„()©s·ãʒ®õ:õQ

在线尝试验证更多测试用例

说明:

„()            # Push string "()"
   ©           # Store it in the register without popping
    s·         # Swap to get the (implicit) input, and double it
      ã        # Cartesian product that many times
       ʒ       # Filter it by:
        ®      #  Push the "()" from the register
         õ:    #  Infinite replacement with an empty string
           õQ  #  And only keep those which are empty after the infinite replacement


3

Japt,15 13字节

ç>i<)á Ôke/<>

尝试一下


说明

ç                 :Input times repeat the following string
 >i<              :  ">" prepended with "<"
    )             :End repeat
     á            :Get unique permutations
       Ô          :Reverse
        k         :Remove any that return true (non-empty string)
         e/<>     :  Recursively replace Regex /<>/

3

K(ngn / k)36 35字节

{"()"(&/-1<+\1-2*)#(x=+/)#+!2|&2*x}

在线尝试!

+!2|&2*x 所有长度为2 * n的二进制向量

(x=+/)# 只有那些总和为n的那些

(&/-1<+\1-2*)# 只有那些将0/1视为1 / -1的部分和的人都不是负数

"()" 使用0/1作为此字符串中的索引



2

Perl 6,42个字节

{grep {!S:g/\(<~~>*\)//},[X~] <( )>xx$_*2}

在线尝试!

使用递归正则表达式。替代替代:S/[\(<~~>\)]*//

38个字节,其中0和1作为打开/关闭符号:

{grep {!S:g/0<~~>*1//},[X~] ^2 xx$_*2}

在线尝试!

说明

{                                        }  # Anonymous block
                              <( )>         # List "(", ")"
                                   xx$_*2   # repeated 2n times
                         [X~]  # Cartesian product with string concat
                               # yields all strings of length 2n
                               # consisting of ( and )
 grep {                },  # Filter strings
        S:g/             # Globally replace regex match
            \(           #   literal (
              <~~>       #   whole regex matched recursively
                  *      #   zero or more times
                   \)    #   literal )
                     //  # with empty string
       !                 # Is empty string?

2

视网膜0.8.2,50字节

.+
$*
1
11
+%1`1
<$'¶$`>
Gm`^(?<-1>(<)*>)*$(?(1).)

在线尝试!使用<>s。说明:

.+
$*

转换为一元。

1
11

结果翻倍。

+%1`1
<$'¶$`>

枚举所有2²×2n位二进制数,将这些数字映射到<>

Gm`^(?<-1>(<)*>)*$(?(1).)

仅保持平衡的顺序。这使用了@MartinEnder发现的平衡括号技巧。



2

红色214,184136字节

func[n][g: func[b n][either n = length? b[if not error? try[load b][print b]return 0][g append copy b"["n g append copy b"]"n]]g""2 * n]

在线尝试!

使用Jo King的方法。使用递归查找所有可能的Brake排列(它们按字典顺序生成),如果排列被评估为有效块,则将其打印出来。


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.