Torres Eiffel: cree una "A" grande a partir de "A"

20

Crear una función que, dada una cantidad de líneas n, hace a bigA.

  • La barra horizontal de bigAdebe estar en la fila central, o la inferior de las dos si nes par
  • Asumir una fuente monoespacial para salida

La salida debe ser una cadena (o similar, por ejemplo, una matriz de caracteres) con saltos de línea claros para dividir las líneas, y con el espacio en blanco correcto para el relleno izquierdo (puede suponer que \ t son 4 espacios). Puede haber cualquier espacio en blanco a la derecha.

Ejemplos

n = 1

A

n = 2

 A
AAA

n = 3

  A
 AAA
A   A

n = 4

   A
  A A
 AAAAA
A     A

n = 5

    A
   A A
  AAAAA
 A     A
A       A

Esto está inspirado en Crear una "H" a partir de "H" más pequeñas

Budd
fuente
¿Puedo agregar espacios en blanco al lado derecho? Además, ¿se permite el arrastre de nueva línea?
Bubbler el
@Bubbler, cualquier espacio en blanco en el lado derecho está bien, sin embargo, no hay línea nueva final
Budd
¿Se nos permite devolver matrices de caracteres 2D en lugar de cadenas? (pista: generalmente se recomienda permitir cualquier tipo de salida)
Olivier Grégoire
1
@ OlivierGrégoire Claro, siempre y cuando haya un salto claro para las líneas (por ejemplo, un elemento "\ n", matrices anidadas)
Budd
1
@TonHospel, No, eso realmente derrota el propósito de esto
Budd

Respuestas:

12

05AB1E , 13 bytes

Código:

Ð;î¹)'A1376SΛ

Utiliza la codificación 05AB1E . Pruébalo en línea!

Explicación:

Ð                  # Triplicate the input.
 ;î                # Compute ceiling(n / 2).
   ¹               # Push the first input again.
    )              # Wrap into an array. For input 7, this would result in:
                     [7, 7, 4, 7].
     'A            # Push the character 'A'
       1376S       # Push the array [1, 3, 7, 6]. These are the directions of the canvas.
                     This essentially translates to [↗, ↘, ↖, ←].
            Λ      # Write to canvas using the previous three parameters.

Lona

Probablemente debería documentar el lienzo un poco más (y muchas otras funciones), pero esto básicamente lo resume. El lienzo tiene diferentes 'modos' basados ​​en los tipos de parámetros dados. El comando de lienzo tiene tres parámetros: <longitud> <cadena> <dirección> .

Dado que los parámetros de longitud y dirección son listas, 'comprime' estas listas para crear un conjunto de instrucciones que se ejecutarán. El parámetro de cadena es solo la letra A , por lo que este es el carácter de relleno utilizado por todas las instrucciones. El lienzo interpreta esto como el siguiente conjunto de instrucciones (para la entrada 7):

  • Dibuja una línea de longitud 7 con la cuerda A en la dirección
  • Dibuja una línea de longitud 7 con la cuerda A en la dirección
  • Dibuja una línea de longitud 4 con la cuerda A en la dirección
  • Dibuja una línea de longitud 7 con la cuerda A en dirección

Las instrucciones se traducen de la siguiente manera:

7   0   1
  ↖ ↑ ↗
6 ← X → 2
  ↙ ↓ ↘
5   4   3

Si no se ha emitido nada, 05AB1E genera automáticamente el resultado del lienzo.

Adnan
fuente
1
Muchas gracias por la explicación del lienzo, esa es una característica brillante :-)
Kaldo
TIL triplicado es una palabra
Quintec
@ thecoder16 cuadruplicado, quintuplicado, ..., decuplicado
Urna de pulpo mágico
Guau. Dudaba de no duplicado, pero existe como todos los demás. Por supuesto que tenemos palabras tan inútiles en inglés xD
Quintec
1
@KevinCruijssen Hola, disculpas por todas las respuestas tardías, ha sido increíblemente ocupado para mí las últimas dos semanas (solo logré dormir 8 horas las últimas 72 horas jaja), así que no creo que pueda hacerlo cualquier cosa en este momento, pero siéntase libre de agregarlo a la página de sugerencias si lo desea.
Adnan
6

Carbón , 17 15 bytes

NθP×θAM⊘θ↗P^×θA

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

Nθ

Entrada n.

P×θA

Imprime la barra horizontal de la grande A. (Para números pares, el n+1th se superpone del lado derecho de todos modos).

M⊘θ↗

Mover a la cima de lo grande A.

P^×θA

Imprime ambos lados de la grande A.

Neil
fuente
4

Python 2 , 80 bytes

lambda n:'\n'.join(' '*(n+~i)+('A'+' A'[i==n/2]*n*2)[:i*2]+'A'for i in range(n))

Pruébalo en línea!

Divida la salida deseada en el espacio en blanco izquierdo, el espacio en blanco izquierdo Amás medio o As, y el derecho A. Calcule la parte media usando el corte en una cadena fija. Esto permite utilizar la misma forma para generar la primera línea.

Bubbler
fuente
4

Stax , 15 bytes

┴3╬*ôP^x'┌_╓J²♫

Ejecutar y depurarlo

Desempaquetado, sin golf y comentado, el programa se ve así.

m       map over [1 .. input] using rest of the program, output each result
'A      "A" literal
xhi=    is the iteration index equal to (integer) half the input?
65*     multiply by 65 (character code of "A")
]i*     repeat that character (" " or  "A") i times
+       concat to initial "A"
x)      left pad to the original input
|p      palindromize (concatenate the reverse minus the last character)

Ejecute este

recursivo
fuente
4

JavaScript (ES6), 77 bytes

¡Este código fuente tiene forma de rectángulo ! Oh espera ... desafío equivocado: - /

f=(n,k=n>>1,p='A')=>--n?f(n,k,' '+p)+`
${p}${(k-n?' ':'A').repeat(n*2-1)}A`:p

Pruébalo en línea!

Arnauld
fuente
4

Python 3.6 , 79 bytes o 73 bytes

Usando cadenas f para alinear partes horizontales de la letra:

lambda n:'\n'.join(f"{'A'+' A'[i==n//2]*2*i:>{n+i}}"[:-1]+'A'for i in range(n))

Con \butilizado para eliminar uno A(posiblemente hacer trampa):

lambda n:'\n'.join(f"{'A'+' A'[i==n//2]*2*i:>{n+i}}\bA"for i in range(n))
Radek
fuente
3

J , 65 bytes

f=:3 :''' A''{~1(([:(<@;]+i.@+:)<.@-:)y)}([:(}:@|."1,.])=/~@i.)y'

Pruébalo en línea!

Se puede reducir en aprox. 12 bytes simplemente haciendo el verbo tácito, pero tengo problemas para hacerlo.

Explicación:

3 : '...' denota un verbo explícito de una línea

y es el argumento

=/~@i. crea una matriz de identidad con el tamaño del argumento

    =/~@i. 4
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

([:(}:@|."1,.]) antepone la matriz de identidad con su copia espejo con los últimos elementos de cada fila descartados.

    ]a =. ([:(}:@|."1,.])=/~@i.) 4
0 0 0 1 0 0 0
0 0 1 0 1 0 0
0 1 0 0 0 1 0
1 0 0 0 0 0 1

1(...)}(...) cambia a 1 las posiciones en su argumento derecho, seleccionado por el izquierdo

([:(<@;]+i.@+:)<.@-:) - prepara la selección haciendo lo siguiente:

               <.@-: - halves the argument and finds the floor (finds the row number)
    <@;              - box the row, followed by a list of columns:  
        ]+i.@+:      - a list form the argumnt to the doubled row number

    ([:(<@;]+i.@+:)<.@-:) 4
┌───────────┐
│┌─┬───────┐│
││2│2 3 4 5││
│└─┴───────┘│
└───────────┘

    1(([:(<@;]+i.@+:)<.@-:) 4)}a
0 0 0 1 0 0 0
0 0 1 0 1 0 0
0 1 1 1 1 1 0
1 0 0 0 0 0 1

' A'{~ representa un espacio en los lugares de 0 y 'A' donde hay 1

    ' A'{~1(([:(<@;]+i.@+:)<.@-:) 4)}a
   A   
  A A  
 AAAAA 
A     A
Galen Ivanov
fuente
2

Ruby , 66 bytes

->n{(0...n).map{|i|(s=(i==n/2??A:?\s)*2*i+?A)[0]=?A;?\s*(n+~i)+s}}

Pruébalo en línea!

Devuelve como un conjunto de líneas

Kirill L.
fuente
2

SOGL V0.12 , 12 bytes

 A*:╚╥≤.»I:ž

Pruébalo aquí!

Explicación:

 A*           repeat "A" input times
   :          duplicate it
    ╚         create a "/" diagonal of one of the copies of As
     ╥        palindromize it horizontally
      ≤       get the other copy of the "A"s on top
       .»I:   push floor(input/2)+1 twice
           ž  and at those coordinates in the palindromized diagonals place in the row of As
dzaima
fuente
2

Japt -R , 20 19 bytes

Çç" A"gZ¶Uz¹i'A êÃû

Intentalo


Explicación

                        :Implicit input of integer U
Ç                       :Create the range [0,U) and pass each Z through a function
         Uz             :  Floor divide U by 2
       Z¶               :  Test for equality with Z (true=1, false=0)
  " A"g                 :  Get the character in the string " A" at that index
 ç                      :  Repeat Z times
           ¹            :  (Closes a few nested methods)
            i'A         :  Prepend an "A"
                ê       :  Palindromise
                 Ã      :End function
                  û     :Centre pad each element to the length of the longest element
                        :Implicitly join with newlines and output

Alternativa

(¡Con la esperanza de que pueda ayudarme a detectar algunos ahorros!)

Æ'AúXÄ" A"gX¶Uz¹êÃû
Lanudo
fuente
1
Otra alternativa que es un byte más largo:ç h'AUz)¬íp ®i'A êÃû
ETHproductions
@ETHproductions Reemplace p con ²y también tiene 19 bytes.
Shaggy
+1 mucho mejor que mi monstruosidad .
Oliver
1

Gelatina , 23 20 19 18 bytes

=þ`o\L‘HĊƲ¦UŒBị⁾A 

Pruébalo en línea!

=þ`crea una matriz de identidad de tamaño n.

L‘HĊƲ encuentra el índice de fila de la barra horizontal con ¦ seleccionar esa fila y aplicarla o\para crear la barra.

U invierte cada fila para que no tengamos una "A" invertida y ŒB (palindromizar; vectoriza) hace la segunda mitad de la "A".

ị⁾A(con un espacio que se está recortando en el formato) reemplaza 0s con espacios 1ys con As.

dylnan
fuente
1

T-SQL , 182 177 bytes

DECLARE @n INT=5DECLARE @ INT=0a:DECLARE @s VARCHAR(9)=STR(POWER(10,@),@n)PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@=@n/2,'A',' '))SET @+=1IF @<@n GOTO a

Primera versión (con 182 bytes):

DECLARE @n INT=5DECLARE @ INT=0WHILE @<@n BEGIN DECLARE @s VARCHAR(9)=STR(POWER(10,@),@n)PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@=@n/2,'A',' '))SET @+=1 END

La versión anterior funciona hasta @ n = 9.

Aquí hay otra versión, que funciona hasta @ n = 23, pero tiene 2 bytes adicionales:

DECLARE @n INT=5DECLARE @ INT=0WHILE @<@n BEGIN DECLARE @s VARCHAR(23)=STR(POWER(10.,@),@n)PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@=@n/2,'A',' '))SET @+=1 END

Sin golf:

DECLARE @n INT=5

DECLARE @i INT=0
WHILE @i<@n BEGIN
    DECLARE @s VARCHAR(9)=STR(POWER(10,@i),@n)
    PRINT REPLACE(REPLACE(@s+REVERSE(LEFT(@s,@n-1)),'1','A'),'0',IIF(@i=@n/2,'A',' '))
    SET @i+=1
END
Razvan Socol
fuente
1

Haskell , 98 97 95 bytes y 109 bytes

Dos enfoques muy diferentes. Primero (95 bytes):

c!n=([1..n]>>c)++"A"
f n=unlines[" "!(n-x)++drop 3([" "!(abs$n`div`2-x+1)!!0]!(2*x))|x<-[1..n]]

y segundo (109 bytes):

m True='A'
m _=' '
g n=unlines[[m(abs(n-j)==l||l==q&&elem j[q+1..q+n])|j<-[1..2*n]]|l<-[0..n-1],q<-[n`div`2]]

Pruébalos aquí! ; ¡Pruebe la versión modificada aquí!

¡Prueba la tercera versión aquí!

Radek
fuente
Bienvenido a PPCG! Puede guardar un byte en su primer enfoque definiéndolo lcomo operador infijo .
Laikoni
m True='A'un ser acortado a m b|b='A'.
Laikoni
Resultó que incluso se podían guardar dos bytes. ¡Gracias! :)
Radek
1

Python 2 , 70 bytes o 65 bytes

La lista de cadenas es un resultado aceptable, como @Budd declaró en los comentarios.

lambda n:['%*sA\n'%(n+i,('A'+i*2*' A'[i==n/2])[:-1])for i in range(n)]

Pruébalo en línea!


Solución aparentemente engañosa, usando \b. Se ve funky en TIO, en la consola hace el trabajo.

lambda n:['%*s\bA\n'%(n+i,'A'+i*2*' A'[i==n/2])for i in range(n)]

Pruébalo en línea!

Zarigüeya muerta
fuente
0

Javascript, 124 bytes

Una solución bastante ingenua, le dio una oportunidad para practicar habilidades js.

for(i=-1,p=" ".repeat(n-1)+"A ";++i<n;console.log(i-~~(n/2)?p:p.slice(0,i)+"A".repeat(n)),p=p.slice(1,n)+" "+p.slice(n-1)){}

Desempaquetado

for(
 //create the first line
 i=-1, p=" ".repeat(n-1)+"A "; 
 ++i<n;
 console.log( 
 //if we are not at the bar
      i-~~(n/2)?
 //otherwise, use the modified previous line
      p
 //slice the start of the previous line and add As
      :p.slice(0,i)+"A".repeat(n)), 
 //add a space in between the previous line and remove padding on each side
 p=p.slice(1,n)+" "+p.slice(n-1)){}
Budd
fuente
0

Python 3 , 93 , 88 bytes

lambda n:'\n'.join(f"{'A'+(x>0)*('A '[x!=n//2]*(x*2-1)+'A'):^{n*2-1}}"for x in range(n))

Pruébalo en línea!

-3 por @ovs usando f-string

Rick Rongen
fuente