this post was submitted on 17 Aug 2023
14 points (100.0% liked)

Programming Challenges

235 readers
1 users here now

Welcome to the programming.dev challenge community!

Three challenges will be posted every week to complete

Easy challenges will give 1 point, medium will give 2, and hard will give 3. If you have the fastest time or use the least amount of characters you will get a bonus point (in ties everyone gets the bonus point)

Exact duplicate solutions are not allowed and will not give you any points. Submissions on a challenge will be open for a week.

A leaderboard will be posted every month showing the top people for that month

founded 1 year ago
MODERATORS
 

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

you are viewing a single comment's thread
view the rest of the comments
[–] Andy@programming.dev 2 points 1 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 ]