LoginSignup
0

More than 3 years have passed since last update.

パスカルの三角形を描く

Last updated at Posted at 2020-12-31

数学ガール/乱択アルゴリズムを読んで、パスカルの三角形がとても面白そうだと思い、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段出力してみました。

68e289310121ad3e4c53807e3b5487c5.png

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0