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/