Bracket Inc. wants to ship out new products using their excess brackets. They have tasked you with generating every possible assortment of brackets for some n brackets where the brackets will match

  • A bracket match is an opening and closing version of the same kind of bracket beside each other ()
  • If a bracket matches then outer brackets can also match (())
  • n will be an even number
  • The valid brackets are ()[]{}

For example for n = 4 the options are

  • ()()
  • (())
  • [][]
  • [[]]
  • {}{}
  • {{}}
  • []()
  • ()[]
  • (){}
  • {}()
  • []{}
  • {}[]
  • ({})
  • {()}
  • ([])
  • [()]
  • {[]}
  • [{}]

You must accept n as a command line argument (entered when your app is ran) and print out all of the matches, one per line

(It will be called like node main.js 4 or however else to run apps in your language)

You can use the solution tester in this post to test you followed the correct format https://programming.dev/post/1805174

Any programming language may be used. 2 points will be given if you pass all the test cases with 1 bonus point going to whoevers performs the quickest and 1 for whoever can get the least amount of characters

To submit put the code and the language you used below

  • @Andy
    link
    21 year ago

    Factor, take 2: much longer, much faster:

    USING: kernel regexp command-line namespaces sequences io math.combinatorics math.parser math strings ;
    IN: l
    
    : g ( s -- ? )
      R/ (\{\}|\(\)|\[\])/
      [
        2dup re-contains?
        pick empty? not
        and
      ] [
        [ "" re-replace ] keep
      ] while drop empty?
    ;
    
    : a ( n -- )
      2 -
      dup neg? [ drop ] [
        dup 0 = [ drop "{}" "[]" "()" [ print ] tri@ ] [
          "{[(" "}])" cartesian-product concat swap
          "(){}[]" swap [
            over
            [
              [ dup ] dip
              [ first ] [ last ] bi [ 1string ] bi@
              surround
              dup g [ print ] [ drop ] if
            ] each drop
          ] each-selection drop
        ] if
      ] if
    ;
    
    MAIN: [ command-line get [ string>number a ] each ]