[RUBY] Draw Pascal's triangle

I read Mathematics Girl/Randomized Algorithm and thought that Pascal's triangle looks very interesting, so I drew it in Ruby.

Output example

5 steps


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

21 steps


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 

Source code

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 "Draw a Pascal's triangle\n How many steps do you draw??"
n = gets.chomp.to_i
@arrays = []
cal_pascals_triangle(n)
drow_all_lines(@arrays)

Method of calculation

It is calculated one step at a time. The value is calculated by adding the values ​​in the previous row. (We are not asking for the number of combinations.)

Depiction method

All stages are described together. Each value is output with the vertical position of the ones place as the base point.

bonus

I reduced the display and tried to output 45 steps.

68e289310121ad3e4c53807e3b5487c5.png

Recommended Posts

Draw Pascal's triangle
Combination calculation (Pascal's triangle) (Java)