Vẽ một vòng quay


30

Bạn có nhớ những chiếc đinh ghim thú vị mà bạn thổi vào và chúng quay tròn và tròn không? Hãy mã một!

Một pinwheel sẽ có tập hợp các ký tự \ | / _vẽ trung tâm và cánh tay của nó. Một pinwheel có thể có thể trông như thế này:

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

Nhưng những gì một bánh đà không quay? Không vui! Chúng ta có thể làm cho nó quay bằng cách sắp xếp lại các biểu tượng:

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

Thách thức là tạo ra một chương trình lấy ba số nguyên và xuất ra một vòng quay như được chỉ định dưới đây. Đầu tiên trong số này là số cánh tay mà nó có, thứ hai là chiều dài của cánh tay của con quay và thứ ba là số lần nó sẽ quay một phần tám của một cuộc cách mạng theo chiều kim đồng hồ.

Bạn có thể giả sử như sau:

  • Số lượng vũ khí sẽ luôn là 0, 1, 2, 4 hoặc 8.
  • Tất cả các cánh tay sẽ cách đều nhau.
  • Vị trí ban đầu của bánh đà sẽ có tâm của nó như thế này:

     _
    |_|
    
  • Nếu số lượng cánh tay là 1, bạn có thể quyết định hướng nào của cánh tay.

  • Nếu số lượng cánh tay là 2, bạn có thể quyết định làm cho cánh tay chỉ theo chiều dọc hoặc chiều ngang.

Bạn có thể viết một chương trình đầy đủ nhận đầu vào thông qua STDIN hoặc đối số dòng lệnh hoặc một hàm lấy đầu vào thông qua các đối số chức năng. Chương trình của bạn phải hiển thị một chuỗi các kết quả đầu ra cho thấy vòng quay của pinwheel, mỗi vòng được phân tách bằng ít nhất một dòng trống. Trung tâm của vòng quay không được di chuyển nhiều hơn một khoảng trống. Bạn có thể xuất ra càng nhiều khoảng trống hàng đầu và dấu nếu cần.

Dưới đây là một số ví dụ:

0 2 1

 _
|_|

/\
\/

1 3 2

|
|
|_
|_|

   /
  /
 /
/\
\/

 _ ___
|_|

2 2 0

   _ __
__|_|

8 4 1

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

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

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng. Chúc may mắn!


Có thể có một dòng mới trong đầu ra?
tôi vào

Trailing newlines được cho phép, không hạn chế liên quan đến số tiền.
TNT

Ngoài ra, với ví dụ cuối cùng, bạn có thêm một không gian được thêm vào mỗi dòng cho đầu ra đầu tiên. Chúng ta có thể có không gian được chuẩn bị trước và theo dõi trong đầu ra không?
tôi vào

Số lượng không gian hàng đầu trong đầu ra phải được thực hiện với vị trí của tâm của vòng quay, vị trí không được dịch chuyển nhiều hơn một khoảng trắng. Nếu vòng quay của vòng quay sẽ khiến một cánh tay kết thúc bên trái trung tâm của vòng quay sau trong đầu ra (chẳng hạn như đầu vào 1 3 5và cánh tay hướng lên trên), không gian sẽ cần được đặt trước trong các đầu ra trước đó để phù hợp với điều này.
TNT

Câu trả lời:


4

Python 2 535 517 473 468 byte

Đã lưu 5 byte nhờ @Easterly Ink!

Đầu vào dự kiến ​​được phân tách bằng dấu phẩy (ví dụ: numArms, armLpm, numRots)

Phiên bản chơi gôn

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])

Phiên bản Ungolfed

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 ''

Giải trình

Khá đơn giản khi nó bị hỏng. Đầu tiên hãy tìm hiểu mức độ lớn của lưới được yêu cầu, sau đó vẽ hình vuông hoặc hình thoi.

Vị trí bắt đầu, biểu tượng và hướng của mỗi cánh tay được mã hóa cứng cho mỗi trong số 8 cánh tay có thể cho cơ sở hình vuông và kim cương. Sau đó, vẽ chúng là đủ dễ dàng.

Để xoay mọi thứ, tôi chỉ cần chuyển đổi giữa hình vuông và đế kim cương, sau đó tăng từng cánh tay, xoay chúng theo chiều kim đồng hồ một lần.


Bạn có thể loại bỏ các không gian ở những nơi như ' ' forđể ' 'for', ] forđến ]for', 8 cho tới 8for', print ''để print''.
R

Tốt đẹp! Tôi thực sự rất vui khi thấy một câu trả lời cho thử thách này.
TNT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.