Girdap yaratın!


10

Bugünkü göreviniz tek bir parametre verilen bir girdap yaratmaktır.

Bu parametre karakterlerin her bir kolunun uzunluğunu belirler.

Her kolun her "katmanı", sondan bir karakter daha içerir.

Kol uzunluğu göz önüne alındığında girdap nasıl görünecek:

0:

#

1:

 # 
###
 # 

2:

 #
  # #
 ### 
# #  
   #

3:

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

4:

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

10:

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

Standart boşluklar uygulanır, isteğe bağlı boşluk bırakılır, ASCII'deki boşluk olmayan herhangi bir karakter "#" yerine kullanılabilir.

Bu yani bayt en kısa cevap kazanır.


Spesifikasyon (olduğu gibi) örneklerle çelişiyor gibi görünüyor. Son ikisinde asimetri nereden geldi?
Peter Taylor

İşte düzeltilmiş bir sürüm.
rahnema1

@JonathanAllan düzenlememin açıklamasına bakın: Çirkin siyah karakter olmayanlar kaldırıldı, ancak hala asimetrikler . Ve hayır, üstlenemiyorum ... Bana sıkıcı bir meydan okuma gibi görünüyor (suç yok)
Bay Xcoder

Lütfen bunu tekrar açın. Şimdi açık.
programmer5000

1
@JonathanAllan Evet, dediğin gibi bir sorunları vardı. Sabit.
Papayaman1000

Yanıtlar:


5

MATL , 60 bayt

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

Çevrimiçi deneyin! Veya test senaryolarını doğrulayın: 0 , 1 , 2 , 3 , 4 , 10 .

Bu beklediğimden daha komik olduğu ortaya çıktı. Ancak açıklamak daha zor olacak ...


3

Jöle , 48 bayt

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

Çevrimiçi deneyin!

(Nihai değiştirerek hepsi daha kare olun Yile Gher sütun arasına bir boşluk ekleyerek).

Nasıl?

#Merkeze göre bir kolun koordinatlarının bir listesini oluşturur . Bunu sol üst köşeden dört kolun koordinatlarına dönüştürür ve orta koordinatı ekler. Uzayda koordinatlarının tüm bir tablosunu oluşturur ve silah setleri #ve uzay ve yenisatırlar satırları birleşmektedir.

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

0

Mathematica 139 172 Bayt

Fikir, {⌊.5+.5(-7+8#)^.5⌋,#-1}orta elemanın indeks (0,0) olduğunu varsayarak, kolun her elemanının indeksini veren bir fonksiyona sahip tek bir kol oluşturmaktır . Henüz kimse bunu başaramadı, ancak bu fikrin daha iyi bir golf dilinde kazanan bir cevapla sonuçlanacağından şüpheleniyorum. Daha sonra kolu 90 derecenin katları arasında döndürürüm, endeksi yeniden endeksler ve oluşturur.

SparseArraymatrisi oluşturmak için bariz bir seçim gibi görünüyordu, ama BoxMatrixve ile gidebilirdi 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,""]]&

Ungolfed (Kol uzunluğu = 3 için sabit kodlanmış, %önceki çıktı anlamına gelir):

{{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->""]

Kullanım% @ 4

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

Ben çıktı ekstra boşluk veya biçimlendirme olmadan saf ASCII olması gerektiğini öğrendim, kod biraz daha uzun (172 bayt) almak zorunda:

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",""]

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

Sütunlar arasındaki fazladan boşluk kaldırılabilir mi? Bu bir ASCII-sanat meydan okuması olduğundan, çıktı tam olarak belirtildiği gibi olmalıdır, ekstra boşluk bırakılmamalıdır (@ Papayaman1000 lütfen bunun muaf tutulabileceğini onaylayın)
HyperNeutrino

Gerekirse bunun için bir düzenleme yaptım. Şu anda tartışmalı görünüyor.
Kelly Lowder

Hmm ... Rekabet uğruna kesin sonucu veren cevabı kullanmayı tercih ederim. @HyperNeutrino'nun dediği gibi, ASCII sanatıdır, bu yüzden belirtildiği gibi olmalıdır.
Papayaman1000

Tamam, düzelttim.
Kelly Lowder

0

Odun kömürü , 30 bayt

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

açıklama

#                                    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

Çevrimiçi deneyin!


Trimgolfier dışarı işe görünüyor: NθFθ⁺¶#×#ιJ⁰¦⁰Tθ⁺¹θ#⟲O↖²⁴⁶( ⁺¹çünkü geçici bir çözümdür T⁰¦⁰nedense işi yapmaz ve. Sonra geri yoktu.)
Neil
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.