# Pretty Printing Parentheses

The worst part about long lines or code or math equations are the parentheses. Nobody wants to read through 2x(3y+4*abs(x^[2*e^x])-5{3(x+y)-5})!

So, the goal of this challenge is to make it at least slightly easier to read these parentheses-filled beasts! For the above math equation, the output should be:

2x (
3y+4*abs (
x^ [
2*e^x
]
)
-5 {
3 (
x+y
)
-5
}
)


A parenthesis is defined as either of these characters: ()[]{}. Indents should each be two spaces, and there should be one space of seperation between the expression and the parenthesis: 2x (, x^ [ as some examples.

I would like to debut the Atomic Code Golf metric in this question. Take out all separators in your code (()[]{}. ; to name some common ones), and then take the length of your program if every reserved word and operator were 1 character long. That is your program's score. if x**(3.2)==b:print x is 11 points: if|x|**|3|.|2|==|b|3|print|x, or ix*3.2=b3px. Any quick questions about the metric can be posted here; larger questions should be discussed in meta using the link above.

Lowest score wins. Good luck, have fun!

• Is $x one token or two? – mob Feb 21 '13 at 3:59 • @mob: Depends on what $x is: if it's a variable, 1 token. If it's a math operator, then 2. – beary605 Feb 21 '13 at 4:14
• Love the scoring system, I think it will make Common Lisp much more viable. – Strigoides Feb 27 '13 at 20:14
• Re. the task itself: do we have to check for matching brackets, or is it okay to assume that they are all correctly matched up? Furthermore, is the input expression guaranteed to contain no whitespace already? (In particular, in the vicinity of the parens..) – FireFly Mar 6 '13 at 16:16
• @FireFly: They're all correctly matched (there will be as many open brackets as there are closed brackets). Yes, there will be no whitespace. – beary605 Mar 7 '13 at 0:57

## C, 139 137 chars, 67 tokens

i,n;                                                      // 2 tokens
main(c){                                                  // 2 tokens
while(~(c=getchar()))                             // 5 tokens
n=strchr("([{}])",c)?                     // 11 tokens
n=c%4!=1,                         // 7 tokens
i+=n*4-2,                         // 7 tokens
printf("\n%*s%c"+n,n?1:i,"",c)    // 15 tokens
:                                         // 1 token
!printf("\n%*s%3$c"+!n*4,i,"",c); // 17 tokens }  Logic: • Read until EOF (detect it because ~EOF==0). • If parenthesis, check open/close (for c in ")]}", c%4==1), update indentation (i), print with some whitespace. • If not, print the character, possibly prefixed by newline and indentation (n is true after parenthesis). • Whatever it is you're doing with n looks truly evil. :) Woah!: c%4!=1! That's brilliant! – luser droog Jan 7 '14 at 6:47 ## Python, 102(?) Tokens (Please correct if I didn't count correctly) def f(t): #1 2 3 l,s,p,c,e,n=0,"",1," ",")]}","\n" # 4 5 6 7 8 9ab cd e fgh ijklm no p for i in t: # q r s t if i in"([{": l+=2;s+=c+i+n+l*c # u v w xyzAB CD E FG HIJKLMNOP elif i in e: l-=2;s+=n+l*c+i+p*(n+l*c);p=1 # Q R S T UV W XY Z123456789 abcde fgh else: # i if len(s) and s[-1]in e: s+=n+l*c # j k l m n o p q rs tuvwx s+=i;p=0 # yz A BCD return s # E F  ## Perl, 86 char 57 tokens? (21+25+5+3+1+2?) Newlines are significant. s![[{()}\]]!1-(3&ord$&)?" $& "." "x++$x:$/.($y="  "x--$x)."$&
\$y"!ge;s/
*
/
/g;print