回転する風車を描く


30

あなたが吹くそれらの楽しい風車を覚えており、それらはくるくると回転しますか?1つコーディングしましょう!

風車には、\ | / _中心と腕を描くキャラクターのセットがあります。1つの可能な風車は次のようになります。

    |
    |
    |_ ___
 ___|_|
      |
      |
      |

しかし、回転しない風車とは何ですか?楽しくない!シンボルを再配置することでスピンさせることができます:

      /
\    /
 \  /
  \/\
   \/\
   /  \
  /    \
 /

課題は、3つの整数を取り、以下に指定するように風車を出力するプログラムを作成することです。これらの1つ目はアームの数、2つ目は風車のアームの長さ、3つ目は時計回りに1/8回転する回数です。

次のことを想定できます。

  • アームの数は常に0、1、2、4、または8です。
  • すべてのアームは互いに等間隔に配置されます。
  • 風車の初期位置の中心は次のようになります。

     _
    |_|
    
  • 腕の数が1の場合、腕が指す方向を決定できます。

  • 腕の数が2の場合、腕を垂直または水平に向けることができます。

STDINまたはコマンドライン引数を介して入力を受け取る完全なプログラム、または関数引数を介して入力を受け取る関数を作成できます。プログラムは、風車の回転を示す一連の出力を表示する必要があります。各出力は、少なくとも1つの空行で区切られています。風車の中心は、1スペース以上移動しないでください。必要なだけ先頭および末尾のスペースを出力できます。

ここではいくつかの例を示します。

0 2 1

 _
|_|

/\
\/

1 3 2

|
|
|_
|_|

   /
  /
 /
/\
\/

 _ ___
|_|

2 2 0

   _ __
__|_|

8 4 1

 \   |    /
  \  |   /
   \ |  /
    \|_/____
 ____|_|
     / |\
    /  | \
   /   |  \
  /    |   \

     |   /
 \   |  /
  \  | /
   \ |/
____\/\____
     \/\
     /| \
    / |  \
   /  |   \
  /   |

これはコードゴルフなので、最短のコードが勝ちます。がんばろう!


出力に末尾の改行を含めることはできますか?
usandfriends

末尾の改行は、量に関する制限なしで許可されます。
TNT

また、最後の例では、最初の出力用に各行の先頭に余分なスペースが追加されています。出力に先頭および末尾のスペースを追加できますか?
-usandfriends

出力の先頭スペースの数は、風車の中心の位置と関係があり、その位置は複数のスペースでシフトしてはなりません。ピンホイールの回転により、アームが出力の後半でピンホイールの中心の左側にくる場合(入力1 3 5および最初に上向きのアームなど)、これに対応するために、以前の出力にスペースを追加する必要があります。
TNT

回答:


4

Pythonの2 535 517 473 468バイト

@Easterly Inkのおかげで5バイト節約されました!

入力はコンマで区切られると予想されます(つまり、numArms、armLength、numRots)

ゴルフバージョン

n,l,t=input()
b=[7,3,1,5,0,4,2,6][:n]
w=5+2*l
h=w-3
X=w/2
Y=h/2-1
z=range
d=[0,1,1,1,0,-1,-1,-1]
for j in z(t+1):
 g=[[' 'for _ in[1]*w]for _ in[1]*h];a=j%2;b=[(k+1)%8for k in b];print''
 if a:g[Y][X:X+2]='/\\';g[Y+1][X:X+2]='\\/'
 else:g[Y][X+1]='_';g[Y+1][X:X+3]='|_|'
 for k in b:k=k+8*a;x=[0,2,3,3,2,0,-1,-1,0,1,2,2,1,0,-2,-1][k]+X;y=[0,0,0,2,2,2,1,0,-1,-1,0,1,2,2,0,0][k]+Y;exec"g[y][x]='|/_\\\\'[k%4];x+=d[k%8];y+=d[(k-2)%8];"*l
 for k in z(h):print''.join(g[k])

非ゴルフバージョン

numArms, armLength, rotAmount = input()

# Choose which arms to draw
arms = [0,4,2,6,1,5,3,7][:numArms]
for i in xrange(rotAmount+1):

    # Set up the grid spacing
    maxWidth = 5 + 2 * armLength
    maxHeight = 2 + 2 * armLength
    grid = [[' ' for x in xrange(maxWidth)] for y in xrange(maxHeight)]

    # Add the base square
    angle = i%2
    startX = len(grid[0])/2
    startY = len(grid)/2 - 1
    if angle:
        grid[startY][startX:startX+2] = '/\\'
        grid[startY+1][startX:startX+2] = '\\/'
    else:
        grid[startY][startX+1] = '_'
        grid[startY+1][startX:startX+3] = '|_|'

    for armNum in arms:
        # Determine where this arm starts
        armIdx = armNum + 8*angle;
        armX = [0,2,3,3,2,0,-1,-1,0,1,2,2,1,0,-2,-1][armIdx] + startX
        armY = [0,0,0,2,2,2,1,0,-1,-1,0,1,2,2,0,0][armIdx] + startY

        # Determine the direction it travels
        d = [0,1,1,1,0,-1,-1,-1]
        dirX = [0,1,1,1,0,-1,-1,-1][armIdx%8]
        dirY = [-1,-1,0,1,1,1,0,-1][(armIdx)%8]
        sym = '|/_\\'[armIdx%4]

        # Draw the arm
        for i in xrange(armLength):
            grid[armY][armX] = sym
            armX += dirX
            armY += dirY

    # Increment which arms to draw next
    arms = [(a+1)%8 for a in arms]
    for i in xrange(len(grid)):
        print ''.join(grid[i])
    print ''

説明

故障した場合は非常に簡単です。最初に必要なグリッドの大きさを把握してから、ベースの正方形またはダイヤモンドをプロットします。

各アームの開始位置、シンボル、および方向は、正方形およびダイヤモンドベースの8つの可能なアームのそれぞれにハードコードされています。次に、それらを描くのは簡単です。

すべてを回転させるには、正方形と菱形のベースを切り替えてから、各アームをインクリメントして時計回りに1回回転します。


あなたは、のような場所にスペースを削除することができます' ' for' 'for'] for]for'へののために、8を8for'print ''しますprint''
Rɪᴋᴇʀ

いいね!この挑戦に対する答えを見て本当にうれしいです。
TNT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.