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^ [
  -5 {
    3 (

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[3]: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!

  • \$\begingroup\$ Is $x one token or two? \$\endgroup\$ – mob Feb 21 '13 at 3:59
  • \$\begingroup\$ @mob: Depends on what $x is: if it's a variable, 1 token. If it's a math operator, then 2. \$\endgroup\$ – beary605 Feb 21 '13 at 4:14
  • \$\begingroup\$ Love the scoring system, I think it will make Common Lisp much more viable. \$\endgroup\$ – Strigoides Feb 27 '13 at 20:14
  • \$\begingroup\$ 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..) \$\endgroup\$ – FireFly Mar 6 '13 at 16:16
  • \$\begingroup\$ @FireFly: They're all correctly matched (there will be as many open brackets as there are closed brackets). Yes, there will be no whitespace. \$\endgroup\$ – 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


  • 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).
  • \$\begingroup\$ Whatever it is you're doing with n looks truly evil. :) Woah!: c%4!=1! That's brilliant! \$\endgroup\$ – 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
#       i
            if len(s) and s[-1]in e: s+=n+l*c
#           j  k   l  m   n  o p  q  rs tuvwx
#           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)."$&

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.