Python、456 429 381
import turtle as t
L="fl"
R="fr"
d=L*3+R*3
b=(d+R)*3
a=[b,120,L*3+"fflflffflflfrflflfffl"+R*4+"flf",90,b+"ffrfrflffrffrfrfrflflf",120,(R*5+L*5+R+L)*5+"rrfr"+L*5+R*2+L*2+R*4+"f",72,(d+"f")*5+"rfl"+((d+"b")*5)[:-1],120]
l=t.lt
f=t.fd
b=t.bk
r=t.rt
p=input()*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
for c in a[p]:exec c+"(a[p+1])"
t.getscreen().getcanvas().postscript(file="o")
l r f b
図形の角度でタートルカーソルを動かす演算子としてプリミティブインタープリターを実装しました。一度に、1つの角度だけ回転します。文字列(擬似サブルーチンのような)を再利用して文字列を圧縮しましたが、それ以外は、最適なパスを使用しているかどうかを確認しませんでした。ポストスクリプトファイルに出力します。
ゴルフされていないコードの簡単な説明:
import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b
組み込みのturtleモジュールをインポートし、文字列を短縮するマクロを定義します。turtleモジュールはコマンドを使用して「亀」を画面上で動かします(すなわち、forward(100)、left(90))
netList=[
#tetrahedron
tetrahedron,120,
#cube
Left*3+"fflflffflflfrflflfffl"+Right*4+"flf",90,
#octohedron, builds off the tetrahedron
tetrahedron+"ffrfrflffrffrfrfrflflf",120,
#dodecahedron
(Right*5 + Left*5 + Right + Left)*5
+"rrfr"+
Left*5 + Right*2 + Left*2 + Right*4 + "f",72,
#icosahedron
(diamond+"f")*5 +"rfl"+((diamond+"b")*5)[:-1],120
]
このリストには、角度と移動シーケンスが含まれています。四面体は、八面体で再利用するために保存されました。
l=t.left
f=t.forward
b=t.back
r=t.right
これは私が気に入っている部分です。1文字のローカル関数を作成するため、定義済みの文字列を使用して呼び出しを短縮および自動化できます。
input=int(raw_input())*2-2
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
これは、入力(1〜5)を取得し、それをnetList内の図形文字列を指すインデックスに変換することから始まります。これらの設定タートルは、ネット全体を表示します。タスクが単にそれらを描くことである場合、これらは省略できますが、画像出力が必要なので、それらは必要です。
for command in netList[input]:
exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")
forループは、コマンドシーケンス文字列内のコマンドを受け取って実行するため、「fl」などの文字列の場合、「forward(angle); left(angle);」を実行します 新しく作成されたローカル関数を呼び出します。最後の行は、タートル関数を使用したポストスクリプト形式の「o」というファイルを出力します。
実行するには:
それをファイルにコピーして、そこから実行します。実行すると、1から5の間の数値入力を待機します(タートルを設定する前に尋ねるように変更しました)。数字を入力すると、ウィンドウがポップアップしてネットを描画します。速くしたい場合は、t.speed(200)
前に追加できますsetup
。
インタプリタにコピーアンドペーストできますが、raw_input()
呼び出されると"t.setup(.9,.9)"
、数値ではなく入力した次の文字列を消費します。したがって、これを行う場合はraw_input()
、残りの部分をコピーして貼り付けるよりも、数値を入力するまでコピーします。全体として実行することを目的としています。または、関数にコピーして呼び出すこともできます。
出力は次のとおりです(ポストスクリプトから変換):
注:ウィンドウ内のこれらの位置は変更されていますが、全体的な形状は同じです。

コードゴルフでは少し強引ですが、形の間で一貫したパターンを見つけようとするのにうんざりしました。