Gambarkan Spinning Pinwheel

30

Ingat kincir-kincir kecil yang Anda sukai dan mereka berputar-putar? Mari kode satu!

Kincir akan memiliki set karakter yang \ | / _menggambar pusat dan lengannya. Satu roda kincir mungkin bisa terlihat seperti ini:

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

Tapi apa roda gila yang tidak berputar? Tidak menyenangkan! Kita dapat membuatnya berputar dengan mengatur ulang simbol:

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

Tantangannya adalah membuat program yang membutuhkan tiga bilangan bulat dan mengeluarkan roda gila seperti yang ditentukan di bawah ini. Yang pertama dari ini adalah jumlah lengan yang dimilikinya, yang kedua adalah panjang lengan kincir, dan yang ketiga adalah berapa kali ia berputar seperdelapan putaran searah jarum jam.

Anda dapat mengasumsikan sebagai berikut:

  • Jumlah lengan akan selalu 0, 1, 2, 4, atau 8.
  • Semua lengan akan ditempatkan dengan jarak yang sama satu sama lain.
  • Posisi awal roda kincir akan memiliki pusatnya seperti ini:

     _
    |_|
    
  • Jika jumlah lengan adalah 1, Anda dapat memutuskan ke arah mana lengan menunjuk.

  • Jika jumlah lengan adalah 2, Anda dapat memutuskan untuk membuat titik lengan secara vertikal atau horizontal.

Anda dapat menulis program lengkap yang mengambil input melalui STDIN atau argumen baris perintah, atau fungsi yang mengambil input melalui argumen fungsi. Program Anda harus menunjukkan urutan output yang menunjukkan pemintalan roda gila, masing-masing dipisahkan oleh setidaknya satu baris kosong. Bagian tengah roda kincir seharusnya tidak bergerak lebih dari satu ruang. Anda dapat menghasilkan sebanyak mungkin ruang awal dan spasi tambahan.

Berikut ini beberapa contohnya:

0 2 1

 _
|_|

/\
\/

1 3 2

|
|
|_
|_|

   /
  /
 /
/\
\/

 _ ___
|_|

2 2 0

   _ __
__|_|

8 4 1

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

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

Ini kode golf, jadi kode terpendek menang. Semoga berhasil!

TNT
sumber
Mungkinkah ada trailing newline di output?
usandfriends
Trailing newline diizinkan, tanpa batasan jumlah.
TNT
Juga untuk contoh terakhir, Anda memiliki ruang ekstra yang ditambahkan ke setiap baris untuk output pertama. Bisakah kita memiliki spasi sebelum dan sesudah dalam output?
usandfriends
Jumlah ruang utama dalam output berkaitan dengan posisi pusat roda pinwheel, posisi yang seharusnya tidak bergeser lebih dari satu ruang. Jika rotasi kincir akan menyebabkan lengan berakhir di sebelah kiri dari pusat kincir nanti di output (seperti untuk input 1 3 5dan lengan awalnya mengarah ke atas), ruang perlu ditambahkan pada output sebelumnya untuk mengakomodasi hal ini.
TNT

Jawaban:

4

Python 2 535 517 473 468 byte

Disimpan 5 byte berkat @Easterly Ink!

Input diharapkan dipisahkan koma (yaitu, numArms, armLength, numRots)

Versi Golf

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

Versi Tidak Serigala

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

Penjelasan

Cukup sederhana ketika itu rusak. Pertama-tama cari tahu seberapa besar kisi-kisi yang dibutuhkan, kemudian plot alas persegi atau berlian.

Lokasi awal masing-masing lengan, simbol dan arah di-hardcode untuk masing-masing dari 8 lengan yang mungkin untuk dasar persegi dan berlian. Kemudian, menggambar mereka cukup mudah.

Untuk memutar semuanya, saya cukup beralih antara dasar persegi dan berlian, lalu menambah masing-masing lengan, memutarnya searah jarum jam sekali.

Dominic A.
sumber
Anda dapat menghapus spasi di tempat-tempat seperti ' ' foruntuk ' 'for', ] foruntuk ]for', 8 untuk ke 8for', print ''untuk print''.
Rɪᴋᴇʀ
Bagus! Saya sangat senang melihat jawaban untuk tantangan ini.
TNT