g | x | w | all
Bytes Lang Time Link
013Vyxal 3250601T231201Zpacman25
022Uiua250601T201339ZJoao-3
123Swift 6240316T191211ZmacOSist
021Pip l210622T033712ZDLosc
029K ngn/k210622T002440Zcoltim
096Haskell210621T174312Zlynn
027Vyxal j210621T093104Zemanresu
01105AB1E210126T133220ZKevin Cr
015Jelly210126T101808ZUnrelate
096C180426T075915ZChristop
065Retina181125T114839ZNeil
338BrainFlak181124T185911ZWheat Wi
101VIM180703T142137ZJoshM
013Japt180607T194223ZShaggy
017Japt Rx180528T080357ZBubbler
114Haskell180426T065654ZAngs
107Haskell180426T093147ZLaikoni
071JavaScript Node.js180426T033108Zl4m2
012Charcoal180426T051228ZASCII-on
015CJam150701T162940ZDennis
041MATL151222T235903ZLuis Men
117C150421T112323ZMarcDefi
055TIBASIC150421T032104Zuser3932
028J150420T193528ZFUZxxl
424Batch150422T021502Zunclemea
335Batch150425T140421Zankh-mor
049C150422T164128ZCL-
154Haskell150425T101843Zd8d0d65b
195C#150425T093339ZJeremy M
nanx86 machine code150420T233933ZMatteo I
166Python 2150422T155259ZDef
097Javascript/ES6150421T020832ZDendrobi
nanRetina + Bash150422T010710Zuser2272
222Java150420T201241ZTNT
127R150420T150912Zplannapu
nan150421T235325Zuser2272
094Lex150422T071643Zrici
076Perl150421T113434Zalyx-bre
196C#150421T084954ZVisualMe
079Perl150421T063330ZHelios
214Java150421T072648ZArturoTe
114Ruby150420T145143Zror3d
227Haskell150421T034743ZJeremy L
092Python 2150421T031754Zxnor
115Python 2150420T153158ZSp3000
031Pyth150420T142906Zizzyg
177IDL 8.4150420T235921Zsirperci
053Pip150420T185747ZDLosc
046J150420T175157Zɐɔıʇǝɥʇu
085Octave150420T225552Zpawel.bo
135GNU Bash + coreutils + indent150420T163413ZDigital
036CJam150420T141453ZOptimize
150C150420T143447ZBrainSte

Vyxal 3, 13 bytes

O⍢:⑧$*σ+Ẅ«␣z'

Vyxal It Online!

-3 because it turns out zip fill just does the job i guess

Uiua, 22 bytes

⬚@ ⌝⊡˜≡⊟°⊏˜-\+⊸-⊸¬=@(.

Try it in the pad!

Outputs a character matrix.

Explanation

The first thing this solution does is calculate the depths. We do a \ scan over the string, starting with 0 (implicit, so don't need ⬚0). If the character is (, we add 1, otherwise we subtract 1 (-⊸¬ converts 0 into -1). But this outputs the wrong values, so we subtract 1 where the characters are (.

The rest of the solution is relatively simple; we pair up the depths with their indices, and use ⌝⊡ antipick with a ⬚ fill value of @ on our coordinates and the original string: what this does is build an array by putting the characters of our string into the corresponding coordinates, ⬚ filling the rest with spaces.

Swift 6, 149 131 123 bytes

var c=0,t={i in{for e in 0...$0.max()!{print(""+zip(i,$0).map{$1==e ?$0:" "})}}((i+"").map{$0<")" ?(c,c+=1).0:(c-=1,c).1})}

Try it on SwiftFiddle!

Explanation

func telescope(_ input: String) {
  // as an example, we'll pretend that `input` is
  // this string: "((()())()(()(())()))"

  var currentDepth = 0
  let depths = input.map { character in
    switch character {
    // this is equivalent to `currentDepth++`, if that
    // operator still existed in Swift
    case "(": (currentDepth, currentDepth += 1).0

    // likewise, this would be the same as `--currentDepth`
    case ")": (currentDepth -= 1, currentDepth).1

    default: currentDepth
    }
  }

  // now, for our example, `depths` is:
  // [0, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 3, 3, 2, 2, 2, 1, 0]
  // (note that a depth of 0 is the topmost/outermost level)

  for depth in (0...depths.max()!) {
    let line = zip(input, depths).map { (character, otherDepth) in
      // if this character is on this tier, show it; otherwise, add a space
      otherDepth == depth ? character : " "
    }

    print(String(line))
  }
}

Pip -l, 23 22 21 bytes

ZJ:sX{%Aa?DiUi-1}._Ma

Attempt This Online! Or, here's a 25-byte equivalent in Pip Classic: Try it online!

Reminiscence

Pip, old chap, how far we've come.

This clunky 53-byter was my first Pip answer on this site, over six years ago. I'd like to leave that answer untouched as a historical artifact, so I'm posting my modern Pip solution here separately. It's pretty clear that the two are different languages anyway. The old solution doesn't even work in modern Pip (though it still does on the TIO version).

Explanation

ZJ:sX{%Aa?DiUi-1}._Ma
                      ; s is space; i is 0; a is command-line arg (implicit)
                   Ma ; Map this function to each character in the argument:
     { Aa       }     ;   The ASCII code of the character
      %               ;   Mod 2
         ?            ;   Is that truthy (1, close paren) or falsey (0, open paren)?
          Di          ;    If truthy, decrement i and return it
            Ui        ;    If falsey, increment i
              -1      ;    and return i-1 (i.e. the previous value of i)
   sX                 ;   Make a string of that many spaces
                 ._   ;   Concatenate the parenthesis to it
ZJ:                   ; Zip the list of strings to transpose it, padding to
                      ; a rectangle using spaces
                      ; Autoprint (implicit), each sublist on its own line (-l flag)

K (ngn/k), 29 bytes

{+(|/i)$(-i:m-+\m-~m:2!x)$'x}

Try it online!

Haskell, 96 bytes

f s=fst$span(any(>' '))[do
c:d<-scanr(:)[]s
max" "[c|sum[1|')'<-d]-sum[1|'('<-c:d]==i]|i<-[0..]]

Try it online!

Vyxal j, 27 bytes

ƛC∷&-¥n꘍nC₂&+;:vLG£ƛ¥↲;ÞTv∑

Try it Online!

A mess that I'm proud of. Thanks to lyxal for fixing a bug.

05AB1E, 14 11 bytes

2IDÇÉü+>4αΛ

Try it online.

Explanation:

2        # Push 2
I        # Push the input-string
D        # Create a copy of the input-string,
 Ç       # and convert it to a list of codepoint integers: ")"→41; "("→40
  É      # Check for each if it's odd: ")"→1; "("→0
   ü     # For each overlapping pair:
    +    #  Add them together: "(("→0; "()"→1; ")("→1; "))"→2
     >   # Increase each by 1: "(("→1; "()"→2; ")("→2; "))"→3
      4α # Take the absolute difference with 4: "(("→3; "()"→2; ")("→2; "))"→1
Λ        # Use the Canvas builtin with the given three arguments:
         #  - Directions: the list of 123 we created, for ↗→↘ respectively
         #  - What to draw: the third remaining copy of the input-string
         #  - Line-lengths per step: the 2

Here a step-by-step explanation of the output for input (()(()())()((())))(()):

Preparation step: the overlapping pairs are ["((","()",")(","((","()",")(","()","))",")(","()",")(","((","((","()","))","))","))",")(","((","()","))"], which are mapped with DÇÉü+>4α to [3,2,2,3,2,2,2,1,2,2,2,3,3,2,1,1,1,2,3,2,1], which indicate the directions [↘,→,→,↘,→,→,→,↗,→,→,→,↘,↘,→,↗,↗,↗,→,↘,→,↗]:

7   0   1
  ↖ ↑ ↗
6 ← X → 2
  ↙ ↓ ↘
5   4   3 

When we use the Canvas builtin, it then draws like this:

Step 1: draw 2 characters ((() in direction 3 ():

(
 (

Step 2: draw 2-1 characters ()) in direction 2 ():

(
 ()

Step 3: draw 2-1 characters (() in direction 2 ():

(
 ()(

Step 4: draw 2-1 characters (() in direction 3 ():

(
 ()(
    (

Etc.

For an in-depth explanation of the Canvas builtin I can refer to this 05AB1E tip of mine.

Jelly, 15 bytes

OḂ-*Ä+ƲṬ€z0ao⁶Y

Try it online!

Went through quite a few 16-byters before arriving at this...

O                  Codepoints
 Ḃ                 mod 2. ('(' -> 0, ')' -> 1)
    Ä              Cumulative sums of
  -*               -1 to the power of each,
     +Ʋ            plus the corresponding original residues.
       Ṭ€          For each, an array with 1 at that index and 0 elsewhere.
         z0        Zip filling with zeroes,
           a       replace ones with corresponding elements of the input string,
            o⁶     replace zeroes with spaces,
              Y    join on newlines.

C, 94 99 97 96

i,j,k,l;f(char*s){for(l=0;!i--;l-=puts(""))for(j=0;k=s[j++];putchar((k&1?--l:l++)?32:k))i&=l<2;}

Pure C version that doesn't use the consoles escape codes. Ungolfed:

i,j,k,l;                 // stop,iterator,current char,level
f(char*s){
  for(l=0;               // reset level
      !i--;              // stop ? return : stop = 1;
      l-=puts(""))      // new line + next level
    for(j=0;
        k=s[j++];        // for each char
        putchar(
          (k&1?--l:l++)  // char == 41 ? prev level : next level
          ?32:k))        // only print brackets at level 0
      i&=l<2;            // if level > 1 then don't stop
}

Try it online!

Changelog:

Retina, 65 bytes

./\S/{*\`\(((?<-2>(\()*\))*)\)
($.1* )
\(((?<-2>(\()*\))*)\)
 $1 

Try it online! Note: Trailing space. Link includes test cases. Explanation:

.

Don't print the spaces left over at the end.

/\S/{

Repeat until there are only spaces left.

*\`

Print the result of this substitution without changing the current value.

\(((?<-2>(\()*\))*)\)
($.1* )

Match pairs of balanced parentheses and replace their content with a run of spaces of the same length.

\(((?<-2>(\()*\))*)\)
 $1 

Match balanced parentheses and replace the outer pairs with spaces.

For Retina 0.8.2 you have the choice of this 60 byte code:

{*`\(((?<-2>(\()*\))*)\)
($.1$* )
\(((?<-2>(\()*\))*)\)
 $1 

Try it online! Note: Trailing space. Link includes test cases. Explanation: The differences are as follows:

Alternatively, if the blank lines are a problem, you can use this 92 byte code:

{`.+$
$&¶$&
\(((?<-2>(\()*\))*)\)(?=.*¶.*$)
($.1$* )
\(((?<-2>(\()*\))*)\)(?=.*$)
 $1 
¶ +$

Try it online! Link includes test cases. Explanation:

{`

Repeat until the value converges.

.+$
$&¶$&

Duplicate the last line.

\(((?<-2>(\()*\))*)\)(?=.*¶.*$)
($.1$* )

Match pairs of balanced parentheses on what used to be the last line and replace their content with a run of spaces of the same length.

\(((?<-2>(\()*\))*)\)(?=.*$)
 $1 

Match pairs of balanced parentheses on the last line and replace the outer pairs with spaces.

¶ +$

Delete the last line if it's only spaces. This allows the loop to terminate.

Brain-Flak, 338 bytes

([]){(({})[()]<([{}][])([][()]){({}[()]<(({}<(({})(())){({}[()]<([{}]())>)}>{})<({}{})((){[()](<{}<>((((()()()()){}){}){})<>>)}{}){{}(({})<>)(<>)}{}(({})(())){({}[()]<([{}])>)}{}>{}<({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>>)>)}{}{}<>((()()()()()){})<>>)}{}{{}}<>{{}{}(({})[((((()()()){}())){}{}){}]())}{}{({}<>)<>}<>

Try it online!

Idea

The idea for this program is that we make a number of passes over the string. Each time we make a pass we keep track of a counter, we decrement the counter if we encounter a ( and increment it if we encounter a ). If ( brings it to -1 we copy it to the offstack and if ) brings it to zero we copy it to the offstack. Otherwise we just copy a space. We do this as many times as the length of the string starting the counter at 0 the first time and decreasing it each loop. This way we catch the different layers in order. When we are done we just trim characters until we reach a ).

VIM, 101 bytes

= Enter

qwlmto<esc>`t@wq@w:s/()/(*)/g↵:set ve=all↵:set nows:↵set nosol↵qqvi)ygvr jPk/(↵@qq@qjjdGqeGl?*↵<C-V>ggoGr|@eq@e:%s/|//↵

Japt, 13 bytes

y_ùZ<')?°T:T´

Try it


Explanation

y_                :Transpose, pass each column Z through a function and transpose back
   Z<')           :  Is Z less than ")", i.e., is Z equal to "("?
       ?          :  If so
        °T        :   Prefix increment variable T (initially 0)
          :       :  Else
           T´     :   Postfix decrement T
  ù               :  Left pad Z with spaces to length T

Japt -Rx, 17 bytes

¬£®¥'(?Y´:°Y ?S:Z

Try it online!

Unpacked & How it works

Uq mXYZ{UmZ{Z=='(?Y--:++Y ?S:Z

Uq      Convert the input string into array of chars
mXYZ{   Map with the function...
          Here, Y (index) is used as the desired level of "telescoping"
UmZ{      Map on the original input string with the function...
Z=='(?      If this char is "("...
Y--:          Decrement Y
++Y           Otherwise, increment Y
?           If Y is nonzero (i.e. this char is *not* at desired level)...
S:            Replace with a space
Z             Otherwise, use the char as-is

Flags:
-R      Join the resulting array with newline
-x      Trim the resulting string on both ends

Ported from @l4m2's JS solution. It actually fits into Japt's built-ins quite nicely, and trailing whitespaces can be conveniently removed with the use of -x flag.

Haskell, 117 114 bytes

f(y:b)|a<-sum[1|y=='(']=a:map(+(2*a-1))(f b)
f[]=[]
p s=[[last$' ':[a|b==i]|(b,a)<-zip(f s)s]|i<-[1..maximum$f s]]

Try it online!

Haskell, 107 bytes

h#('(':s)=h:(h+1)#s
h#(_:s)|k<-h-1=k:k#s
_#_=[]
g s=[do(c,i)<-zip s$0#s;max" "[c|i==h]|h<-[0..maximum$0#s]]

Try it online!

Based on d8d0d65b3f7cf42's Haskell answer.

JavaScript (Node.js), 71 bytes

x=>[...x].map((_,n,s)=>s.map(c=>(c=='('?n--:++n)?' ':c).join``).join`
`

Try it online!

JavaScript (Node.js), 85 bytes, just enough lines

x=>[...x].map((_,n,s)=>(Q=s.map(c=>(c=='('?n--:++n)?' ':c).join``)<1?'':Q+`
`).join``

Try it online!

Charcoal, 12 bytes

FS¿⁼(ι↘(«M↑)

Try it online!

Explanation

FS             For each character in next input as string
    ¿⁼(ι         If character is "("
        ↘(       Print "(" down and to the right - this is equivalent to printing "(" and moving down
          «M↑)  Else move up and print ")"

CJam, 17 16 15 bytes

0000000: 72 3a 69 22 28 0b 20 9b 41 29 22 53 2f 66 3d     r:i"(. .A)"S/f=

The above is a reversible xxd dump, since the source code contains the unprintable characters VT (0x0b) and CSI (0x9b).

Like this answer, it uses ANSI escape sequences, but it also uses vertical tabs and it prints the control characters directly to avoid using printf.

This requires a supporting video text terminal, which includes most non-Windows terminal emulators.

Test run

We have to set the shell variable LANG and the terminal emulator's encoding to ISO 8859-1. The former is achieved by executing

$ LANGsave="$LANG"
$ LANG=en_US

Also, before executing the actual code, we'll disable the prompt and clear the screen.

$ PS1save="$PS1"
$ unset PS1
$ clear

This makes sure the output is shown properly.

echo -n '()(())((()))(())()' | cjam <(base64 -d <<< cjppIigLIJtBKSJTL2Y9)
()(  )(    )(  )()
   ()  (  )  ()
        ()

To restore LANG and the prompt, execute this:

$ LANG="$LANGsave"
$ PS1="$PS1save"

How it works

We insert a vertical tab after each ( to move the cursor down and the byte sequence 9b 41 ("\x9bA") before each ) to move the cursor up.

r         e# Read a whitespace-separated token from STDIN.
:i        e# Replace each character by its code point.
          e#   '(' -> 40, ')' -> 41
"(. .A)"  e# Push the string "(\v \x9bA)".
S/        e# Split at spaces into ["(\v" "\x9bA)"].
f=        e# Select the corresponding chunks.
          e# Since arrays wrap around in CJam, ["(\v" "\x9bA)"]40= and 
          e# ["(\v" "\x9bA)"]41= select the first and second chunk, respectively.

MATL, 42 41 bytes

Uses current version (4.0.0) of the language, which is newer than this challenge (but the challenge was so attractive...)

j32-t8=2*1-TTo3X53$X+ZSYsP0hP1+wtn:wZ?32+c

EDIT (May 20, 2016): Try it online! with X+ replaced by Y+, according to version 18.0.0 of the language.

Example

>> matl j32-t8=2*1-TTo3X53$X+ZSYs0wh1+wtn:wZ?32+c
> ()(())((()))(())()
()(  )(    )(  )()
   ()  (  )  ()   
        ()      

Explanation

The general idea is to use convolution to analyze pairs of consecutive symbols. There are four possible pairs:

When analyzing each pair, the line of the first symbol is already known, and the analysis tells the line of the second. Then the nex pair is analyzed, obtained by advancing one symbol, that is, with overlapping.

j           % input string                                     
32          % ASCII code of space character
-           % subtraction. Will give 8 or 9 for '(' and ')'
t8=         % 1 for '(' symbols, 0 for ')'
2*1-        % convert into 1 / -1
TTo         % array [1 1] (for convolution)
3X5         % 'valid' flag for convolution
3$          % specify three inputs for convolution
X+          % convolution                                      
ZS          % sign function            
Ys          % cumulative sum                                   
0wh         % prepend a 0
1+          % add 1. This gives line number of each symbol
wtn:w       % Vector [1 2 ... n] where n is string length. Rearrange
Z?          % create (sparse) matrix with three inputs: row, col, val
32+c        % add space code and convert to chat

C, 118 117 Bytes

Another answer in C, but mine is shorter.

c;d;main(m,v)int**v;{while(d++<m){char*p=v[1];while(*p)c+=*p==40,putchar(c-d?*p:32),m=c>m?c:m,c-=*p++==41;puts("");}}

Ungolfed version:

c; /* current depth */
d; /* depth to print in current row */
main(m,v)int**v;{
    while(d++<m) {
        char*p=v[1];
        while(*p){
            c+=*p==40;           /* 40 = '(' */
            putchar(c-d?*p:32); /* 32 = ' ' (space) */
            m=c>m?c:m;           /* search maximum depth */
            c-=*p++==41;         /* 41 = ')' */
        }
        puts("");
    }
}

And it works!

% ./telescope '()(())((()))(())()'
()(  )(    )(  )()
   ()  (  )  ()
        ()
% ./telescope '((()())()(()(())()))'
(                  )
 (    )()(        )
  ()()    ()(  )()
             ()

TI-BASIC, 69 60 56 55 bytes

This is for the TI-83+/84+ family of calculators, although it was written on an 84+ C Silver Edition.

The program shows up as larger on-calc due to VAT+size info being included. Also, there are more than 56 characters here; the reason it's 56 bytes is because all commands that are more than one character are compressed down to tokens that are either one or two bytes in size.

Input Str1
1→B
For(A,1,length(Str1
sub(Str1,A,1→Str2
Ans="(
Output(B+Ans,A,Str2
B-1+2Ans→B
End

Shaved off another byte thanks to thomas-kwa! (also from him was the jump from 60 to 56.)

J, 32 28 bytes

This was a fun one.

0|:')(('&(i.-<:@+/\@i:){."0]

Explanation

This is how this solution works, including an explanation of how it has been golfed.

   NB. Let a be a test case
   a =. '((()())()(()(())()))'

   NB. level alterations
   _1 + ').(' i. a
1 1 1 _1 1 _1 _1 1 _1 1 1 _1 1 1 _1 _1 1 _1 _1 _1

   NB. absolute levels
   +/\ _1 + ').(' i. a
1 2 3 2 3 2 1 2 1 2 3 2 3 4 3 2 3 2 1 0

   NB. adjusted levels
   (+/\ _1 + ').(' i. a) - ')(' i. a
0 1 2 2 2 2 1 1 1 1 2 2 2 3 3 2 2 2 1 0

   NB. take level from end of each item of a and transpose
   |: a {."0~ _1 - (+/\ _1 + ').(' i. a) - ')(' i. a
(                  )
 (    )()(        ) 
  ()()    ()(  )()  
             ()     

   NB. code as a tacit verb
   [: |: ] {."0~ _1 - ([: +/\ _1 + ').(' i. ]) - ')(' i. ]

   NB. subtractions pulled into the prefix insert
   [: |: ] {."0~ (')(' i. ]) - [: <:@+/\ ').(' i. ]

   NB. i: instead of i. so we can use the same string constant
   [: |: ] {."0~ (')((' i. ]) - [: <:@+/\ ')((' i: ]

   NB. get rid of the caps
   0 |: ] {."0~ (')((' i. ]) - ')((' <:@+/\@i: ]

   NB. join the two usages of ')((' into a single dyadic phrase
   0 |: ] {."0~ ')((' (i. - <:@+/\@i:) ]

   NB. bond ')((' and flip arguments to {."0
   0 |: ')(('&(i. - <:@+/\@i:) {."0 ]

Batch, 424 bytes

@echo off
setLocal enableDelayedExpansion
set s=%1
set a=1
:c
if defined s (set/ac+=1
set "z="
if "%s:~0,1%"=="(" (set "1=(")else (set/aa-=1
set "1=)")
for %%a in (!a!)do for /f usebackq %%b in (`powershell "'!l%%a!'".Length`)do (set/ay=!c!-%%b
for /l %%a in (1,1,!y!)do set z= !z!
set "l%%a=!l%%a!!z!!1!")
if "%s:~0,1%"=="(" set/aa+=1
if !a! GTR !l! set/al=!a!-1
set "s=%s:~1%"
goto c)
for /l %%a in (1,1,!l!)do echo !l%%a!

Un-golfed:

@echo off
setLocal enableDelayedExpansion

set s=%1
set a=1
set c=0
set l=0

:c
if defined s (
    set /a c+=1
    set "z="
    if "%s:~0,1%"=="(" (
        set "1=("
    ) else (
        set /a a-=1
        set "1=)"
    )
    for %%a in (!a!) do for /f usebackq %%b in (`powershell "'!l%%a!'".Length`) do (
        set /a y=!c!-%%b
        for /l %%a in (1,1,!y!) do set z= !z!
        set "l%%a=!l%%a!!z!!1!"
    )
    if "%s:~0,1%"=="(" set /a a+=1
    if !a! GTR !l! set /a l=!a!-1
    set "s=%s:~1%"
    goto c
)

for /l %%a in (1,1,!l!) do echo !l%%a!

Example:

h:\>par.bat (((())())(()))
 (            )
  (      )(  )
   (  )()  ()
    ()

Batch, 356 335 bytes

I know that there already exists a Batch solution for this challenge, but this one is golfed significantly more and seems to take a different approach. Most importantly, the other batch solution contains at least one powershell command; this solution does not.

@echo off
setlocal enabledelayedexpansion
set p=%1
set p=%p:(="(",%
set p=%p:)=")",%
set c=0
for %%a in (%p%)do (if ")"==%%a set/ac-=1
set d=!d!,!c!%%~a
if "("==%%a set/ac+=1&if !c! GTR !m! set m=!c!)
set/am-=1
for /l %%a in (0,1,!m!)do (for %%b in (!d!)do (set t=%%b
if "%%a"=="!t:~0,-1!" (cd|set/p=!t:~-1!)else (cd|set/p=. ))
echo.)

There is a backspace character (U+0008) on the second to last line following the dot (line 12, column 57). This isn't visible in the code posted here but is included in the byte count.

C, 58 53 52 51 49 bytes

Makes use of ANSI escape sequences to move the cursor position.

f(char*s){while(*s)printf(*s++&1?"\e[A)":"(\v");}

If not using gcc or another compiler that supports \e then it can be replaced with \x1B for a total of 2 extra bytes. \e[A moves the cursor up one row and \e[B moves the cursor down one row. It's not necessary to use \e[B to move down one row as it's two bytes shorter to use the ASCII vertical tab character 0xB or \v.

The input string is assumed, from the question, to consist of only (balanced) parentheses, so checking the parity of the character, with &1, is enough to distinguish between ( and ).

Haskell, 154 bytes

f h('(':s)=h:f(h+1)s;f h(')':s)=(h-1):f(h-1)s;f _ _=[]
main=interact$ \s->unlines[[if i==h then c else ' '|(c,i)<-zip s l]|let l=f 0 s,h<-[0..maximum l]]

same idea as the other Haskell solution, but somewhat shorter. - Usage:

echo  '(((())())(()))' | runghc Golf.hs

C#, 195 bytes

First try at golf - yell if I did something wrong.

Alternative C# version using SetCursorPosition and working left to right taking the input as a commandline arg.

using System;class P{static void Main(string[] a){Action<int,int>p=Console.SetCursorPosition;int r=0,c=0;foreach(var x in a[0]){r+=x==')'?-1:0;p(c,r);Console.Write(x);r+=x=='('?1:0;p(c,r);c++;}}}

I thought it would be fun to adjust the write position based on the open/close paren and not full lines. Close paren moves the position up before writing; open paren moves it down after writing. Actioning SetCursorPosition saves five bytes. Moving the cursor to the next line after the output would take quite a bit extra.

using System;
class P
{
    static void Main(string[] a)
    {
        Action<int, int> p = Console.SetCursorPosition;
        int r = 0, c = 0;
        foreach (var x in a[0])
        {            
            r += x == ')' ? -1 : 0;
            p(c, r);
            Console.Write(x);
            r += x == '(' ? 1 : 0;
            p(c, r);
            c++;
        }
    }
}

x86 machine code, 39 34 33 30 29 bytes

00000000  68 c3 b8 07 31 ff be 82  00 b3 a0 ad 4e 3c 28 7c  |h...1.......N<(||
00000010  f0 77 05 ab 01 df eb f3  29 df ab eb ee           |.w......)....|
0000001d

x86 assembly for DOS, with some tricks:

    org 100h

section .text

start:
    ; point the segment ES to video memory
    ; (c3 is chosen so that it doubles as a "ret")
    push 0b8c3h
    pop es
    ; di: output pointer to video memory
    xor di,di
    ; si: input pointer from the command line
    mov si,82h
    ; one row=160 bytes (assume bh=0, as should be)
    mov bl,160
lop:
    ; read & increment si (assume direction flag clean)
    ; we read a whole word, so that later we have something nonzero to
    ; put into character attributes
    lodsw
    ; we read 2 bytes, go back 1
    dec si
    ; check what we read
    cmp al,'('
    ; less than `(`: we got the final `\n` - quit
    ; (we jump mid-instruction to get a c3 i.e. a ret)
    jl start+1
    ; more than `(`: assume we got a `)`
    ja closed
    ; write a whole word (char+attrs), so we end
    ; one position on the right
    stosw
    ; move down
    add di,bx
    ; rinse & repeat
    jmp lop
closed:
    ; move up
    sub di,bx
    ; as above
    stosw
    jmp lop

Limitations:

enter image description here

Python 2, 166 bytes

Not much to be said:

m,c,l=list(input()),0,[]
for j in m:c+=1if j=='('else-1;l+=[c-1if j=='('else c]
for i in range(max(l)+1):
 t,p='',0
 for q in m:t+=q if l[p]==i else' ';p+=1
 print t

Javascript/ES6, 97 chars

f=s=>{for(n in s){m=o=d='';for(c of s)o+=n==(c<')'?d++:--d)?c:' ',m=m<d?d:m;n<m&&console.log(o)}}

Usage

f("(()(()())()((())))(())")

Explanation

fn=str=>{                          // accepts string of parenthesis
  for(line in str){                // repeat process n times where n = str.length
    max=output=depth='';           // max: max depth, output: what to print, depth: current depth
    for(char of str)               // iterate over chars of str
      output+=
        line==(char<')'?depth++:--depth)? // update depth, if line is equal to current depth
        char:' ',                  // append either '(', ')', or ' '
        max=max<depth?depth:max;   // update max depth
    line<max&&console.log(output)  // print if current line is less than max depth
  }
}

Retina + Bash, 27 bytes (14 + 10 + 3 = 27)

This makes use of ANSI Escapes:

\(
(\e[B
\)
\e[A)

Equivalent to sed -e "s/(/(\\\e[B/g;s/)/\\\e[A)/g". The \e[B escape code means move cursor down one row, and the \e[A means move cursor up one row, so this solution simply inserts those codes after and before the start and end of each nested pair of parentheses. Input is passed through STDIN.

You'll have to call it as printf $(Retina ...) to see the output correctly.

Output

(((())))
(\e[B(\e[B(\e[B(\e[B\e[A)\e[A)\e[A)\e[A)
^C
amans:~ a$ printf "(\e[B(\e[B(\e[B(\e[B\e[A)\e[A)\e[A)\e[A)"
(      )amans:~ a$ 
 (    )
  (  )
   ()

((()())()(()(())()))
(\e[B(\e[B(\e[B\e[A)(\e[B\e[A)\e[A)(\e[B\e[A)(\e[B(\e[B\e[A)(\e[B(\e[B\e[A)\e[A)(\e[B\e[A)\e[A)\e[A)
^C
amans:~ a$ printf "(\e[B(\e[B(\e[B\e[A)(\e[B\e[A)\e[A)(\e[B\e[A)(\e[B(\e[B\e[A)(\e[B(\e[B\e[A)\e[A)(\e[B\e[A)\e[A)\e[A)"
(                  )amans:~ a$ 
 (    )()(        )
  ()()    ()(  )()
             ()

Java, 232 226 224 222 bytes

Golfed version:

int i,j,k,l,m,a[];void f(String s){a=new int[s.length()];j=a.length;for(k=0;k<j;){a[k]=s.charAt(k++)<41?i++:--i;m=m<i?i:m;}for(k=0;k<m;k++)for(l=0;l<j;)System.out.print(k==a[l++]?i++%2<1?'(':l==j?")\n":')':l==j?'\n':' ');}

Long version:

int i, j, k, l, m, a[];
void f(String s) {
    a = new int[s.length()];
    j = a.length;
    for (k = 0; k < j;) {
        a[k] = s.charAt(k++) < 41 ? i++ : --i;
        m = m < i ? i : m;
    }
    for (k = 0; k < m; k++)
        for (l = 0; l < j;)
            System.out.print(k == a[l++] ? (i++ % 2 < 1 ? '(' : (l == j ? ")\n" : ')')) : (l == j ? '\n':' '));
}

The input string is analyzed first, looking for "(" and ")" to add/subtract a counter and store its value determining how far down the parentheses should go in an array while also keeping track of how deep the deepest one goes. Then the array is analyzed; the parentheses with lesser values are printed first, and will continue printing line by line until the maximum is reached.

I'll probably find ways to golf this further later.

R, 151 127 characters

S=strsplit(scan(,""),"")[[1]];C=cumsum;D=c(C(S=="("),0)-c(0,C(S==")"));for(j in 1:max(D)){X=S;X[D!=j]=' ';cat(X,sep='',fill=T)}

With indents and newlines:

S=strsplit(scan(,""),"")[[1]]
C=cumsum
D=c(C(S=="("),0)-c(0,C(S==")"))
for(j in 1:max(D)){
    X=S
    X[D!=j]=' '
    cat(X,sep='',fill=T)
    }

Usage:

> S=strsplit(scan(,""),"")[[1]];C=cumsum;D=c(C(S=="("),0)-c(0,C(S==")"));for(j in 1:max(D)){X=S;X[D!=j]=' ';cat(X,sep='',fill=T)}
1: ()(())((()))(())()
2: 
Read 1 item
()(  )(    )(  )()
   ()  (  )  ()   
        ()        
> S=strsplit(scan(,""),"")[[1]];C=cumsum;D=c(C(S=="("),0)-c(0,C(S==")"));for(j in 1:max(D)){X=S;X[D!=j]=' ';cat(X,sep='',fill=T)}
1: ((()())()(()(())()))
2: 
Read 1 item
(                  )
 (    )()(        ) 
  ()()    ()(  )()  
             ()     

It reads the string as stdin, splits it as a vector of single characters, computes the cumulative sum of ( and ), substracts the former with the latter (with a lag) thus computing the "level" of each parentheses. It then prints to stdout, for each level, either the corresponding parentheses or a space.

Thanks to @MickyT for helping me shortening it considerably!

cheating :( Retina + TeX, N bytes cheating :(

This only works if you render(?) the output using MathJax or some other TeX, which is currently disabled for this SE :(

\(
({
\)
})
\{\(
_{(

Each line should be in a different file, but you can test it by using Retina -e "\(" -e "({" -e "\)" -e "})" -e "\{\(" -e "_{(" (or the equivalent sed command sed -e "s/(/({/g;s/)/})/g;s/{(/_{(/g"). Input is passed through STDIN.

This works by enclosing the contents of each pair of parentheses in braces, and then subscripting all the items inside them.

Output

(((())))
(_{(_{(_{({})})})})

()(())((()))(())()
({})(_{({})})(_{(_{({})})})(_{({})})({})

((()())()(()(())()))
(_{(_{({})({})})({})(_{({})(_{({})})({})})})

TeX Output

Lex, 94 bytes

Depends on Linux console codes. With gcc, you can cut out four bytes by replacing both instances of \33 with an actual escape character.

%%
 int p[2]={0};
\( printf("(\33D");++p[!*p];
\) printf("\33M)");--*p;
\n while(p[1]--)ECHO;

To compile and run:

$ flex -o telescopic.c telescopic.l
$ gcc -o telecopic telescopic.c -lfl
$ ./telescopic
(()(()())()((())))(())
(                )(  )
 ()(    )()(    )  ()
    ()()    (  )
             ()
--- type ctrl-D ---

Perl, 76 bytes

$a[/\(/?$l++:--$l][$i++]=$_ for split//,<>;print map{$_||' '}@$_,"\n"for@a

No use strict here :)

C#, 196 bytes

Very simple complete program that takes input via STDIN, and outputs to STDOUT. I should like to get rid of the S.Length, but haven't found a way that pays.

using Q=System.Console;class P{static void Main(){var S=Q.ReadLine();for(int i=0,c;++i<S.Length;){var r="";c=0;foreach(var k in S)r+=(c+=81-k*2)+k-40==i?k:' ';if(r.Contains("("))Q.WriteLine(r);}}}

It simply iterates over the input a number of times (input length - 1), keeping track of the parentheses "depth", and comparing it to the current iteration count (i) - if they match, then it adds the current parenthesis to a string, to be printed at the end of the iteration. Because more iterations may be done than necessary, it only prints the iteration result (r) if it contains a parenthesis.

using Q=System.Console;

class P
{
    static void Main()
    {
        var S=Q.ReadLine(); // read input

        for(int i=0,c;
            ++i<S.Length; // can't be more than S.Length - 1 lines of output
            )
        {
            var r=""; // reset result
            c=0; // current paren depth
            foreach(var k in S) // for each char in input
                r+= // append something...
                    (c+=81-k*2) // move c
                    +k-40==i? // check if we should output the current char
                        k:
                        ' '; // otherwise a space
            if(r.Contains("(")) // only print if there is some content
                Q.WriteLine(r);
        }
    }
}

Perl, 91 89 88 84 80 79 bytes

$t=<>;{$_=$t;s/\((?{$l++})|.(?{--$l})/$^R==$c?$&:$"/ge;print,++$c,redo if/\S/}

Java, 233 214 bytes

void f(String s){int p,x,d,l=s.length();char c,m[]=new char[l*l];java.util.Arrays.fill(m,' ');p=x=0;while(x<l){d=(c=s.charAt(x))==40?p++:--p;m[d*l+x++]=c;}for(x=0;x<l*l;x++)System.out.print((x%l==0?"\n":"")+m[x]);}

Indented:

void f(String s){
    int p, x, d, l = s.length();
    char c, m[] = new char[l * l];
    java.util.Arrays.fill(m, ' ');
    p = x = 0;
    while (x < l){
        d = (c = s.charAt(x)) == 40
                ? p++
                : --p;
        m[d * l + x++] = c;
    }
    for (x = 0; x < l * l; x++)
        System.out.print((x % l == 0 ? "\n" : "") + m[x]);
}

I guess the final loop could be shortened, but I'll leave it as an exercise to the reader. ;-)


Old, 233 bytes answer:

void f(String s){int y=s.length(),x=0;char[][]m=new char[y][y];for(char[]q:m)java.util.Arrays.fill(q,' ');y=0;for(char c:s.toCharArray())if(c=='(')m[y++][x++]=c;else m[--y][x++]=c;for(char[]q:m)System.out.println(String.valueOf(q));}

Indented:

static void f(String s) {
    int y = s.length(), x = 0;
    char[][] m = new char[y][y];
    for(char[] q : m)
        java.util.Arrays.fill(q, ' ');
    y = 0;
    for(char c : s.toCharArray())
        if(c == '(')
            m[y++][x++] = c;
        else
            m[--y][x++] = c;
    for(char[] q : m)
        System.out.println(String.valueOf(q));
}

Ruby, 119 115 114

->s{r=[""]*s.size
d=0
s.chars.map{|l|r.map!{|s|s+" "}
b=l>"("?1:0
d-=b
r[d][-1]=l
d+=1-b}.max.times{|i|puts r[i]}}

Explanation:

->s{r=[""]*s.size  # Take an array of strings big enough
d=0                # This will contain the current depth
s.chars.map{|l|r.map!{|s|s+" "}  # Add a new space to every array
b=l>"("?1:0       # Inc/Dec value of the depth
d-=b               # Decrement depth if we are at a closing paren
r[d][-1]=l         # Set the corresponding space to the actual open/close paren
d+=1-b             # Increment the depth if we are at a opening paren
}.max.times{|i|puts r[i]}}  # Print only the lines up to the max depth

Haskell, 227 bytes

n _ []=[]
n h ('(':r)=('(',h):n(h+1)r
n d (')':r)=let h=d-1 in(')',h):n h r
m n []=n
m n ((_,h):r)=m(max h n)r
p s=let v=n 0 s;h=m 0 v;in map(\d->map(\(b,l)->if l==d then b else ' ')v)[0..h]
main=fmap p getLine>>=mapM_ putStrLn

Python 2, 92

def f(s,i=0,z=''):
 for x in s:b=x>'(';z+=[' ',x][i==b];i-=2*b-1
 if'('in z:print z;f(s,i-1)

Prints line by line. For a given line number i (actually, its negation), goes through the input string s, and makes a new string z that only contains the characters of s at depth i. This is done by incrementing or decrementing i to track the current depth, and adding the current characters when i is 0 adjusted for paren type, and otherwise adding a space.

Then, prints and recurses to the next i unless the current line was all spaces. Note that since the parens are balanced, the i after a loop is the same as at the start.

Python 3 would be same except for a character for print(z).

Python 2, 115 bytes

def f(L,n=0,O=()):
 for c in L:n-=c>"(";O+=" "*n+c,;n+=c<")"
 for r in map(None,*O):print"".join(c or" "for c in r)

Call like f("((()())()(()(())()))"), and output is to STDOUT.

Explanation

We start with n = 0. For each char in the input line:

The result is then zipped and printed. Note that Python's zip zips to match the length of the shortest element, e.g.

>>> zip([1, 2], [3, 4], [5, 6, 7])
[(1, 3, 5), (2, 4, 6)]

Usually one would use itertools.zip_longest (izip_longest) if they wanted zip to pad to the length of the longest element.

>>> import itertools
>>> list(itertools.izip_longest([1, 2], [3, 4], [5, 6, 7]))
[(1, 3, 5), (2, 4, 6), (None, None, 7)]

But in Python 2, this behaviour can be simulated by mapping None:

>>> map(None, [1, 2], [3, 4], [5, 6, 7])
[(1, 3, 5), (2, 4, 6), (None, None, 7)]

Python 3, 115 bytes

L,d,*O=input(),0
for i,c in enumerate(L):b=c>"(";O+="",;O[d-b]=O[d-b].ljust(i)+c;d-=b*2-1
for l in O:l and print(l)

No zipping, just padding appropriately with ljust. This one seems to have some golfing potential.

Pyth, 31 bytes

VzJs.e?YqN-/<zk\(/<zhk\)dzI-JdJ

Try it online.

-/<zk\(/<zhk\): Finds the appropriate level for the current character position.

?YqN-/<zk\(/<zhk\)d: A space if the appropriate level is not the current level, current character otherwise.

Js.e?YqN-/<zk\(/<zhk\)dz: Generate the string, save it to J.

I-JdJ: If J is not all spaces, print it out.

Vz: Loop z times.

IDL 8.4, 173 177 bytes

This is similar enough to the formatter challenge that I had half a solution already. IDL is still a terrible golfing language, but I'm pretty happy with how this worked out.

read,(p='')&a=[0:strlen(p)-1]&c=strmid(p,a,1)&e=c.map(lambda(x,d:'('eq x:d++:d---1)))&print,[0:max(e)].map(lambda(x,y,z:y.reduce(lambda(t,u,v,w,:t+(w eq v?u:' ')),x,z),c,a))&end

Un-golfed:

read,(p='') ;read a string from input
a=[0:strlen(p)-1] ;index array to the input
c=strmid(p,a,1) ;split the input into an array of 1-char substrings
e=c.map(lambda(x,d:'('eq x:d++:d---1))) ;for each substring, increment depth if ( and decrement otherwise, saving depth each time
print,[0:max(e)].map(lambda(x,y,z:y.reduce(lambda(t,u,v,w,:t+(w eq v?u:' ')),x,z),c,a)) ;print an array of strings, each one including the parens in that depth level.
end ;end the script

Pip, 53 bytes

Pip is a code-golf language of my invention. The first version was published on Saturday, so I can officially take it for a spin! The solution below isn't terribly competitive as golfing languages go, but that's partly because I haven't implemented things like zip and max yet.

z:{aEQ'(?++v--v+1}MaW(o:{z@++v=i?as}Ma)RMs{Pov:-1++i}

Expects the string of parentheses as a command-line argument.

"Ungolfed" version:

z:{
   a EQ '( ?
    ++v
    --v+1
  } M a
W (o:{
      z @ ++v = i ?
       a
       s
     } M a
  ) RM s
{
 P o
 v:-1
 ++i
}

Explanation:

Unlike most golfing languages, Pip is imperative with infix operators, so the syntax is somewhat closer to C and its derivatives. It also borrows ideas from functional and array-based programming. See the repository for further documentation.

The program first generates a list of depths (storing it in z) by mapping a function to the input string a. The global variable v tracks the current level. (Variables a-g in Pip are function-local variables, but h-z are global. v is handy because it's preinitialized to -1.)

Next, we use a While loop to generate and print each line, until the line generated would consist of all spaces. v is now used for columns, and i for rows. The {z@++v=i?as} function, repeatedly mapped to the original input string, tests whether the current line i matches the line the current parenthesis is supposed to be on (as stored in the z list). If so, use the parenthesis (a); if not, use s (preinitialized to space). The end result is that on each iteration, o gets assigned a list of characters equivalent to the next line of the output.

To test whether we should continue looping, we check if o with all the spaces RM'd is empty. If not, print it (which by default concatenates everything together as in CJam), reset the column number to -1, and increment the row number.

(Fun fact: I had a 51-byte solution at first... which didn't work because it turned up a bug in the interpreter.)

J, 46

Not as great as the other 'golfing languages', but in my defence: J is terrible with strings.

[:|:(((,~(' '#~]))"0)(0,2%~[:+/\2+/\1-'(('i.]))~

Takes the string as input for a function. There's also probably a better way to do it in J.

Usage:

   f=:[:|:(((,~(' '#~]))"0)(0,2%~[:+/\2+/\1-'(('i.]))~
   f '(()(()())()((())))(())'
(                )(  )
 ()(    )()(    )  () 
    ()()    (  )      
             ()       

Octave, 85 chars

function r=p(s)i=j=0;for b=s k=b==40;k&&++j;t(j,++i)=9-k;k||--j;r=char(t+32);end;end

It's an optimization of the naïve approach, which is actually pretty natural for Matlab and Octave:

function r=p(s)
i=j=1;
for b=s
 if b=='(' t(++j,i++)='(' else t(j--,i++)=')' end; end; t(~t)=' '; r=char(t);
end;

The table t may even not yet exist, and we may assign to any element right away, and it reshapes to the smallest dimension that is required for this element to exist which is quite convenient.

GNU Bash + coreutils + indent, 135

eval paste "`tr '()' {}|indent -nut -i1 -nbap|sed 's/.*/<(fold -1<<<"&")/'|tr '
' \ `"|expand -t2|sed 'y/{}/()/;s/\(.\) /\1/g;s/ \+$//'

Input/output via STDIN/STDOUT:

$ ./telescopic.sh <<< "(()(()())()((())))(())"
(                )(  )
 ()(    )()(    )  ()
    ()()    (  )
             ()
$ 

indent does most of the heavy lifting, but needs to work with braces instead of parens. The rest is modification of this answer to transpose the output of indent.

CJam, 43 41 36 bytes

Not too golfed (I think), but here goes my first attempt:

l:L,{)L<)_')=@~zS*\+}%_$0=,f{Se]}zN*

How it works

I am using the very handy fact that ) and ( in CJam mean increment and decrement respectively. Thus, I simply evaluate the brackets to get the depth.

l:L,{)L<)_')=@~zS*\+}%_$0=,f{Se]}zN*
l:L,{                    }%                "Store input line in L and iterate over [0,L)";
     )L<                                   "substr(L, 0, iterator + 1)";
        )                                  "Slice off the last character to stack";
         _')=                              "Put 0 on stack if the sliced character is (,
                                            else 1 if sliced character is )";
             @~                            "bring forth the remaining
                                            brackets after slicing and evaluate them";
               zS*                         "Stack has negative depth number, take absolute
                                            value and get that many spaces";
                  \+                       "Prepend to the sliced character";
                      _$0=,                "Get the maximum depth of brackets";
                           f{Se]}          "Pad enough spaces after each string to match
                                            the length of each part";
                                 zN*       "Transpose and join with new lines";

Try it online here

C, 150 bytes

t;f(char*c){char l=strlen(c)+1,o[l*l],*A=o,m=0;for(t=1;t<l*l;t++)o[t-1]=t%l?32:10;for(t=-1;*c;c++)A++[l*(*c-41?++t>m?m=t:t:t--)]=*c;A[m*l]=0;puts(o);}

This was crazy fun to golf. I'm still not convinced I'm done with it.

We define a single function, f, that takes the string as input and outputs to stdout.

Let's go through the code, line by line:

/* t will represent the current depth of a parentheses. It must be an int. */
t;
f(char*c){
    //Our variables:
    char l=strlen(c)+1,    //The length of each row of output, including newlines
         o[l*l],           //The output string. It's way larger than it needs to be.
         *A=o,             //We need another pointer to keep track of things.
         m=0;              //The maximum depth recorded thus far.

    for(t=1;t<l*l;t++)     //For each character in our output...
        o[t-1]=t%l?32:10;  //If it's at the end of a line, make it '\n'. Else, ' '.
    for(t=-1;*c;c++)       //While we have an input string...
        //Perhaps a personal record for ugliest warning-less line...
        A++[l*(*c-41?++t>m?m=t:t:t--)]=*c;
    /* 
        A breakdown:
        A++        --> Go to the next *column* of output, after writing. 
                   --> There will only ever be one parentheses per output column.
        [l*(...)]  --> A[l*X] is the character in the current column at depth X.
        (*c-41?    --> If the character is a '('...    
        ++t>m?     --> Increment t *before* we write it. If this is a new highest depth
        m=t:       --> Set m to t, and set the whole expression to t.
        t:         --> If it's not a new highest depth, don't set m.
        t--)       --> If the character was a ')', decrement t *after* we write it.
        =*c        --> Write our output character to whatever the input read.
    */    
    
    A[m*l]=0; //The last character of the maximum-depth line should be null terminated.
    puts(o);  //Output!
}

I'll answer any questions you may have!

Try a test program online!