見出し画像

シェルピンスキーのギャスケット

 フラクタル(自己相似形)画像の1種「シェルピンスキーのギャスケット」を描くコードを Python で書いてみた。

 下のコード、たぶん世界で一番(?)短い。私の自慢である。昨日一日かけて何とか完成した。

n=int(input("何段? "))
dan="▲"
for i in range(n):
    print(dan)
    s="▲"
    for j in range(i):
        if dan[j]==dan[j+1]:
            s=s+" "
        else:
            s=s+"▲"
    dan=s+"▲"

 本来この図形の作り方は「大きな正三角形から、その4分の1の逆三角形をくり抜くという操作を(無限回)繰り返す」のだが、ここでは文字「▲」と「 」(空白)をたくさん書くことで成し遂げた次第である。また「▲」を2つ並べれば(▲▲)、その間に自然と「▽」が見えることも利用している。
 上のコードの1行目の input 文で「128」と入力して、128($${=2^7}$$)段の図形を描いた。一応付け加えると、コードを実行して得た文字列をワードに貼り付けて、中揃えにして、行間隔・文字間隔を調整したものが上図である。
 ところで、私がそれを思いついたのは「パスカルの三角形」との類似性から。結論を言ってしまうと、パスカルの三角形の数のうち、奇数を「▲」に、偶数を(空白)にすれば「シェルピンスキーのギャスケット」になるのだ。上のコードの7行目〜10行目がその処理をしている部分に当たる。
 それを2重ループの中で繰り返し行っているわけだが、大ループ1回転で出来上がりの図形の1行分を描き、小ループで「▲」か(空白)を描き分けているというわけだ。

if dan[j]==dan[j+1]:    # 真上にある2つの文字が同じ( ▲ と ▲ 、または 空白 と 空白 )なら、
    s=s+" "              #     空白を書き、
 else:                  # 同じでない( ▲ と 空白 、または 空白 と ▲ )なら、
    s=s+"▲"             #     ▲ を書く

 何はともあれ、うまく出来た。めでたし、めでたし。もう一度言うが、このコードが世界で一番短い!・・・かも。

◇      ◇      ◇

〜 Python Python でお絵描きたぁいむ 〜
▷ Python で文字図形を描く     
▷ Turtle と一緒にお絵描きたぁぃむ
▷ シェルピンスキーのギャスケット

Python でグラフを描く 〜 
▷ 関数を定義してグラフを描くまで       
▷ Python で味わう、意外な確率          
▷ 再帰関数  ▷ シェルピンスキーのギャスケット


この記事が気に入ったらサポートをしてみませんか?