8
\$\begingroup\$

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[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!

\$\endgroup\$
12
  • \$\begingroup\$ Is $x one token or two? \$\endgroup\$
    – mob
    Commented Feb 21, 2013 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
    Commented Feb 21, 2013 at 4:14
  • 4
    \$\begingroup\$ I've voted to close this as unclear as the challenge body does not properly specify what counts as a "separator" \$\endgroup\$ Commented Mar 27, 2021 at 4:16
  • 1
    \$\begingroup\$ Was this sandboxed? There are plenty of languages that can easily write programs consisting of only characters on your "common separator" list. \$\endgroup\$
    – Wheat Wizard
    Commented Mar 27, 2021 at 6:59
  • 1
    \$\begingroup\$ @WheatWizard This was asked in 2013, so I think it's unlikely it was sandboxed (given that sandboxes really started in 2014) \$\endgroup\$ Commented Mar 27, 2021 at 22:51

4 Answers 4

4
\$\begingroup\$

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).
\$\endgroup\$
1
  • \$\begingroup\$ Whatever it is you're doing with n looks truly evil. :) Woah!: c%4!=1! That's brilliant! \$\endgroup\$ Commented Jan 7, 2014 at 6:47
2
\$\begingroup\$

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
\$\endgroup\$
2
\$\begingroup\$

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
\$\endgroup\$
1
\$\begingroup\$

JavaScript (V8), 76 74

(a,d)=>(d=0)||a.replaceAll(/[(\[{]/g,b=>` ${b}\n`+'  '.repeat(++d)).replaceAll(/[)\]}]/g,b=>`\n${(f='  '.repeat(--d))+b}\n${f}`)

Try it online!

(a,d)=>               pas argument a and d (a is the string, d is just as decleration)
 (d=0)||               set d to 0
 a.replaceAll(         replace everything in a that matches....
   /[(\[{]/g,            [,(,{   with....
   b=>                   pass matches into function
     ` ${b}\n`             space, bracket(the match) and newline
     +'  '.repeat(++d)     increment d and repeat the 2 spaces d times
   )
 .replaceAll(/[)\]}]/g,  match all ),],} and replace them with....
    b=>                  pass matches into function
      `\n${(f='  '.repeat(--d))+b}\n${f}`   newline, decrement d and repeat the 2 spaces d times, closing bracket(the match), newline and once again the repeated spaces
)

results in

#a#,#d#=>#d#=#0#||#a#replaceAll#/#[#(#\#[#{#]#/#g#b#=>#`# #$#{#b#}#\#n#`#+#'# # #'#repeat#++#d#replaceAll#/#[#)#\#]#}#]#/#g#b#=>#`#\#n#$#{#f#=#'# # #'#r#e#p#e#a#t#--#d#+#b#}#\#n#$#{#f#}#`#
\$\endgroup\$
2
  • \$\begingroup\$ You can probably remove the braces {} inside the backticks \$\endgroup\$
    – Wezl
    Commented Mar 26, 2021 at 22:48
  • \$\begingroup\$ @Wezl , i am not so sure about those, as he specified only sperators, not sure if these are sperators. \$\endgroup\$
    – Alex bries
    Commented Mar 26, 2021 at 22:54

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