Buat pusaran!

10

Misi Anda hari ini adalah membuat pusaran yang diberi parameter tunggal.

Parameter ini menentukan panjang setiap lengan dalam karakter.

Setiap "lapisan" dari masing-masing lengan berisi satu karakter lebih dari yang terakhir.

Beginilah tampilan pusaran, mengingat panjang lengan:

0:

#

1:

 # 
###
 # 

2:

 #
  # #
 ### 
# #  
   #

3:

##  #
  # #
 ### 
# #  
#  ##

4:

#     #
 ##  #
   # #
  ###  
 # #   
 #  ## 
#     #

10:

             #
             #
             #     
             #   
            #      
####        #      
    ###     #      
       ##  #      
         # #       
        ###       
       # #         
       #  ##       
      #     ###    
      #        ####
      #            
     #             
     #             
     #             
     #             

Celah standar berlaku, mengikuti spasi spasi opsional, karakter non-spasi tunggal apa pun di ASCII dapat menggantikan "#".

Ini adalah sehingga jawaban tersingkat dalam byte menang.

Papayaman1000
sumber
Spek (seperti ada) tampaknya bertentangan dengan contoh. Dari mana asimetri itu berasal dari dua yang terakhir?
Peter Taylor
Ini adalah versi yang diperbaiki.
rahnema1
@JonathanAllan melihat deskripsi edit saya: Menghapus non-karakter hitam jelek, tetapi mereka masih asimetris . Dan tidak, saya tidak akan mengambil alih ... Sepertinya tantangan yang membosankan bagi saya (jangan tersinggung)
Tn. Xcoder
Harap buka kembali ini. Sudah jelas sekarang.
programmer5000
1
@ Jonathan Allan Ya, mereka memiliki masalah seperti yang Anda katakan. Tetap.
Papayaman1000

Jawaban:

5

MATL , 60 byte

3<G+Eqt&OlG8M+t&(1G:8*X^Q2/kG+G:Gq+&vG2=+Z{(XJ3:"J@X!+]g35*c

Cobalah online! Atau verifikasi kasus uji: 0 , 1 , 2 , 3 , 4 , 10 .

Ini ternyata lebih lucu dari yang saya harapkan. Menjelaskan akan menjadi lebih sulit, meskipun ...

Luis Mendo
sumber
3

Jelly , 48 byte

Rȯ1ĖŒṙ‘Ė’ḣµ;NµN0¦€U;
Ç+;ẋ2W$+⁸<3¤µFṀR,þ$e€€ị⁾# Y

Cobalah online!

(Buat semuanya lebih persegi dengan mengganti final Ydengan G, menambahkan spasi di antara setiap kolom).

Bagaimana?

Membuat daftar #koordinat lengan relatif ke tengah. Mengubahnya menjadi koordinat empat lengan dari sudut kiri atas dan menambahkan koordinat tengah. Buat tabel semua koordinat di ruang dan atur lengan ke #dan ruang ke dan gabungkan baris dengan baris baru.

Rȯ1ĖŒṙ‘Ė’ḣµ;NµN0¦€U; - Link 1, arm coordinates relative to centre: arm-length a
R                    - range: [1,2,...,a]
 ȯ1                  - or 1 (stops Œṙ erroring with arm-length 0; builds no redundant coordinates in the end)
   Ė                 - enumerate: [[1,1],[2,2],...[a,a]]  (or [[1,1]] if a=0)
    Œṙ               - run-length decode: [1,2,2,...,a,a,...,a] (or [1] if a=0)
      ‘              - increment: [2,3,3,...,a+1,a+1,...,a+1] (or [2] if a=0)
       Ė             - enumerate: [[1,2],[2,3],...,[T(a)-a,a+1],[T(a)-a+1,a+1],...,[T(a),a+1]] where T(a)=(a+1)*a/2 (or [[1,2]] if a=0)
        ’            - decrement: [[0,1],[1,2],...,[T(a)-a-1,a],[T(a)-a,a],...a[T(a)-1),a]] (or [[0,1]] if a=0)
         ḣ           - head to a (first a of those) - these are an arm's relative coordinates from the central `#` at [0,0])
          µ          - monadic chain separation (call that list r)
           ;         - r concatenated with
            N        - negate r (gets the opposite arm)
             µ       - monadic chain separation (call that list s)
                 €   - for €ach coordinate pair in s:
               0¦    -     apply to index 0 (the right of the two values):
              N      -         negate
                  U  - upend (reverse each pair of that, gives the other two arms)
                   ; - concatenate that list with s (gives all four arms)

Ç+;ẋ2W$+⁸<3¤µFṀR,þ$e€€ị⁾# Y - Main link: arm-length a
Ç                           - call the last link(1) as a monad (get centre-relative coordinates)
 +                          - add a (make the coordinates relative to the top-left)
      $                     - last two links as a monad:
   ẋ2                       -     repeat a twice: [a,a]
     W                      -     wrap in a list: [[a,a]] (the centre coordinate)
  ;                         - concatenate (add the centre coordinate)
           ¤                - nilad followed by link(s) as a nilad:
        ⁸                   -     link's left argument, a
         <3                 -     less than three?
       +                    - add (a in 0,1,2 are special cases requiring a grid one-by-one more than all the rest)
            µ               - monadic separation (call that c)
             F              - flatten c into one list
              Ṁ             - get the maximum (the side-length of the space)
                  $         - last two links as a monad:
               R            -     range: [1,2,...,side-length]
                ,þ          -     pair table: [[[1,1],[1,2],...,[1,side-length]],[[2,1],[2,2],...,[2,side-length]],...,[[side-length,1],[side-length,2],[side-length, side-length]]]
                   e€€      - exists in c? for €ach for €ach (1 if a # coordinate, 0 otherwise)
                       ⁾#   - literal ['#',' ']
                      ị     - index into
                          Y - join with new line characters
                            - implicit print
Jonathan Allan
sumber
0

Mathematica 139 172 Bytes

Idenya adalah untuk membuat lengan tunggal dengan fungsi - {⌊.5+.5(-7+8#)^.5⌋,#-1}yang memuntahkan indeks setiap elemen lengan dengan asumsi elemen tengah memiliki indeks (0,0). Belum ada yang memahaminya, tetapi saya menduga ide ini akan menghasilkan jawaban yang menang dalam bahasa golf yang lebih baik. Kemudian saya memutar lengan melalui kelipatan 90 derajat, mengindeks ulang dan membangun matriks.

SparseArraysepertinya pilihan yang jelas untuk membangun matriks, tetapi bisa pergi dengan BoxMatrixdan ReplacePart.

Grid[SparseArray[Max@#+#+1&[Join@@Table[RotationMatrix[i Pi/2].#&/@{{0,0}}~Join~Array[{⌊.5+.5(-7+8#)^.5⌋,#-1}&,#],{i,4}]]->X,2#+1,""]]&

Tidak disatukan (Hard kode untuk panjang lengan = 3, %berarti keluaran sebelumnya):

{{0,0}}~Join~Table[{Floor[1/2 (1+Sqrt[-7+8x])],x-1},{x,1,3}]
Table[RotationMatrix[i Pi/2].#&/@%,{i,4}]
Flatten[%,1]
Max[%]+%+1
Normal@SparseArray[%->X,Automatic,""]
Grid[%/. 0->""]

Penggunaan% @ 4

X                       X   
    X   X           X       
            X       X       
        X   X   X           
    X       X               
    X           X   X       
X                       X

Seperti yang telah saya pelajari, output harus murni ASCII tanpa spasi atau format tambahan, kode harus lebih lama (172 byte):

StringRiffle[ReplacePart[Array[" "&,{1,1}*2#+1],Max@#+#+1&[Join@@Table[RotationMatrix[i Pi/2].#&/@{{0,0}}~Join~Array[{⌊.5+.5(-7+8 #)^.5⌋,#-1}&,#],{i,4}]]->"#"],"\n",""]

#     #  
 ##  #   
   # #   
  ###    
 # #     
 #  ##   
#     #  
Kelly Lowder
sumber
Apakah jarak antar kolom bisa dihapus? Karena ini adalah tantangan ASCII-art, output harus persis seperti yang ditentukan, tanpa spasi tambahan (@ Papayaman1000 harap konfirmasikan jika ini dapat dikecualikan)
HyperNeutrino
Saya melakukan edit untuk itu jika ternyata diperlukan. Sekarang ini sepertinya masih bisa diperdebatkan.
Kelly Lowder
Hmm ... Saya lebih suka itu, demi kompetisi, Anda menggunakan jawaban yang memberikan hasil yang tepat. Seperti yang dikatakan @HyperNeutrino, ini adalah ASCII-art, jadi harus seperti yang ditentukan.
Papayaman1000
OK, saya memperbaikinya.
Kelly Lowder
0

Arang , 30 byte

#NβFβ«¿ι«×#⌊⟦ιβ⟧A⁻βιβ↑»»‖←⟲O²⁴⁶

Penjelasan

#                                    Print "#"
 Nβ                                 Input number to b
    Fβ«                  »          For i in range(b)
        ¿ι«              »           If i is truthy (to skip 0)
           ×#⌊⟦ιβ⟧                   Print "#" * minimum of i and b
                  A⁻βιβ↑            Assign b-i to b
                           ‖         Reflect right
                            ⟲O²⁴⁶  Rotate overlap 90, 180 and 270 degrees

Cobalah online!

Khusus ASCII
sumber
Trimkelihatannya berhasil di lapangan golf: NθFθ⁺¶#×#ιJ⁰¦⁰Tθ⁺¹θ#⟲O↖²⁴⁶( ⁺¹adalah solusi karena T⁰¦⁰tidak berhasil karena suatu alasan. dan tidak ada saat itu.)
Neil