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/