OK, here's my solution. I've tried to make it as compact, neat and  
ruby-ish as possible. (It's not space efficient, in that it stores  
the entire triangle before printing it.)

require 'enumerator'

# Generate the triangle.
n = ARGV[0].to_i
rows = (2..n).inject([[1]]) do |rows, i|
   rows << ([0]+rows[-1]+[0]).enum_cons(2).map{|a,b| a+b }
end

# Work out the length in digits of the longest number.
m = rows[-1][n/2].to_s.length
# Print each row with appropriate spacing.
rows.each do |row|
   print ' '*m*(n-row.length)
   print row.collect {|i| sprintf("%#{m}d", i) }.join(' '*m)
   print "\n"
end


Output looks like this:

                                       1
                                    1     1
                                 1     2     1
                              1     3     3     1
                           1     4     6     4     1
                        1     5    10    10     5     1
                     1     6    15    20    15     6     1
                  1     7    21    35    35    21     7     1
               1     8    28    56    70    56    28     8     1
            1     9    36    84   126   126    84    36     9     1
         1    10    45   120   210   252   210   120    45    10     1
      1    11    55   165   330   462   462   330   165    55     
11     1
   1    12    66   220   495   792   924   792   495   220    66     
12     1


Pete Yandell
http://9cays.com/