วาดล้อหมุนได้


30

จำ pinwheels ที่สนุกที่คุณระเบิดและหมุนไปรอบ ๆ รหัสหนึ่งกันเถอะ!

ตะไลจะมีชุดของตัวละครที่\ | / _วาดศูนย์กลางและแขนของมัน หนึ่งล้อเลื่อนที่เป็นไปได้อาจมีลักษณะเช่นนี้:

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

แต่ตะไลนั้นไม่หมุนอะไร ไม่สนุก! เราสามารถทำให้มันหมุนได้โดยจัดเรียงสัญลักษณ์ใหม่:

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

ความท้าทายคือการสร้างโปรแกรมที่ใช้จำนวนเต็มสามจำนวนและส่งออกตะไลตามที่ระบุด้านล่าง ครั้งแรกของเหล่านี้คือจำนวนของแขนที่มีที่สองคือความยาวของแขนของตะไลและที่สามคือจำนวนครั้งที่มันจะหมุนหนึ่งในแปดของการหมุนตามเข็มนาฬิกา

คุณสามารถสมมติสิ่งต่อไปนี้:

  • จำนวนแขนจะเป็น 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!

อินพุตที่คาดว่าจะคั่นด้วยเครื่องหมายจุลภาค (เช่น numArms, armLength, numRots)

เวอร์ชัน Golfed

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.