Crea un vortice!


10

La tua missione oggi è quella di creare un vortice dato un singolo parametro.

Questo parametro determina la lunghezza di ciascun braccio in caratteri.

Ogni "strato" di ciascun braccio contiene un personaggio in più rispetto all'ultimo.

Ecco come apparirà il vortice, data la lunghezza del braccio:

0:

#

1:

 # 
###
 # 

2:

 #
  # #
 ### 
# #  
   #

3:

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

4:

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

10:

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

Si applicano scappatoie standard, spazio bianco finale opzionale, qualsiasi singolo carattere non spazio bianco in ASCII può sostituire "#".

Questo è quindi vince la risposta più breve in byte.


La specifica (come esiste) sembra contraddire gli esempi. Da dove viene l'asimmetria negli ultimi due?
Peter Taylor,

Ecco una versione corretta.
rahnema1,

@JonathanAllan guarda la descrizione della mia modifica: rimosso il brutto non personaggio nero, ma sono ancora asimmetric . E no, non sto subentrando ... Sembra una sfida noiosa per me (senza offesa)
Mr. Xcoder,

Si prega di riaprire questo. Adesso è chiaro
programmatore

1
@JonathanAllan Sì, hanno avuto un problema come hai detto. Fisso.
Papayaman1000,

Risposte:


5

MATL , 60 byte

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

Provalo online! Oppure verifica i casi di test: 0 , 1 , 2 , 3 , 4 , 10 .

Questo si è rivelato più divertente di quanto mi aspettassi. Spiegare sarà più difficile, anche se ...


3

Gelatina , 48 byte

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

Provalo online!

(Rendi tutto più quadrato sostituendo il finale Ycon G, aggiungendo uno spazio tra ogni colonna).

Come?

Crea un elenco di #coordinate di un braccio rispetto al centro. Trasforma quello alle coordinate dei quattro bracci dall'angolo in alto a sinistra e aggiunge la coordinata centrale. Crea una tabella di tutte le coordinate nello spazio e imposta le braccia #e lo spazio su e unisce le righe con le nuove linee.

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 byte

L'idea è quella di creare un singolo braccio con una funzione - {⌊.5+.5(-7+8#)^.5⌋,#-1}che sputi l'indice di ciascun elemento del braccio assumendo che l'elemento centrale abbia indice (0,0). Nessuno lo ha ancora capito, ma sospetto che questa idea si tradurrebbe in una risposta vincente in un linguaggio di golf migliore. Quindi ruotare il braccio di multipli di 90 gradi, reindicizzare e costruire la matrice.

SparseArraysembrava la scelta ovvia per costruire la matrice, ma avrebbe potuto andare con BoxMatrixe 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 (hard coded per arm length = 3, %significa output precedente):

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

Utilizzo% @ 4

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

Come ho appreso, l'output deve essere puro ASCII senza spaziatura o formattazione aggiuntiva, il codice deve diventare un po 'più lungo (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",""]

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

È possibile rimuovere la spaziatura aggiuntiva tra le colonne? Poiché si tratta di una sfida di arte ASCII, l'output dovrebbe essere esattamente come specificato, senza spazi aggiuntivi (@ Papayaman1000, per favore conferma se questo può essere esentato)
HyperNeutrino

Ho inserito una modifica per questo se risulta necessario. In questo momento sembra discutibile.
Kelly Lowder,

Hmm ... Preferirei che, per amor di concorrenza, tu usi la risposta che dà il risultato esatto. Come diceva @HyperNeutrino, è arte ASCII, quindi dovrebbe essere come specificato.
Papayaman1000,

OK, l'ho risolto.
Kelly Lowder,

0

Carbone , 30 byte

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

Spiegazione

#                                    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

Provalo online!


Trimsembra funzionare golfista: NθFθ⁺¶#×#ιJ⁰¦⁰Tθ⁺¹θ#⟲O↖²⁴⁶( ⁺¹è una soluzione alternativa perché T⁰¦⁰non funziona per qualche motivo. E non esisteva allora.)
Neil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.