Нарисуйте вращающуюся вертушку


30

Помните те забавные вертушки, которые вы дуете, и они вращаются вокруг и вокруг? Давайте код один!

Вертушка будет иметь набор символов, \ | / _рисующих его центр и руки. Один из возможных вертушек может выглядеть так:

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

Но что за вертушка, которая не вращается? Не весело! Мы можем заставить его вращаться, переставляя символы:

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

Задача состоит в том, чтобы создать программу, которая принимает три целых числа и выводит вертушку, как указано ниже. Первое из них - это количество рычагов, которое у него есть, второе - это длина рычагов вертушки, а третье - это количество раз, которое он будет вращать на одну восьмую оборота по часовой стрелке.

Вы можете предположить следующее:

  • Количество рук всегда будет 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

Python 2 535 517 473 468 байт

Сохранено 5 байтов благодаря @Easterly Ink!

Предполагается, что входные данные разделены запятыми (то есть 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.