회전하는 바람개비 그리기


30

당신이 부는 그 재미있는 바람개비를 기억하고 그들은 빙글 빙글 돌고 있습니까? 하나를 코딩하자!

바람개비에는 \ | / _중심과 팔을 그리는 문자 세트가 있습니다 . 하나의 가능한 바람개비는 다음과 같습니다.

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

그러나 회전하지 않는 바람개비는 무엇입니까? 재미 없어! 심볼을 재정렬하여 회전시킬 수 있습니다.

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

문제는 3 개의 정수를 사용하고 아래와 같이 바람개비를 출력하는 프로그램을 만드는 것입니다. 이 중 첫 번째는 팔의 수이고, 두 번째는 바람개비의 팔의 길이이며, 세 번째는 시계 방향으로 1/8 회전하는 횟수입니다.

다음을 가정 할 수 있습니다.

  • 팔 수는 항상 0, 1, 2, 4 또는 8입니다.
  • 모든 팔은 서로 똑같이 떨어져 있습니다.
  • 바람개비의 초기 위치는 다음과 같은 중심을 갖습니다.

     _
    |_|
    
  • 팔 수가 1이면 팔이 가리키는 방향을 결정할 수 있습니다.

  • 팔의 수가 2이면 팔을 세로 또는 가로로 가리 키도록 결정할 수 있습니다.

STDIN 또는 명령 행 인수를 통해 입력을받는 전체 프로그램 또는 함수 인수를 통해 입력을받는 함수를 작성할 수 있습니다. 프로그램은 최소한 하나의 빈 줄로 분리 된 바람개비 회전을 나타내는 일련의 출력을 보여 주어야합니다. 바람개비의 중심이 두 칸 이상 움직이지 않아야합니다. 필요한만큼 선행 및 후행 공백을 출력 할 수 있습니다.

여기 몇 가지 예가 있어요.

0 2 1

 _
|_|

/\
\/

1 3 2

|
|
|_
|_|

   /
  /
 /
/\
\/

 _ ___
|_|

2 2 0

   _ __
__|_|

8 4 1

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

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

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다. 행운을 빕니다!


출력에 후행 줄 바꿈이있을 수 있습니까?
usandfriends

금액에 대한 제한없이 후행 줄 바꿈이 허용됩니다.
TNT

또한 마지막 예제의 경우 첫 번째 출력을 위해 각 줄 앞에 추가 공간이 있습니다. 출력에서 선행 및 후행 공백을 사용할 수 있습니까?
usandfriends

출력의 선행 공간 수는 바람개비 중심 위치와 관련이 있으며 위치는 둘 이상의 공간만큼 이동해서는 안됩니다. 바람개비의 회전으로 인해 암이 출력 후반에 바람개비 중심의 왼쪽에서 끝나는 경우 (예 : 입력 1 3 5및 암이 처음 위로 향하는 경우)이를 수용하기 위해 공백이 이전 출력에 추가되어야합니다.
TNT

답변:


4

파이썬 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 개의 가능한 암 각각에 대해 하드 코딩됩니다. 그런 다음 그리기가 쉽습니다.

모든 것을 회전 시키려면 간단히 사각형과 다이아몬드베이스 사이를 전환 한 다음 각 팔을 늘리고 시계 방향으로 한 번 회전시킵니다.


' ' forto ' 'for', ] forto ]for', 8 for to 8for', print ''to 같은 공간에서 공백을 제거 할 수 있습니다 print''.
Rɪᴋᴇʀ

좋은! 이 도전에 대한 답변을 드리겠습니다.
TNT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.