Question: Say I have text like this (each word on one line, with no spaces)

```
Programming
Puzzles
&
Code
Golf

```

That makes no sense! It totally defies the laws of physics.

Your challenge is to remedy this impossible situation and collapse the text like so:

```
P
Prog
&uzz
Coderam
Golflesming

```

So that there is no empty space underneath any character but the characters retain their vertical order.

The goal is to satisfy the requirements but use the fewest bytes of source code possible.

Answer: 
Python 2, 104 bytes
-------------------

```python
l=[]
for x in input().split('\n'):n=len(x);l=[a[:n]+b[n:]for a,b in zip(l+[x],['']+l)]
print'\n'.join(l)

```

An iterative one-pass algorithm. We go through each line in order, updating the list `l` of lines to output. The new word effectively pushes from the bottom, shifting all letters above it one space. For example, in the test case

```
Programming
Puzzles
&
Code
Golf

```

after we've done up to `Code`, we have 

```
P
Prog
&uzzram
Codelesming

```

and then adding `Golf` results in 

```
P
Prog
&uzz
Coderam
Golflesming

```

which we can view as the combination of two pieces

```
P     |
Prog  |
&uzz  |
Code  | ram
Golf  | lesming

```

where the first piece got shifted up by `golf`. We perform this shifting with a `zip` of the output list with the element at the end (left side) and output list precedence by a blank line (right side), cutting off each part at the length of the new element.

It might seem more natural to instead iterate backwards, letting new letters fall from the top, but my attempt at that turned out longer.

For comparison, here's a `zip`/`filter` approach, with `map(None,*x)` used for `iziplongest` (109 bytes):

```python
f=lambda z:[''.join(filter(None,x))for x in map(None,*z)]
lambda x:'\n'.join(f(f(x.split('\n')[::-1]))[::-1])

```
JavaScript (ES6), 146
=====================

(The 2 newlines inside template strings are significant and counted)

The idea of @Dennis implemented in JavaScript. The lengthy S function do the transposition line by line and char by char, leaving the result in the `t` array.

```
a=>(S=z=>{for(t=[];z.join``;t.push(w))for(w='',n=z.length;n--;z[n]=z[n].slice(1))w+=z[n][0]||''},S(a.split`
`),S(t.reverse()),t.reverse().join`
`)

```

Less golfed inside the snippet (try in Firefox)

```js
F=a=>(
  S=z=>{
    for(t=[];z.join``;t.push(w))
      for(w='',n=z.length;n--;z[n]=z[n].slice(1))
        w+=z[n][0]||''
  },
  S(a.split`\n`),
  S(t.reverse()),
  t.reverse().join`\n`
)
```

```css
#I,#O { margin:0; width: 200px; height:100px; border: 1px solid #ccc }
```

```html
<table><tr><td>
Input<br><textarea id=I>Programming
Puzzles
&
Code
Golf
</textarea></td><td>
Output<pre id=O></pre>
</td></tr></table>  
<button onclick='O.innerHTML=F(I.value)'>go</button>
```