¡Crea un vórtice!

10

Su misión hoy es crear un vórtice dado un solo parámetro.

Este parámetro determina la longitud de cada brazo en caracteres.

Cada "capa" de cada brazo contiene un personaje más que el anterior.

Así es como se verá el vórtice, dada la longitud del brazo:

0:

#

1:

 # 
###
 # 

2:

 #
  # #
 ### 
# #  
   #

3:

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

4:

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

10:

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

Se aplican las lagunas estándar, los espacios en blanco finales son opcionales, cualquier carácter que no sea un espacio en blanco en ASCII puede reemplazar "#".

Este es el por lo que gana la respuesta más corta en bytes.

Papayaman1000
fuente
La especificación (como la hay) parece contradecir los ejemplos. ¿De dónde vino la asimetría en los últimos dos?
Peter Taylor
Aquí hay una versión corregida.
rahnema1
@JonathanAllan ver la descripción de mi edición: Se eliminó el no personaje negro feo, pero aún son asimétricos . Y no, no me haré cargo ... Parece un desafío aburrido para mí (sin ofender)
Sr. Xcoder
Por favor, vuelva a abrir esto. Está claro ahora.
programmer5000
1
@ JonathanAllan Sí, tenían un problema como tú dijiste. Fijo.
Papayaman1000

Respuestas:

5

MATL , 60 bytes

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

Pruébalo en línea! O verificar los casos de prueba: 0 , 1 , 2 , 3 , 4 , 10 .

Esto resultó ser más divertido de lo que esperaba. Sin embargo, explicar será más difícil ...

Luis Mendo
fuente
3

Jalea , 48 bytes

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

Pruébalo en línea!

(Haga que todo sea más cuadrado reemplazando el final Ycon G, agregando un espacio entre cada columna).

¿Cómo?

Construye una lista de #coordenadas de un brazo en relación con el centro. Transforma eso en las coordenadas de los cuatro brazos desde la esquina superior izquierda y agrega la coordenada central. Construye una tabla de todas las coordenadas en el espacio y establece los brazos #y el espacio ay une las filas con nuevas líneas.

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
fuente
0

Mathematica 139 172 Bytes

La idea es crear un solo brazo con una función, {⌊.5+.5(-7+8#)^.5⌋,#-1}que escupe el índice de cada elemento del brazo, suponiendo que el elemento del medio tenga un índice (0,0). Nadie se ha dado cuenta de eso todavía, pero sospecho que esta idea daría como resultado una respuesta ganadora en un mejor lenguaje de golf. Luego gire el brazo a través de múltiplos de 90 grados, vuelva a indexar y construya la matriz.

SparseArrayParecía la opción obvia para construir la matriz, pero podría haber ido con BoxMatrixy 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,""]]&

Sin golf (codificado para la longitud del brazo = 3, %significa salida anterior):

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

Uso% @ 4

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

Como he aprendido, la salida debe ser puramente ASCII sin espacio ni formato adicionales, el código debe ser un poco más largo (172 bytes):

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
fuente
¿Se puede eliminar el espacio adicional entre columnas? Como este es un desafío de arte ASCII, el resultado debe ser exactamente como se especifica, sin espacios adicionales (@ Papayaman1000, confirme si esto puede estar exento)
HyperNeutrino
Puse una edición para eso si resulta ser necesario. En este momento parece discutible.
Kelly Lowder
Hmm ... Preferiría que, por el bien de la competencia, utilices la respuesta que da el resultado exacto. Como dijo @HyperNeutrino, es un arte ASCII, por lo que debe ser como se especifica.
Papayaman1000
OK, lo arreglé.
Kelly Lowder
0

Carbón , 30 bytes

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

Explicación

#                                    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

Pruébalo en línea!

Solo ASCII
fuente
Trimparece funcionar para golfistas: NθFθ⁺¶#×#ιJ⁰¦⁰Tθ⁺¹θ#⟲O↖²⁴⁶( ⁺¹es una solución alternativa porque T⁰¦⁰no funciona por alguna razón y no existía en ese momento).
Neil