パスカルの三角形を描く


数学ガール/乱択アルゴリズムを読んで、パスカルの三角形がとても面白そうだと思い、Rubyで描いてみました。

出力例

5段


1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 

 
21段


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 
1 13  78  286  715  1287  1716  1716   1287    715    286     78     13     1 
1 14  91  364 1001  2002  3003  3432   3003   2002   1001    364     91    14     1 
1 15 105  455 1365  3003  5005  6435   6435   5005   3003   1365    455   105    15     1 
1 16 120  560 1820  4368  8008 11440  12870  11440   8008   4368   1820   560   120    16    1 
1 17 136  680 2380  6188 12376 19448  24310  24310  19448  12376   6188  2380   680   136   17    1 
1 18 153  816 3060  8568 18564 31824  43758  48620  43758  31824  18564  8568  3060   816  153   18   1 
1 19 171  969 3876 11628 27132 50388  75582  92378  92378  75582  50388 27132 11628  3876  969  171  19  1 
1 20 190 1140 4845 15504 38760 77520 125970 167960 184756 167960 125970 77520 38760 15504 4845 1140 190 20 1 

ソースコード

def cal_pascals_triangle(n)
  ary_i = []
  (1..n).each do |i|
    ary_i = cal_one_line(i, ary_i)
    @arrays.push(ary_i)
  end
end

def cal_one_line(i, ary_i)
  ary_i_minus_1 = []
  (i - 1).times do |j|
    ary_i_minus_1 << ary_i[j]
  end
  ary_preparing = [1]
  ((i - 1) / 2).times do |j|
    ary_preparing << (ary_i_minus_1[j] + ary_i_minus_1[j + 1])
  end
  ary_i = ary_preparing + ary_preparing.reverse
  ary_i.delete_at(i/ 2) if i.odd?
  ary_i
end

def drow_all_lines(arrays)
  arrays.each do |line|
    line.each_with_index do |element, index|
      difference = arrays.last[index].to_s.size - element.to_s.size
      print ' ' * difference if difference > 0
      print element.to_s + ' '
    end
    print "\n"
  end
end

puts "パスカルの三角形を描きます\n何段まで描きますか?"
n = gets.chomp.to_i
@arrays = []
cal_pascals_triangle(n)
drow_all_lines(@arrays)

計算方法

1段ずつ計算しています。
前段の値を足し合わせて、値を算出しています。
(組み合わせの数を求めているわけではありません。)

描写方法

全段まとめて描写しています。
一の位の垂直方向の位置を基点として、各値を出力するようにしました。

おまけ

ディスプレイを縮小して、45段出力してみました。