With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

I need a simple and elegant algorithm that will add properly

positioned brackets between 2 or more multi-leveled expressions.

The diagram below shows exactly what I am looking for:

!! NOTE: VIEW IN FIXED FONT SUCH AS COURIER NEW!!

=============================================================

8 POSSIBLE SCENARIOS FOR 3 EXPRESSIONS USING UP TO 2 LEVELS

=============================================================

(1) (2) (3) (4) (5) (6) (7) (8)

+-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+

GROUP LEVEL: |1|2| |1|2| |1|2| |1|2| |1|2| |1|2| |1|2| |1|2|

+-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+

EXPRESION A: |A| | |A| | |A| | |A| | | |A| | |A| | |A| | |A|

+-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+

EXPRESION B: |B| | |B| | | |B| | |B| |B| | |B| | | |B| | |B|

+-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+

EXPRESION C: |C| | | |C| |C| | | |C| |C| | | |C| |C| | | |C|

+-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+

=============================================================

BRACKET SOLUTIONS FOR THE 8 SCENARIOS SHOWN ABOVE

=============================================================

(1) A + B + C

(2) A + B + (C)

(3) A + (B) + C

(4) A + (B + C)

(5) (A) + B + C

(6) (A) + B + (C)

(7) (A + B) + C

(8) (A + B + C)

Things become more complicated as we add more levels and

expressions. Is there an elegant approach?.

Thanks

positioned brackets between 2 or more multi-leveled expressions.

The diagram below shows exactly what I am looking for:

!! NOTE: VIEW IN FIXED FONT SUCH AS COURIER NEW!!

==========================

8 POSSIBLE SCENARIOS FOR 3 EXPRESSIONS USING UP TO 2 LEVELS

==========================

(1) (2) (3) (4) (5) (6) (7) (8)

+-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+

GROUP LEVEL: |1|2| |1|2| |1|2| |1|2| |1|2| |1|2| |1|2| |1|2|

+-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+

EXPRESION A: |A| | |A| | |A| | |A| | | |A| | |A| | |A| | |A|

+-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+

EXPRESION B: |B| | |B| | | |B| | |B| |B| | |B| | | |B| | |B|

+-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+

EXPRESION C: |C| | | |C| |C| | | |C| |C| | | |C| |C| | | |C|

+-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+ +-+-+

==========================

BRACKET SOLUTIONS FOR THE 8 SCENARIOS SHOWN ABOVE

==========================

(1) A + B + C

(2) A + B + (C)

(3) A + (B) + C

(4) A + (B + C)

(5) (A) + B + C

(6) (A) + B + (C)

(7) (A + B) + C

(8) (A + B + C)

Things become more complicated as we add more levels and

expressions. Is there an elegant approach?.

Thanks

In your sample with 8 possibilities, the possible combinations are equal to 2^3 (two levels of three expressions).

You can also think of your expressions as binary numbers:

1. 000

2. 001

3. 010

4. 011

5. 100

6. 101

7. 110

8. 111

The pattern is everywhere there are sequences of 1, you'll need to put parentheses around things.

>> find first " ) " from the end (of hte left part), split in between

>> left = evaluate( left->left, left->right, left->op )

sorry, I should indicate that you need to do the same for the right side :) This forms an expression tree:

X = A + ( B + (C + D) )

Gives

X

/ \

/ \

/ \

A +

/ \

/ \

/ \

B +

/ \

/ \

/ \

C D

as you can see, each node either has 2 children or none - nodes with two children are operators and nodes with none are operands. This binary tree allows for some efficient login operations, so you don't have to limit yourself to recursion. If it were me, I'd use a stack.

All Courses

From novice to tech pro — start learning today.

I didn't look at your code yet, but you need tp write a simple expression parser, just for the reason that adding even one more little thing will ruin the code if you don't. What you probably should do is start with a string that has a line of code in it. Strip everything but the characters (ie remove spaces and newlines). The easiest solution is a recursive one:

function evaluate( left, right, operator )

{

if left has a " ( " then

find first " ) " from the end (of hte left part), split in between

left = evaluate( left->left, left->right, left->op )

return operator->do_something(lef

}

This probably isn't the speediest, but you're probably not worried about performance (after all, you *are* using VB lol) so this is the simplest solution for you.

So for the expression

A + ( B + C )

the logic would be:

evaluate( "A", "(B+C)","+") ->

return add( "A", add("B","C") )

^---- evaluate("B+C") -> return add->do_something("B","C")

and so on.

good luck! look at some scripting engine source code... should help.