Bir Döndürme Fırıldak çizin


30

Üflediğin ve dönüp döndükleri eğlenceli fırıldakları hatırla. Birini kodlayalım!

Bir fırıldak \ | / _, merkezini ve kollarını çizen karakter kümesine sahip olacaktır . Bir olası fırıldak şunun gibi görünebilir:

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

Ama dönmeyen bir fırıldak nedir? Eğlenceli değil! Sembolleri yeniden düzenleyerek döndürmesini sağlayabiliriz:

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

Buradaki zorluk, üç tamsayı alan ve aşağıda belirtildiği gibi bir fırıldak çıkaran bir program oluşturmaktır. Bunlardan ilki sahip olduğu kol sayısı, ikincisi fırıldak kollarının uzunluğu ve üçüncüsü saat yönünde bir turun sekizde birini döndüreceği sayıdır.

Aşağıdakileri varsayabilirsin:

  • Silah sayısı her zaman 0, 1, 2, 4 veya 8 olacaktır.
  • Tüm kollar birbirinden eşit aralıklarla yerleştirilecektir.
  • Çarkın başlangıçtaki konumu şu şekilde olacaktır:

     _
    |_|
    
  • Kol sayısı 1 ise, kolun hangi yöne dönük olduğuna karar verebilirsiniz.

  • Kol sayısı 2 ise, kolları dikey veya yatay olarak göstermeye karar verebilirsiniz.

STDIN veya komut satırı argümanı yoluyla girdi alan tam bir program veya işlev argümanları aracılığıyla girdi alan bir işlev yazabilirsiniz. Programınız, her biri en az bir boş satırla ayrılmış, fırıldak dönüşünü gösteren bir çıkış dizisi göstermelidir. Çarkın ortasından birden fazla boşluk hareket etmemelidir. Gerektiği kadar çok sayıda ön ve arka boşluk çıkarabilirsiniz.

İşte bazı örnekler:

0 2 1

 _
|_|

/\
\/

1 3 2

|
|
|_
|_|

   /
  /
 /
/\
\/

 _ ___
|_|

2 2 0

   _ __
__|_|

8 4 1

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

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

Bu kod golf, yani en kısa kod kazanır. İyi şanslar!


Çıktıda takip eden bir yeni satır olabilir mi?
usandfriends

Takip eden yeni satırlara, miktarla ilgili herhangi bir kısıtlama olmaksızın izin verilir.
TNT

Ayrıca son örnek için, ilk çıktı için her satıra hazır bir ekstra alanınız var. Çıktıda önceden hazırlanmış ve takip eden alanlar olabilir mi?
usandfriends

Çıktıdaki öndeki boşlukların sayısı, birden fazla boşlukla kaymaması gereken, fırıldak merkezinin merkezinin konumu ile ilgilidir. Çarkın dönmesi bir kolun çarkın merkezinden çıkışta daha sonra sollanmasına neden olacaksa (örneğin giriş 1 3 5ve kol başlangıçta yukarı bakacak şekilde), bunun için daha önceki çıkışlarda boşluklar hazırlanmalıdır.
TNT

Yanıtlar:


4

Python 2 535 517 473 468 bayt

@Easterly Ink! Sayesinde 5 bayt kurtarıldı!

Girişin virgülle ayrılması bekleniyor (örn. NumArms, armLength, numRots)

Golf Sürümü

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

Ungolfed Sürümü

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

açıklama

Bozulduğunda oldukça basit. İlk önce ne kadar büyük ızgara gerektiğine karar verin, ardından temel kareyi ya da elmasları çizin.

Her bir kolun başlangıç ​​konumu, sembolü ve yönü kare ve elmas taban için olası 8 kolun her biri için kodlanmıştır. Sonra, onları çizmek yeterince kolaydır.

Her şeyi döndürmek için, sadece kare ve elmas taban arasında geçiş yapıyorum, sonra kolların her birini artırarak bir kez saat yönünde döndürüyorum.


Sen gibi yerlerde boşluk kaldırabilirsiniz ' ' foriçin ' 'for', ] foriçin ]for'için, 8 8for', print ''için print''.
Rɪᴋᴇʀ

Güzel! Bu sorunun cevabını gördüğüm için gerçekten mutluyum.
TNT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.