シェルピンスキーのギャスケット
フラクタル(自己相似形)画像の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 で味わう、意外な確率
▷ 再帰関数 ▷ シェルピンスキーのギャスケット
この記事が気に入ったらサポートをしてみませんか?