绘制旋转风车


30

还记得您吹过的那些有趣的风车,它们一圈又一圈旋转吗?让我们编写一个!

风车将具有\ | / _绘制其中心和手臂的一组字符。一个可能的风车可能看起来像这样:

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

但是什么是不旋转的风车呢?没有乐趣!我们可以通过重新排列符号来使其旋转:

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

挑战在于创建一个程序,该程序需要三个整数并输出如下所示的风车。其中第一个是它具有的臂数,第二个是风车的臂的长度,第三个是它将顺时针旋转八分之一圈的次数。

您可以假设以下内容:

  • 臂数始终为0、1、2、4或8。
  • 所有的手臂将彼此等距隔开。
  • 风车的初始位置将具有如下中心:

     _
    |_|
    
  • 如果臂数为1,则可以决定臂指向哪个方向。

  • 如果臂数为2,则可以决定使臂垂直或水平指向。

您可以编写通过STDIN或命令行参数接受输入的完整程序,或通过函数参数接受输入的函数。您的程序必须显示一系列显示风车旋转的输出,每个输出至少由一个空行分隔。风车的中心不应移动超过一个空间。您可以根据需要输出任意数量的前导和尾随空格。

这里有些例子:

0 2 1

 _
|_|

/\
\/

1 3 2

|
|
|_
|_|

   /
  /
 /
/\
\/

 _ ___
|_|

2 2 0

   _ __
__|_|

8 4 1

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

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

这是代码高尔夫,所以最短的代码获胜。祝好运!


输出中是否可以包含尾随换行符?
usandfriends 2013年

允许使用尾随的换行符,而对数量没有限制。
TNT

同样对于最后一个示例,对于第一个输出,每行前面都有一个多余的空间。我们可以在输出中添加前置和结尾空格吗?
usandfriends

输出中前导空格的数量与风车中心的位置有关,其位置的偏移不应超过一个空格。如果风车的旋转会导致手臂在输出中稍后到达风车中心的左端(例如对于输入1 3 5并且手臂最初朝上),则需要在较早的输出中添加空格以适应此情况。
TNT

Answers:


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个可能的臂中的每个臂的起始位置,符号和方向都被硬编码。然后,绘制它们就很容易了。

要旋转所有东西,我只需在正方形和菱形底座之间切换,然后增加每个手臂,顺时针旋转一次即可。


您可以删除空格的地方,如' ' for' 'for'] for]for'供于8 8for'print ''print''
Rɪᴋᴇʀ

真好!我很高兴看到这个挑战的答案。
TNT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.