メインコンテンツへスキップ
見出し画像

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

     フラクタル(自己相似形)画像の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(=27=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 で味わう、意外な確率          
    ▷ 再帰関数  ▷ シェルピンスキーのギャスケット


     
     
    情報科・数学科教員にして   作家・旅人・芸人 AI評論家・火山ハンター

    あなたへのおすすめ