Намалюйте прядильний вертушок


30

Пам’ятаєте ті веселі вертушки, які ви дмухаєте, і вони крутяться навколо і навколо? Давайте код один!

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

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

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

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

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

Ви можете припустити наступне:

  • Кількість озброєнь завжди буде 0, 1, 2, 4 або 8.
  • Всі руки будуть однаково розташовані один від одного.
  • Початкове положення шарнірного колеса матиме такий центр так:

     _
    |_|
    
  • Якщо кількість зброї дорівнює 1, ви можете вирішити, в якому напрямку стрілка стоїть.

  • Якщо кількість кронштейнів становить 2, ви можете вирішити зробити зброю точкою вертикально або горизонтально.

Ви можете написати повну програму, яка приймає вхід через STDIN або аргумент командного рядка, або функцію, яка приймає введення через аргументи функції. Ваша програма повинна показувати послідовність виходів, яка показує обертання вертушки, кожен розділений принаймні одним порожнім рядком. Центр маховика не повинен рухатися більше ніж на один простір. Ви можете вивести стільки провідних і кінцевих пробілів, скільки необхідно.

Ось кілька прикладів:

0 2 1

 _
|_|

/\
\/

1 3 2

|
|
|_
|_|

   /
  /
 /
/\
\/

 _ ___
|_|

2 2 0

   _ __
__|_|

8 4 1

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

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

Це кодовий гольф, тому найкоротший код виграє. Удачі!


Чи може бути кінцевий новий рядок у висновку?
usandfriends

Додаткові нові рядки дозволяються без обмежень щодо суми.
ТНТ

Також для останнього прикладу у вас є додатковий простір, приготовлений для кожного рядка для першого виводу. Чи можемо ми мати передумови та пробіли у висновку?
usandfriends

Кількість провідних проміжків у висновку має відношення до положення центру маховика, положення якого не повинно зміщуватися на більш ніж один пробіл. Якщо обертання шарнирного колеса призведе до того, що рука пізніше закінчиться ліворуч від центра вертушки (наприклад, для введення 1 3 5та рукоятки, яка спочатку спрямована вгору), для попереднього виходу необхідно буде передбачити пробіли.
ТНТ

Відповіді:


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ɪᴋᴇʀ

Приємно! Я дуже радий бачити відповідь на цей виклик.
ТНТ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.