ドラクエのシミュレーター時間かかるので
簡単なやつですんません。

パスカルの三角形をご存知でしょうか?
結構綺麗な図表ができますよねーー

逆三角的なやつも考えてみました。
頭の体操にはもってこいの題材ですね。

解説動画はこちら




さてパスカルの三角形は
Wikipediaによると
download

まず最上段に 1 を配置、それより下の段は両端には 1 
それ以外の位置には右上の数と左上の数の和を配置

上から n 段目、左から k 番目の数は、二項係数に等しいんだそうです。

download-1

この値は階乗などから計算することができます。

Pythonではmath.factorialで階乗を求められるので

nCk の部分は
math.factorial(n)//(math.factorial(k)*math.factorial(n-k))

と言うように書けるかなと思います。

さて
それでは三角形を描くコードを考えてみましょう。

段数を先に決めて、その段数分計算しましょう。
import math

size = 10
for row in range(1,size+1):
    for k in range(1,row+1):
        n = row-1
        k = k-1
        res = math.factorial(n)//(math.factorial(k)*math.factorial(n-k))
        print(res,end='    ')
    print()
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から始まり
上の段の分を足すと下の数値になっていますね。

まあ、print関数は左から出力してしまうので
綺麗な三角形にはなりませんねーーー

無理くり三角形ぽくしたのが次のコードです。

先に下の段の長さを測っておき
その長さに中央揃えして無理やり三角形を作ります。
import math

size = 12
ms = ['{0} '.format(math.factorial(size-1)//(math.factorial(k-1)*math.factorial(size-k))) for k in range(1,size+1)]
ln = len(' '.join(ms))
for row in range(1,size+1):
    ps = ['{0} '.format(math.factorial(row-1)//(math.factorial(k-1)*math.factorial(row-k))) for k in range(1,row+1)]
    result = ' '.join(ps)
    print(result.center(ln, ' '))
                         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個になります。

コードは次のようになりました。
q = [21,35,76,56,23,46,19]
answer=[q]
for j in range(len(q)-1):
    tmp = []
    for i in range(len(answer[j])-1):
        tmp.append(answer[j][i]+answer[j][i+1])
    answer.append(tmp)
answer.reverse()
for num in answer:
    print()
    print('    '.join(map(str, num)))

3131 1677 1454 864 813 641 410 454 359 282 167 243 211 148 134 56 111 132 79 69 65 21 35 76 56 23 46 19

あまりコードは綺麗ではないですが
ちゃんと下から上に向かって足されていってますね。

こう言うプログラミングは
頭の体操にはとっても良い気がします。

プログラミングがなかなか上達しない
そんな方はこう言う問題を解くコードを
いろいろ試してみると良いかもしれません。

今回はこれまでです。
それでは。