Torres Eiffel: Crie um "A" grande a partir de "A" s

20

Crie uma função que, dada uma série de linhas n, faça a bigA.

  • A barra horizontal de bigAdeve estar na linha do meio ou a menor das duas, se nfor uniforme
  • Suponha uma fonte monoespaçada para saída

A saída deve ser uma string (ou similar, por exemplo, matriz de caracteres) com quebras de linha claras para quebrar as linhas e com espaço em branco correto para preenchimento à esquerda (você pode assumir que \ t são 4 espaços). Pode haver qualquer espaço em branco à direita.

Exemplos

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

Isso é inspirado em Criar um "H" a partir de "H" s menores

Budd
fonte
Posso adicionar espaço em branco no lado direito? Além disso, a nova linha à direita é permitida?
quer
@Bblbler, Qualquer espaço em branco no lado direito é bom, mas não há nenhuma nova linha à direita #
Budd
É permitido retornar matrizes de caracteres 2D em vez de strings? (dica: geralmente é recomendável permitir qualquer tipo de saída)
Olivier Grégoire
1
@ OlivierGrégoire Claro, desde que haja uma quebra clara das linhas (por exemplo, um elemento "\ n", matrizes aninhadas) #
Budd
1
@TonHospel, Não, isso realmente derrota a finalidade disso #
Budd

Respostas:

12

05AB1E , 13 bytes

Código:

Ð;î¹)'A1376SΛ

Usa a codificação 05AB1E . Experimente online!

Explicação:

Ð                  # 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.

Tela de pintura

Provavelmente eu deveria documentar a tela um pouco mais (e muitas outras funções), mas isso basicamente resume tudo. A tela possui 'modos' diferentes, com base nos tipos de parâmetros fornecidos. O comando canvas possui três parâmetros: <length> <string> <direction> .

Como os parâmetros de comprimento e direção são listas, ele 'fecha' essas listas para criar um conjunto de instruções a serem executadas. O parâmetro string é apenas a letra A , portanto, esse é o caractere de preenchimento usado por todas as instruções. A tela interpreta isso como o seguinte conjunto de instruções (para a entrada 7):

  • Desenhe uma linha de comprimento 7 com a corda A na direção
  • Desenhe uma linha de comprimento 7 com a corda A na direção
  • Desenhe uma linha de comprimento 4 com a corda A na direção
  • Desenhe uma linha de comprimento 7 com a corda A na direção

As instruções são traduzidas da seguinte maneira:

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

Se nada foi emitido, 05AB1E gera automaticamente o resultado da tela.

Adnan
fonte
1
Muito obrigado pela explicação tela, que é uma característica brilhante :-)
Kaldo
TIL triplicado é uma palavra
Quintec
@ thecoder16 quadruplicado, quintuplicado, ..., decuplicate
Magia Octopus Urna
Uau. Eu duvidava de não duplicar, mas existe como todos os outros. Claro que temos essas palavras inúteis em Inglês xD
Quintec
1
@KevinCruijssen Ei, desculpas por todas as respostas tardias, tem sido incrivelmente ocupado para mim nas últimas duas semanas (eu só consegui dormir 8 horas nas últimas 72 horas haha), então eu não acho que posso fazer isso agora, mas fique à vontade para adicioná-lo à página de dicas, se desejar.
Adnan
6

Carvão , 17 15 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

Nθ

Entrada n.

P×θA

Imprima a barra horizontal do grande A. (Para números pares, o n+1th se sobrepõe ao lado direito.)

M⊘θ↗

Mover para o topo do grande A.

P^×θA

Imprima ambos os lados do grande A.

Neil
fonte
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))

Experimente online!

Divida a saída desejada no espaço em branco esquerdo, no espaço em branco Amais a esquerda ou no meio Ae na direita A. Calcule a parte do meio usando fatias em uma sequência fixa. Isso permite usar da mesma maneira para gerar a primeira linha.

Bubbler
fonte
4

Stax , 15 bytes

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

Execute e depure

Descompactado, não jogado e comentado, o programa se parece com isso.

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)

Execute este

recursivo
fonte
4

JavaScript (ES6), 77 bytes

Este código-fonte tem uma forma de retângulo ! Oh espere ... desafio errado: - /

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

Experimente online!

Arnauld
fonte
4

Python 3.6 , 79 bytes ou 73 bytes

Usando as strings f para alinhar partes horizontais da letra:

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

Com \busado para excluir um A(possivelmente trapaça):

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

Java (JDK 10) , 124 bytes

n->{var a=new char[n][n+n-1];for(int c=n,r;c-->0;)for(r=n;r-->0;)a[r][n+n-c-2]=a[r][c]+=r==n/2&c>=r|r==n+~c?65:32;return a;}

Experimente online!

Olivier Grégoire
fonte
3

J , 65 bytes

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

Experimente online!

Pode ser reduzido em aprox. 12 bytes, simplesmente tornando o verbo tácito, mas tenho problemas para fazê-lo.

Explicação:

3 : '...' denota um verbo explícito de uma linha

y é o argumento

=/~@i. cria uma matriz de identidade com o tamanho do argumento

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

([:(}:@|."1,.]) precede a matriz de identidade com sua cópia espelhada com os últimos elementos de cada linha eliminados.

    ]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(...)}(...) muda para 1 as posições em seu argumento certo, selecionado pelo esquerdo

([:(<@;]+i.@+:)<.@-:) - prepara a seleção, fazendo o seguinte:

               <.@-: - 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'{~ torna um espaço nos lugares de 0 e 'A' onde há 1

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

Ruby , 66 bytes

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

Experimente online!

Retorna como matriz de linhas

Kirill L.
fonte
2

SOGL V0.12 , 12 bytes

 A*:╚╥≤.»I:ž

Experimente aqui!

Explicação:

 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
fonte
2

Japonês -R , 20 19 bytes

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

Tente


Explicação

                        :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

Alternativo

(Na esperança de que isso possa me ajudar a identificar algumas economias!)

Æ'AúXÄ" A"gX¶Uz¹êÃû
Shaggy
fonte
1
Outra alternativa que é mais um byte:ç h'AUz)¬íp ®i'A êÃû
ETHproductions
@ETHproductions Substitua p por ²e também tem 19 bytes.
Shaggy
+1 muito melhor que minha monstruosidade .
Oliver
1

Geléia , 23 20 19 18 bytes

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

Experimente online!

=þ` cria uma matriz de identidade de tamanho n .

L‘HĊƲlocaliza o índice de linha da barra horizontal ¦escolhendo essa linha e aplicando o\a ela que cria a barra.

Uinverte cada linha para que não tenhamos um "A" invertido e ŒB(palindromize; vetoriza) forma a segunda metade do "A".

ị⁾A(com um espaço que está sendo cortado na formatação) substitui 0s por espaços e 1s por As.

dylnan
fonte
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

Primeira versão (com 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

A versão acima funciona até @ n = 9.

Aqui está outra versão, que funciona até @ n = 23, mas possui 2 bytes extras:

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

Ungolfed:

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
fonte
1

Haskell , 98 97 95 bytes e 109 bytes

Duas abordagens muito diferentes. Primeiro (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]]

e 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]]

Experimente aqui! ; Experimente a versão modificada aqui!

Experimente a terceira versão aqui!

Radek
fonte
Bem-vindo ao PPCG! Você pode salvar um byte em sua primeira abordagem, definindo lcomo operador infix .
Laikoni
m True='A'um ser encurtado para m b|b='A'.
Laikoni
Acabou que mesmo dois bytes poderiam ser salvos. Obrigado! :)
Radek
1

Python 2 , 70 bytes ou 65 bytes

A lista de strings é um resultado aceitável, como @Budd afirmou nos comentários.

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

Experimente online!


Solução aparentemente barata, usando \b. Parece divertido no TIO, no console ele faz o trabalho.

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

Experimente online!

Gambá morto
fonte
0

Javascript, 124 bytes

Uma solução bastante ingênua, deu a chance de praticar as habilidades de 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)){}

Desembalado

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
fonte
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))

Experimente online!

-3 por @ovs usando f-string

Rick Rongen
fonte